0. 개요
[ 내가 TDD를 하게 된 이유 ]
엘리스 2차 프로젝트의 개발 기간은 3주였다. 3주라는 시간 내에 기획과 개발, 배포, 발표 준비를 해야 한다는 부담감에 테스트 코드 작성을 우선순위에서 미루고 바로 비즈니스 로직을 구현했다.
하지만 점점 로직이 쌓이면서 새로운 기능 코드를 작성할 때 기존 코드에 영향을 주지 않고 작성을 해야 하는데 테스트 코드가 없어 내가 생각하지 못한 사이드 이펙트가 터졌다.
'코드 작성 -> 사이드 이팩트 -> 코드 수정 -> 사이드 이팩트 -> 코드 수정' 과정이 반복되니 2가지 불편함이 생겼다.
- 코드 생산성 감소
- 코드에 대한 자신감 하락
내 코드에 대한 자신감이 떨어졌다. 프론트에서 문제가 생겼다고 물어볼 때 백엔드 API 기능의 문제가 없다는 것을 증명하기 어려웠고 나 또한 확신이 부족했다.
따라서 test code는 내 코드가 어떻게 작동하는지 확인함과 동시에 증명해주기도 한다. 그래서 엘리스 마지막 프로젝트에 테스트 코드를 작성한 것에 대한 포스팅을 진행하려 한다.
[ JEST를 사용한 이유 ]
다양한 자바스크립트 테스팅 라이브러리 중에서 jest를 사용한 이유는 이 라이브러리 하나로 Test Runner, Test Mathcher 그리고 Test Mock 프레임워크까지 제공해주기 때문에 편리하다고 판단했다.
1. JEST 설치
supertest는 request 통신을 만들어주어 express 테스트할 때 필요하다.
$ npm install jest ts-jest supertest @types/jest @types/supertest --save-dev
$ yarn add -D jest ts-jest supertest @types/jest @types/supertest
config 파일을 초기화한다.
$ npx ts-jest config:init
jest.config.js 파일이 생기는데 jest.config.ts로 파일명을 수정하고 내용도 다음과 같이 수정했다.
- jest.config.ts
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
collectCoverageFrom: ["src/**/*.ts"],
coverageThreshold: {
global: {
branches: 0,
functions: 0,
lines: 0,
statements: 0,
},
},
moduleDirectories: ["node_modules", "src"],
};
- .eslintrc.js
- package.json
"scripts": {
"test": "jest --setupFiles dotenv/config --config jest.config.js --detectOpenHandles --forceExit",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage"
}
이때 jest --setupFiles dotenv/config 을 넣어주어야 .env(환경변수)를 사용할 수 있다.
2. 테스트 코드 작성
- 폴더 구조
- Jest 파일 구조
- describe: 작은 단위의 테스트 코드를 그룹화할 수 있다.
- test (it): 개별 테스트를 수행하는 곳이다.
- expect: matcher와 같이 사용된다.
- matcher: 값을 테스트
✔️ jest.fn()
: Mock 함수를 생성하는 함수이다.
단위 테스트는 특정 기능만 독립적으로 사용해야 한다.
1) Mock 함수 생성
const mockFunction = jest.fn()
2) Mock 함수 return 값 지정
mockFunction.mockReturnValue("단위 테스트")
console.log(mockFunction)
3) Mock 함수 호출 횟수, return 값 검증
mockFunction('단위테스트')
mockFunction()
expect(mockFunction).toBeCalledWith('단위테스트')
expect(mockFunction).toBeCalledTimes(2)
- 내용이 더 추가될 예정입니다.
'프로젝트 개발 기록 > [개발] node.js | nest, express' 카테고리의 다른 글
[Node.js] Nest.js 폴더 구조 설계하기 (0) | 2022.09.25 |
---|---|
[Node.js] Nest.js에서 프로젝트 시작하기 (0) | 2022.09.14 |
[TypeScript+Express] Redis로 Refresh Token 관리 (0) | 2022.06.21 |
[TypeScript + Express] Error handling (2) | 2022.06.17 |
댓글