NestJS

[NestJS] Unit Test

모리스🙂 2025. 4. 9. 01:14

안녕하세요. 모리스입니다.😀

이번 포스트도 지난 포스트에 이어 NestJS입니다.ㅎㅎ

 

모든 소프트웨어의 가장 중요한 것 중 하나가 바로 테스트죠!

개발자가 아무리 똑똑하다 하더라도 사람이기에 실수가 있을 수 있고, 또 최초 기획된 방향과 다르게 개발이 됐을 수도 있어요.

소프트웨어를 개발해 보신 분이라면 QA를 돌면서 이슈가 얼마나 나올까...하는 공포가 몰려오기도 하죠...ㅎ

 

이 처럼 좋은 소프트웨어 제품을 만들기 위해선 테스트가 중요하다고 생각합니다!

이번 주제는 NestJS에서의 Unit Test에 대해서 작성해 보려합니다.

 

그럼 시작하기 앞서 유닛 테스트(Unit Test)가 뭔지는 아주 간단하게 알아보고 가볼게요!

Unit Test
컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차
다. 즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다.

라고 사전에선 말합니다...!!

즉, 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위 테스트예요. 여기서 모듈은 애플리케이션에서 작동하는 기능(함수) 또는 메서드 를 말해요.

대신 통합 테스트가 아니기 때문에 A-Z까지 동작에 대한 테스트를 진행 하는 것이 아닌 A만 동작이 정상적으로 이루어 지는를 테스트 하는 것이예요.

 

그럼 왜 열심히 소프트웨어를 만들어 놓고 전체를 테스트하는 것이 아닌 특정 함수, 메서드만 테스트할까요??

자동차를 예로 들어볼게요. 자동차에는 엔진, 바퀴, 베터리, 창문 모터, 발전기, 에어컨, 히터 등 수 많은 부품이 모여서 만들어지죠.

그런데 각 부품들을 여러 사람이 분담해서 만들고 각 부품을 테스트하지 않고 자동차를 조립해 버렸어요.

제가 앞서 말했듯 사람이 하는 일에는 실수가 있을 수 있어요.

 

조립을 완료한 차량에서 에어컨이 나오지 않는 고장이 나타난다면..

에어컨은 에어컨 혼자 동작하는것이 아닌 엔진의 발전에서 베터리의 전력 공급, 에어컨 콤프레셔의 동작 등등.. 여러 기능들이 복합적으로 동작해야 정상 작동해요.

그럼 에어컨이 안나오는게 에어컨의 문제인지 엔진의 문제인지 베터리의 문제인지를 찾아야하는데,

그런데 이미 조립을 다 해버려서 어디서 부터 어디까지가 고장이 났는지 찾기가 무척 어려울거에요.

 

그럼 반대로 각 부품들이 자신이 맡은 역할에 대한 단위 테스트를 하고 조립을 한다면 어떨까요?

각 기능이 맡은 역할이 정상적으로 수행되지 않으면 조립 전 그 기능만 수정하면 간단하게 해결될 수 있어요.!

 

그래서 유닛 테스트는 소프트웨어의 크기가 커지면 커질 수록 아주아주아주 중요해 진답니다!!

 

휴.. 길고 길었던 서론을 끝내고 이제 본론으로 들어가 보겠습니다.

NestJS에서의 유닛 테스트에 대해서 알아볼게요!

 

🧪 NestJS 유닛 테스트

NestJS에서는 기본적으로 jest라는 JavaScript 테스트 프레임워크를 사용하고 있어요.
NestJS에서 테스트 환경을 구성하려면 @nestjs/testing 패키지를 설치해줘야 해요.

npm i --save-dev @nestjs/testing # npm
# or
yarn add @nestjs/testing --dev   # yarn

설치가 완료되면, NestJS 프로젝트 생성 시 자동으로 만들어지는 *.spec.ts 파일에서 테스트 코드를 작성할 수 있어요.

예시 코드는 아래와 같아요:

import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';

describe('AppController', () => {
  let appController: AppController;

  beforeEach(async () => {
    const app: TestingModule = await Test.createTestingModule({
      controllers: [AppController],
      providers: [AppService],
    }).compile();

    appController = app.get<AppController>(AppController);
  });

  it('should return "Hello World!!"', () => {
    expect(appController.getHello()).toBe('Hello World!!');
  });
});

✅ 설명 정리

  • describe: 테스트 대상을 설명하는 블록이에요.
    위 코드에서는 AppController에 대한 테스트라는 걸 명시하고 있어요.
  • beforeEach: 각 테스트(it)가 실행되기 전에 공통적으로 실행되는 부분이에요.
    여기선 테스트 모듈을 초기화하고, AppController 인스턴스를 주입하고 있어요.
  • it: 실제 테스트가 작성되는 부분이에요.
    "Hello World!!"라는 값을 반환하는지 검증하는 테스트예요.

✅ 예제 시나리오

HelloController라는 컨트롤러가 있고, /hello로 요청을 보내면 "Hello, NestJS!"라는 응답을 주는 아주 단순한 구조예요.

📁 1. 컨트롤러 코드 - hello.controller.ts

import { Controller, Get } from '@nestjs/common';

@Controller('hello') // '/hello' 경로에 대한 요청을 처리하는 컨트롤러
export class HelloController {
  @Get() // HTTP GET 요청에 응답
  getHello(): string {
    return 'Hello, NestJS!'; // 문자열 응답 반환
  }
}

 

📁 2. 테스트 코드 - hello.controller.spec.ts

import { Test, TestingModule } from '@nestjs/testing'; // NestJS의 테스트 유틸 가져오기
import { HelloController } from './hello.controller';

describe('HelloController', () => {
  let helloController: HelloController; // 테스트할 컨트롤러 인스턴스

  // 각 테스트 실행 전마다 실행되는 함수
  beforeEach(async () => {
    // 테스트 모듈 생성 및 컴파일
    const moduleRef: TestingModule = await Test.createTestingModule({
      controllers: [HelloController], // 테스트할 컨트롤러 등록
    }).compile();

    // 컨트롤러 인스턴스를 DI 컨테이너에서 꺼냄
    helloController = moduleRef.get<HelloController>(HelloController);
  });

  // 실제 테스트 케이스
  it('should return "Hello, NestJS!"', () => {
    // 컨트롤러의 getHello 메서드 결과가 기대값과 같은지 확인
    expect(helloController.getHello()).toBe('Hello, NestJS!');
  });
});

 

✅ 테스트 실행

npm run test

실행하면 터미널에 아래와 같은 결과가 뜰 거예요:

 PASS  src/hello/hello.controller.spec.ts
  HelloController
    ✓ should return "Hello, NestJS!" (5 ms)

 

📌 설명 요약

  • Test.createTestingModule(): NestJS 테스트 모듈을 생성하고 컨트롤러를 등록해요.
  • beforeEach(): 매 테스트 전에 컨트롤러 인스턴스를 새로 생성해요.
  • it(): 실제로 메서드가 예상한 문자열을 반환하는지 검증해요.

 

잘 못되었거나 수정할 부분이 있다면 언제든 댓글로 혼내주시길 바랍니다.!!

오늘도 긴 글 읽어주셔서 감사합니다.😊

 

'NestJS' 카테고리의 다른 글

[NestJS] HMR  (0) 2025.04.09
[NestJS] 시작하기  (0) 2025.04.09
[NestJS] 알아보기  (0) 2025.04.09