노드 심화_9

·2022년 12월 29일
0

노드 심화

목록 보기
9/9

Layered Architecture Pattern 테스트 코드

1) 모듈 설치

npm i jest supertest -D

2) Jest Configs 설정하기

jest.config.js 파일을 정의하거나, CLI 환경에서 추가적인 옵션을 설정하여 커버리지를 출력하거나, 실시간 모니터링 등 다양한 기능을 사용할 수 있습니다.

  • 특정 경로의 테스트 파일을 무시하고, 모든 Test Case (expect)의 결과값 출력을 설정하였습니다.

Jest Config에 대해 자세히 알고 싶다면 여기를 클릭하세요!

// jest.config.js

module.exports = {
  // 해당 패턴에 일치하는 경로가 존재할 경우 테스트를 하지 않고 넘어갑니다.
  "testPathIgnorePatterns": ["/node_modules/"],
  // 테스트 실행 시 각 TestCase에 대한 출력을 해줍니다.
  verbose: true,
}

3) Jest Scripts 설정하기

Jest CLI는 테스트 코드를 검사할 때 추가적인 옵션을 설정하여 원하는 결과값을 도출할 수 있도록 만들어줍니다.
예를 들어서 테스트 코드의 실시간 모니터링을 진행하거나, 결과값을 별도의 파일로 생성하거나, 테스트 코드의 커버리지를 확인하는 등 다양한 옵션을 설정할 수 있다.

// package.json

{
  ...

  "scripts": {
    ...

    "test": "NODE_ENV=test jest --forceExit",
    "test:silent": "NODE_ENV=test jest --silent --forceExit",
    "test:coverage": "NODE_ENV=test jest --coverage --forceExit",
    "test:unit": "NODE_ENV=test jest __tests__/unit --forceExit",
    "test:integration": "NODE_ENV=test jest __tests__/integration --forceExit"
  },

  ...
}

대표적인 Jest CLI Options

Jest CLI Option에 대해 자세히 알고 싶다면 여기를 클릭하세요!

  • --forceExit

    • 테스트 코드 검사가 완료되었을 때, 강제로 Jest를 종료합니다.
    • expressapp 객체와 Sequelize 연결이 Connect상태로 남아있어 테스트 코드가 종료되지 않을 때 사용합니다.
  • --silent

    • 테스트 코드를 실행했을 때, console.log와 같은 메시지를 출력하지 않습니다.
  • --coverage

    • 테스트 코드 검사가 완료된 후 현재 프로젝트의 테스트 코드 커버리지를 출력해줍니다.
      • **--coverage 설정을 하지 않은 경우**
        테스트 파일을 기준으로 결과가 출력됩니다.
      • **--coverage 설정을 한 경우**
        현재 프로젝트의 커버리지가 출력됩니다.
  • --verbose

    • 테스트 코드의 개별 테스트 결과를 표시해줍니다.

      • **--verbose 옵션 설정을 하지 않은 경우**
        테스트 파일을 기준으로 결과가 출력됩니다.
      • **--verbose 옵션 설정을 한 경우**
        테스트 파일의 test()를 기준으로 결과값이 출력됩니다.
        => 테스트 결과를 명확하게 볼 수 있어 디버깅할 때 유용하게 사용할 수 있습니다.

4) 자주 사용하는 Jest 문법 정리하기

expect 결과값 검증하기

  • **.toBe(value)**
    • 입력받은 결과값과 동일한지 비교합니다.
    • 만약 Instance를 비교하려 한다면, InstanceID까지 비교하므로 엄격하게 동일한지 검증합니다.
  • .toEqual(value)
    • 입력받은 결과값과 동일한지 비교합니다.
  • .toMatch(regexp | string)
    • 입력받은 결과값과 문자열이 같은지 검증합니다.
    • String 또는 정규표현식으로 검증할 수 있습니다.
  • .toBeTruthy()
    • 결과값이 True인지 검증합니다.
  • .toBeInstanceOf(Class)
    • 입력받은 값과 Class가 동일한 Instance인지 검증합니다.
    • Error를 검증할 때 주로 사용합니다.
  • .toHaveProperty(keyPath, value?)
    • 입력받은 객체의 KeyValue가 일치하는지 검증합니다.
  • .toMatchObject(object)
    • 결과값의 객체와 입력받은 객체가 일치하는지 검증합니다.
    • 만약 입력받은 객체에서 없는 속성이 있더라도 일치하게끔 연결합니다.

Global Jest 문법

  • **afterAll(fn, timeout)**
    • 모든 test()완료된 이후에 수행됩니다.
    • 테스트가 완료된 이후 DB에 변경된 데이터를 삭제하거나 Mock을 초기화 하기 위해 사용됩니다.
  • **afterEach(fn, timeout)**
    • test()완료된 이후에 수행됩니다.
    • 테스트코드가 완료된 이후 Mock 또는 변경된 전역 변수를 초기화할 때 사용됩니다.
  • **beforeAll(fn, timeout)**
    • 테스트 코드실행되기 전 가장 처음 수행됩니다.
    • DB의 데이터를 초기화하거나 전역 Mock을 초기화할 때 사용됩니다.
  • **beforeEach(fn, timeout)**
    • test()실행되기 전에 수행됩니다.
    • 테스트가 실행되기 전, 동일한 설정을 반복해야할 때 사용됩니다.

Global Jest 문법의 실행 순서

beforeAll
   at Object.<anonymous> (test/jest-grammars/before-after.spec.test.js:1:45)
 
beforeEach
   at Object.log (test/jest-grammars/before-after.spec.test.js:3:26)
 
test
   at Object.log (test/jest-grammars/before-after.spec.test.js:6:24)
 
afterEach
   at Object.log (test/jest-grammars/before-after.spec.test.js:4:25)
   
   ...
   
afterAll
   at Object.log (test/jest-grammars/before-after.spec.test.js:2:24)

5) Mock Functions ⭐⭐⭐

Mock이란 특정 MethodMocking하기 위해 사용
테스트 코드에서 특정 코드를 실행하지 않고, 원하는 부분만을 테스트하고 싶을 때 실제로 존재하는 값처럼 사용할 수 있도록 만들어놓은 가짜 객체

  • Repository가 사용하는 DB를 Mocking하게 되었을 경우,
    실제 DB에 접근하지 않고도 특정한 값이 입력되었을 때 어떤 결과가 나오는지 임의로 설정하여 DB에 접근했을 때와 동일한 상황을 예상하여 코드를 작성할 수 있게 된다.

  • 또한 Mock된 객체의 특정한 Method가 몇번 호출되었는지, 어떤 값을 전달받았는지, 전달받은 데이터의 형식은 내가 생각한것이 맞는지 등 다양한 조건을 검사할 수 있다.

자주 사용하는 Mock expect 문법

  • .toHaveBeenCalledTimes(number)
    • Mock이 몇번 호출되었는지 검증
  • .toHaveBeenCalledWith(arg1, arg2, ...)
    • 어떤 인자를 이용해 Mock이 호출되었는지 검사
profile
개발자가 되는 과정

0개의 댓글