테스트 코드란?
개발한 코드가 의도한대로 동작하는지 작성하는 코드
1) 단위 테스트(Unit Test): 가장 작은 규모의 기능을 테스트한다.
test(): 단위 테스트를 묶어주는 함수.
expect(): 특정 값이 만족되는지 확인하기 위한 함수(if문)
2) 통합 테스트(Integration Test): 다양한 기능을 합쳤을때 생기는 문제를 방지하기 위한 테스트
3) E2E 테스트(End-to-end Test): 끝에서 끝을 의미하는 테스트. 백엔드부터 시작해서 최종적으로 웹 페이지가 원하는 대로 동작하며 원하는 데이터를 잘 보여주느지.
테스팅 프레임워크 JEST
package.json 파일 수정하기
"type": "module",
"scripts": {
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
},
cross-env
yarn add -D jest cross-env @jest/globals
env실행을 하나로 동일하게 해준다..
"test": "cross-env NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --forceExit",
// jest 일반 실행
"test:silent": "cross-env NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --silent --forceExit",
// jest --forceExit
// 테스트 코드가 완료 되었을 때, 강제로 Jest를 종료한다.
"test:coverage": "cross-env NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --coverage --forceExit",
// jest --silent
// console.log와 같은 메시지가 출력되지 않는다.
"test:unit": "cross-env NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest tests/unit --forceExit"
// jest --coverage
// 테스트 코드 검사가 완료된 후 현재 프로젝트의 테스트 코드 커버리지를 출력해준다.
expect 결괏값 검증하기
.mockReturnValue(value)
- Mock 함수의 반환값을 지정합니다.
**.toBe(value)**
- 입력받은 예상값과 결과값이 일치하는지 비교합니다.
- 만약 객체 인스턴스를 비교하려 한다면, 인스턴스 ID까지 비교하므로 엄격하게 동일한지 검증합니다.
.toEqual(value)
- 입력받은 예상값과 결과값이 일치하는지 비교합니다.
.toMatch(regexp | string)
- 입력받은 문자열이 결과값과 같은지 검증합니다.
- String 또는 정규표현식으로 검증할 수 있습니다.
.toBeTruthy()
- 결과값이
true
인지 검증합니다..toBeInstanceOf(Class)
- 입력받은 예상값과 Class가 동일한 Instance인지 검증합니다.
- Error를 검증할 때 주로 사용합니다.
.toHaveProperty(keyPath, value?)
- 입력받은 객체의 Key와 Value가 일치하는지 검증합니다.
.toMatchObject(object)
- 입력받은 객체와 결과 객체가 일치하는지 검증합니다.
- 만약, 입력받은 객체에는 없지만, 결과 객체에 있는 속성이 있다면 이를 무시하고 일치 여부를 확인합니다.
Global Jest 문법
**afterAll(fn, timeout)**
- 모든test()
가 완료된 이후에 수행됩니다.
- 테스트가 완료된 이후 DB에 변경된 데이터를 삭제하거나 Mock을 초기화 하기 위해 사용됩니다.
**afterEach(fn, timeout)**
- 각
test()
가 완료된 이후에 수행됩니다.- 테스트코드가 완료된 이후 Mock 또는 변경된 전역 변수를 초기화할 때 사용됩니다.
**beforeAll(fn, timeout)**
- 테스트 코드가 실행되기 전 최초로 수행됩니다.
- DB의 데이터를 초기화하거나 전역 Mock을 초기화할 때 사용됩니다.
**beforeEach(fn, timeout)**
- 각
test()
가 실행되기 전에 수행됩니다.- 테스트가 실행되기 전, 동일한 설정을 반복해야할 때 사용됩니다.