728x90

테스팅은 소프트웨어가 예상한대로 실행 되는지 검증하고 확인하는 과정

  • 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에 추가하는건 이렇게 새로 하나 만들어주면 됨.

728x90

'코딩 > 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

+ Recent posts