본문 바로가기
Language/Node.js

[JEST] 테스팅 프레임워크 JEST

by 노믹 2022. 12. 29.

Jest는 출시한지 얼마 지나지 않아 주목받았는데요, 페이스북에서 개발한 프론트엔드 라이브러리인 React.js와도 궁합이 아주 좋기 때문에 엄청난 성장세를 보이며 2020년 기준 JavaScript 개발자들 사이에서 가장 많이 사용되는 테스팅 프레임워크로 뽑혔습니다.

 

  • Jest는 다른 테스팅 프레임워크와 비교하면 여러가지 장점이 있지만, 그 중 가장 제일이라고 생각되는것은 테스트 코드의 표현이 다른 프레임워크보다 훨씬 간결합니다.

 

Jest Configs 설정하기

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

 

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

// jest.config.js

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

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

 

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

  • --forceExit
    • 테스트 코드 검사가 완료되었을 때, 강제로 Jest를 종료합니다.
    • express의 app 객체와 Sequelize 연결이 Connect상태로 남아있어 테스트 코드가 종료되지 않을 때 사용합니다.
  • --silent
    • 테스트 코드를 실행했을 때, console.log와 같은 메시지를 출력하지 않습니다.
  • --coverage
    • 테스트 코드 검사가 완료된 후 현재 프로젝트의 테스트 코드 커버리지를 출력해줍니다.
  • --verbose
    • 테스트 코드의 개별 테스트 결과를 표시해줍니다.

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

 

자주 사용하는 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이라는 가짜 객체를 사용하게 됩니다.

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

예를들어 Repository Layer에서 테스트 코드를 실행할 때 마다 DB에 접근하여 매번 새로운 데이터를 생성하거나, 삭제한다면 좋지 않은 방법일것입니다.

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

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

자주 사용하는 Mock expect 문법

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

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

 

 

 

 

'Language > Node.js' 카테고리의 다른 글

[JEST] Supertest  (0) 2022.12.29
[JEST] 테스트 코드  (0) 2022.12.29
계층형 아키텍처 패턴 (Layered Architecture Pattern)  (0) 2022.12.27
아키텍처 패턴 (Architecture Pattern)  (0) 2022.12.27
도메인 (Domain)  (0) 2022.12.27