노드심화 5-4

·2022년 12월 29일
0

study

목록 보기
44/78
post-thumbnail

Layered Architecture Pattern 테스트 코드 (1)

jest, supertest 모듈 설치

npm i jest supertest -D

Jest Configs 설정하기

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

jest.config.js파일 만들기

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

// jest.config.js

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

Jest Scripts 설정하기

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

package.json 파일에서 Jest CLI 옵션을 추가

// set NODE_ENV=test를 앞에 넣어주면 정확하게 지시됨.
// set NODE_ENV=test jest --forceExit 같이
 "test": "jest --forceExit",
    "test:silent": "jest --silent --forceExit",
    "test:coverage": "jest --coverage --forceExit",
    "test:unit": "jest __tests__/unit --forceExit",
    "test:integration": "jest __tests__/integration --forceExit"

대표적인 Jest CLI Options

  • --forceExit

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

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

    • 테스트 코드 검사가 완료된 후 현재 프로젝트의 테스트 코드 커버리지를 출력해줍니다.

    • --coverage 옵션 이미지

      • **--coverage 설정을 하지 않은 경우**
        • 테스트 파일을 기준으로 결과가 출력됩니다.
      • **--coverage 설정을 한 경우**
        • 현재 프로젝트의 커버리지가 출력됩니다.
  • --verbose

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

    • --verbose 옵션 이미지

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

자주 사용하는 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()실행되기 전에 수행됩니다.
    • 테스트가 실행되기 전, 동일한 설정을 반복해야할 때 사용됩니다.

Mock Functions

Mock이란 특정 Method를 Mocking하기 위해 사용됩니다.
즉, 테스트에서 시간 또는 비용이 많이들거나 의존성이 있는 코드를 실제로 실행하지 않고 호출 여부, 입력한 값의 일치 여부와 같은 정보를 확인하기 위해 사용하는 가짜 객체입니다.

테스트를 하기 위해 매번 DB에 접근하여 데이터를 수정하거나, SMS 전송과 같은 비용이 발생하는 작업을 반복할 수 없습니다.
코드를 실행했을 때 문제가 발생하거나 로직을 검사하는데 방해가 되는 코드를 실제로 실행한 것 처럼 변경하기 위해서 저희는 Mock이라는 가짜 객체를 사용

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

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

자주 사용하는 Mock expect 문법

  • .toHaveBeenCalledTimes(number)
    • Mock이 몇번 호출되었는지 검증합니다.
  • .toHaveBeenCalledWith(arg1, arg2, ...)
    • 어떤 인자를 이용해 Mock이 호출되었는지 검사합니다.
profile
개발자 꿈나무

0개의 댓글