테스팅은 소프트웨어가 예상한대로 실행 되는지 검증하고 확인하는 과정
- QA (Quality Assurance): 미리 버그를 발견해서 프로덕션 환경에서 문제가 생기는걸 방지한다.
- 더욱 빠른 리팩터링: 변경한 코드가 기존 로직에서 문제를 일으킬경우 미리 알 수 있다.
- 다큐멘테이션 역할: 테스트 자체가 코드가 어떻게 동작해야하는지 설명하는 하나의 문서 역학을 한다.
- 코드 로직 검증 자동화: 테스트 코드를 실행해서 로직 검증을 자동화하여 직접 프로그램을 테스트 할 필요가 없어진다.
- 테스팅의 종류
- Unit Testing(단위 테스트): 함수나 클래스처럼 가장 작은 단위의 로직을 "독립적으로" 테스트한다.
- Intergration Testing(통합 테스트): 데이터베이스등 다양한 서비스의 요소들을 함께 실행 했을때 문제가 없는지 확인한다.
- End to End Testing(e2e 테스트): 사용자의 관점에서 서비스를 사용 했을때 프로그램이 정상적으로 작동하는지 확인한다.
- 테스트 하지 않는 것들
- 프레임 워크 기능
근본적으로 프레임워크 자체적으로 유닛테스트가 있을거란 가정을 한다. 예를들어 NestJS의 UseGuard Annotation이 잘 작동하는지 테스트 하지 않는다. NestJS 프레임워크에서 테스트가 잘 됐을거라고 가정한다. 그럼에도 정말 하고 싶다면 절대로 하면 안되는건 아니다.
- 외부 디펜던시
낮은 수준의 테스트일수록 (Unit Test, Integration Test) TypeORM, Logger등 외부 디펜던시가 잘 작동하는지 테스트 하지 않는다. 대신 Mock, Stub, Fake를 사용해서 기능을 모방하고 살제 내 코드상의 중요한 로직을 테스트한다. 근본적으로 내 코드가 아니면 테스트 하지 않는다.
- 퍼포먼스
퍼포먼스 테스트는 보통 다른 로드테스트 툴을 사용해서 진행한다. Unit Test, Integration Test, End to End Test 등은 근본적으로 로직의 정상 작동 여부를 테스트한다. 퍼포먼스와 로드 테스트는 따로 진행하도록 한다.
- 로직이 없는 코드
초보자들이 coverage를 올리기 위해 흔히 하는 실수다. NestJS를 예를들면 Dto나 Entity를 테스트 할 필요 없다. 그냥 ignore 리스트에 넣어버리자.
- 초기 세팅
yarn test
실행해보면 src로 시작하는거 못찾는다는 오류가 발생.
nest g resource로 생성된 spec 파일들에서 발생하는 문제인데, 세팅을 해줘야함.
// package.json
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
package.json에서 jest에 해당되는 내용을 위에서 아래처럼 변경
// package.json
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"roots": [
"src"
],
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"coveragePathIgnorePatterns": [
"module.ts",
"dto.ts",
"entity.ts"
],
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "./coverage",
"testEnvironment": "node",
"moduleNameMapper": {
"src/(.*)": "<rootDir>/src/$1"
}
}
rootDir을 root 배열로 변경,
coverageDirectory를 현재 위치로 변경,
moduleNameMapper를 통해 모듈 쉽게 가져오도록 설정
+ coveragePathIgnorePatterns를 추가해서 test가 필요없는 module, dto, entity등을 넣어주기
+ coverage에서 제외하고 싶은 부분은 위에 아래의 주석을 달아주기
/* istanbul ignore next */
+ 특정 path만 테스트 하고 커버리지 만드는 명령어 만들기
"scripts": {
"test:user": "jest --testPathPattern=src/user --coverage --collectCoverageFrom=src/user/**"
},
scripts에 이런식으로 추가
+ 변경 저장할 때 마다 test 자동 재실행
"test:watch": "jest --watch",
이렇게 기본 명령어 있음.
"test:user:watch": "jest --watch --testPathPattern=src/user --coverage --collectCoverageFrom=src/user/**"
특정 path에 추가하는건 이렇게 새로 하나 만들어주면 됨.
'코딩 > Nest.js' 카테고리의 다른 글
Testing - Integration Test (통합 테스트) (0) | 2024.11.09 |
---|---|
Testing - Unit Test (단위 테스트) (0) | 2024.11.05 |
Swagger 2 (0) | 2024.10.27 |
Versioning (0) | 2024.10.27 |
Logging (2) | 2024.10.26 |