될때까지

((TIL)) 프리온보딩 백엔드 사전스터디 : Node.js 6 본문

프로젝트/프리온보딩

((TIL)) 프리온보딩 백엔드 사전스터디 : Node.js 6

랖니 2022. 9. 28. 22:54
728x90

Unit Test 용어

  • TestCase : Unittest Framework의 테스트 조직의 기본 단위
  • Fixture : 테스트를 진행할 때 필요한 테스트용 데이터 혹은 설정 등을 이야기한다. 주로 테스트가 실행되기 전이나 후에 생긴다.
  • Assertion : Unittest에서 테스트하는 부분이 제대로 됐는지를 확인하는 부분이다.

자바스크립트 테스트 프레임워크 : jest, enzyme, mocha

 

1. 먼저 server.js와 app.js 분리하기

테스트코드를 만들 때 서버는 필요없고 앱만 필요하다.
앱의 routers나 미들웨어 관련 코드는 server에 남겨두고 app을 리턴하는 createApp함수만 app에 생성해주자.
테스트 단계에서는 테스트용 request를 활용하기 때문에 서버를 구동시킬 필요가 없기 때문이다.

 

2. 테스트용 .env설정하기

테스트를 진행할 때 실제 데이터베이스를 사용하면 문제가 발생한다.
(회원탈퇴 기능을 테스트할 때 실제 데이터베이스를 사용한다면 유저 정보 다 날릴 수도 있음)
따라서 테스트 전용 환경변수를 관리하기 위해 .env.test를 만들어서 테스트 환경에 맞는 값을 입력하고 연결해서 사용하자.

jest를 활용해서 테스트를 진행할 때 해당 .env.test파일을 config로 테스트할 수 있도록
package.json scripts에 명령어를 아래와 같이 추가한다.

"scripts": {
    "test": "DOTENV_CONFIG_PATH=.env.test jest --setupFiles=dotenv/config",
  },

 

3. Unit Test 작성하기

npm i --save-dev supertest
npm i --save-dev jest

* supertest : 통합테스트(API의 기능을 테스트)에 사용하는 라이브러리로
내부적으로 익스프레스 서버를 구동시켜 실제 요청을 보낸 뒤 결과를 검증할 수 있다.

const request = require('supertest');   
const { createApp } = require("../app"); // supertest의 request에 app을 담아 활용하기 위해

const { DataSource } = require("typeorm"); // DB와의 커넥션을 위해 DataSource 객체 불러오기

const myDataSource = new DataSource({
    type    : process.env.TYPEORM_CONNECTION,
    host    : process.env.TYPEORM_HOST,
    port    : process.env.TYPEORM_PORT,
    username: process.env.TYPEORM_USERNAME,
    password: process.env.TYPEORM_PASSWORD,
    database: process.env.TYPEORM_DATABASE
})

describe("무슨 테스트할건지 설명 적기", () => {
    let app;

    beforeAll(async () => {
        // 모든 테스트가 시작하기 전에 app 만들고 DB와 연결하기
        app = createApp();
        await myDataSource.initialize();
    })

    afterAll(async () => {
        // 테스트케이스의 불필요한 데이터 전부 지워주기
        await myDataSource.query(`TRUNCATE users;`)

        // 모든 테스트 끝나면 DB 커넥션 끊어주기
        await myDataSource.destroy();
    })

    describe("SignUp Users", () => {
        test("SUCCESS : created user", async () => {
        	// supertest의 request를 활용해서 app에 테스트용 request 보내기
            await request(app)
                .post("/users/signup")
                .send({
                    email : "test_code@naver.com", 
                    password : "abcd!123@"
                })
                .expect(201)
                .expect({message : "보내주는 메세지바디"})
        });
    
        test("FAIL : 이메일이 없습니다.", async () => {
            await request(app)
                .post("/users/signup")
                .send({
                    password : "abcd!123@"
                })
                .expect(400)
                .expect({message : "보내주는 메세지바디"})
        });
})

테스트 실행하기

npm test

테스트 실행 결과

728x90