테스트 코드_jest

김지혜·2023년 8월 24일
0

🚧 테스트 코드_jest

: Just(테스트 프레임워크)

  • Jest란 코드가 제대로 동작하는지 확인하는 Test Case 를 만드는 페이스북이 개발한 'JS 테스팅 프레임워크'
    (Test Case: 소프트웨어의 특정 기능, 모듈, 또는 코드 조각이 올바르게 동작하는지를 확인하기 위해 설계된 테스트의 단위)

  • 일반적으로 React 응용 프로그램을 포함하여 JavaScript 코드를 테스트하는 데 사용

  • Jest는 테스트 환경, 어설션 라이브러리 및 테스트 작성 및 실행을 위한 다양한 유틸리티를 제공


  1. 테스트 환경 제공:
  • DOM과 같은 브라우저 환경을 시뮬레이트하여 웹 애플리케이션의 테스트도 수행할 수 있다.
  1. 어설션(assertion) 라이브러리:
  • 코드의 동작이 예상대로 수행되는지 확인하기 위해 사용된다.
  • 코드가 기대한대로 동작하지 않을 때 테스트를 실패로 표시한다. (Jest에 내장)
  1. 테스트 작성 및 실행 유틸리티:
  • 테스트 스위트와 테스트 케이스를 만들고, 비동기 코드를 테스트한다.
  • 모의(mock) 객체를 생성하여 의존성을 관리하는 등의 작업을 할 수 있도록 도와준다.
  1. 자동화된 모의(mock) 및 스파이(spy)
  • 다른 모듈과의 상호 작용을 테스트하거나 호출된 함수의 호출 여부 등을 모의 객체를 통해 감시한다.

🚧 jest 실습

-> layered architecture pattern

1. 모듈 설치

Jest 터미널 설정

npm init -y 
npm i jest -D

spec.js 파일


=> 일반 js 파일과 달리 테스트 모드 실행 파일은 다르게 표시된다.


-> layered architecture pattern

npm install
npm i jest supertest -D

2. Jest 설정_jest.config.js

EX.

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

3. Jest CLI script 설정_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"
  },

scripts에 설정 코드를 작성한다.

window의 경우

"test:integration": "set NODE_ENV=test jest __tests__/integration --forceExit"

=> set NODE_ENV=test로 작성하는 것이 오류가 안 난다.


4. Globla Jest 문법의 실행 순서

파일 설정: tests/grammers/grammers.spec.js

모듈 설치

npx jest __tests__/integation --forceExit --silent
npx jset -verbose

자주 사용하는 Mock expect 문법

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

오류 발생 시

-> Jest는 변경된 파일만 테스트하려고 시도
=> 프로젝트를 Git 저장소로 초기화하거나 변경된 파일들을 모두 커밋한 후에 테스트를 실행할 수 있다.

  1. Git 초기화(저장소가 아닌 경우)
git init
  1. 변경된 파일들을 스테이징하고 커밋
git add .
git commit -m "Initial commit"
  1. Jest 실행 (모든 테스트 실행)
npx jest

5. Repository Layer 단위 테스트

Sequelize Model 의존성 주입

  • DB를 Mocking

    • PostRepository 클래스에서 사용하는 Posts 모델을 Mocking 할 수 없어 실제 DB가 계속 연결되어 있는 상태를 가지고 있는다.
      => DB를 Mocking X

    • PostRepository 클래스에서 사용하는 Posts 모델을 모듈에서 가져와 바로 사용하는 것이 아닌,
      => 외부에서 해당하는 모델을 주입하도록 변경하여야 함

repositories/posts.repository.js
Posts 모델을 가져오는 것이 아닌
-> 생성자에서 PostsModel을 전달 받도록 수정

class PostRepository {
  constructor(postModel) {
    this.postModel = postModel;
  }

  findAllPost = async () => {
    const posts = await 'this.postModel'.findAll();

    return posts;
  };

생성자에서 PostsModel을 전달 받도록 수정

class PostRepository {
  constructor(postModel) {
    this.postModel = postModel;
  }

Posts -> this.postModel

services/posts.service.js
posts.service.js에서 PostRepository의 생성자를 호출할 때
-> Posts 모델을 삽입하여 의존성을 생성자 주입하도록 수정

const PostRepository = require('../repositories/posts.repository');

'const { Posts } = require("../models/index.js");'

class PostService {
  postRepository = new PostRepository(Posts);

  ...
}

0개의 댓글