김데이의 개발공부

[ TIL ] Day 84~86 - JEST & SuperTest 실습하기 본문

코드잇 Node.js(BE) 부트 캠프/TIL (Today I Learn) 📑

[ TIL ] Day 84~86 - JEST & SuperTest 실습하기

theday365 2026. 1. 27. 19:27
반응형

🗓️ 수업 일자 : 2026.1.23~27

✨ 오늘의 수업 평가 :  [ PROJECT ]   프로젝트 끝! 하얗게 불태웠다~ 🤍🩶🖤

 

이전 회사 다니면서 기획할 때, 배포 전 테스트 하던게 생각나는 프로젝트였다😶‍🌫️

그때는 스토리 보드 보면서 화면 구성 확인하고, 서비스 항목별로 하나씩 엑셀에 써 가며 테스트 작업 했는데,

이렇게 npm run test!! 하면 되는 게 있다는게 너무 신기방기 할 따름!!! 

 

수업 들을때는 머리가 아팟지만, 그래도 막상 구현해 보니 해볼만 한거 같아서 

다행이다 싶었다~ 🤍🩶🖤

 

 

👩‍💻 [개인 프로젝트] 오늘 작업 내용 💻
- JEST & SuperTest 실습

 

📝  오늘 배운 내용  

- 통합 테스트 vs 유닛 테스트 정리

- Mock vs Spy 정리

- JEST 기본 메서드 정리

- JEST 병렬 처리 

 


1. 통합 테스트 vs 유닛 테스트 정리

1) 통합 테스트

  • 구현 한 'controller - service - repo' 로직을 연결하여 테스트 하는 작업
  • 실제와 동일하게 supertest를 이용해 서버(app)에 요청을 보내고, prismaClient를 통해 DB의 데이터가 사용되는지 확인
  • 장점: 실제 환경과 가장 유사해서 신뢰도가 높음
  • 단점: 테스트 마다 DB에 데이터를 쓰고 지우므로 속도가 느리고, DB에 의존적인 테스트

2) 유닛 테스트

  • DB나 외부 API 같은 외부 의존성을 모두 끊어내고, 오로지 작성한 로직(함수) 그 자체만 테스트
  • 예시 createProduct 함수 : 입력값 검증, 데이터 가공, 결과 반환 유닛 테스트 가능
                                             ⇒ DB에 저장하는 작업은 "가짜(Mock)"로 대체하여 테스트

 

2. Mock vs Spy 정리

 

1) Mock (모의 객체)

  • 개념: 진짜 객체(prismaClient)인 척하는 가짜 객체
  • 역할: "DB에 다녀오지 말고, 그냥 다녀온 척하고 미리 설정 한 데이터를 리턴!"하도록 설정
  • 사용 이유 : DB 연결 없이도 로직이 잘 돌아가는지 검증하기 위함

2) Spy (감시 도구)

  • 개념: 특정 함수가 호출되었는지 감시하는 도구
  • 역할: "내가 구현한 로직 안에서 prisma.product.create 함수가 호출은 되었는지, 어떤 인자(Argument)를 가지고 호출되었는지" 등을 검사
  • 사용 이유 : 결과값 뿐만 아니라, 내부적으로 올바른 흐름을 탔는지 검증

 

 

 

3. JEST 기본 메서드 정리

Hook 사용방법

  1. beforeAll() : 전체 테스트 시작 전 딱 한 번 실행
  2. 반복 구간 (테스트 케이스 개수만큼 반복)
    1. beforeEach() : 각 테스트(test) 시작 직전마다 실행
    2. test: 실제 테스트 코드 실행
    3. afterEach() :  각 테스트 끝난 직후 실행
  3. afterAll() : 모든 테스트가 끝난 후 딱 한 번 실행

 

검증 된 값 확인 메서드 

  • toBe() : 원시값을 비교하거나, 같은 참조인지 확인할 때 사용
  • toEqual() : 객체, 배열, 구조를 비교할 때 사용
  • toMatchObject() : 객체의 일부를 비교 할 때 사용, 중요한 필드만 검사하는 용도
  • toHaveProperty() : 객체에 특정 키가 있는지 확인 할 때 사용.
  • toContain() : 결과로 받은 배열 / 문자열 안에 특정 문자가 포함 되어 있는지 확인
  • toBeDefined() : 값이 어떠한 것이든 있는지 확인하는 용도
  • expect.any(타입) : 값의 타입을 확인 할 때 사용
.toBe()
expect(response.status).toBe(200);

.toEqual()
expect(response.body.tags).toEqual(["개발", "백엔드"]);

.toMatchObject()
expect(response.body).toMatchObject({
  id: 1,
  name: 'test',
});

.toHaveProperty()
expect(response.body).toHaveProperty('user.email');

.toContain()
expect(response.body.message).toContain('로그인 성공');

.toBeDefined()
expect(response.body.token).toBeDefined();

expect.any()
expect(response.body).toEqual({
  id: expect.any(Number),
  createdAt: expect.any(String),
});

 

 

 

4. JEST 병렬 처리 

Jest는 기본적으로 테스트 속도를 높이기 위해 여러 테스트 파일을 동시에 실행

 ⇒ 여러 테스트 파일에서 동시다발적으로 DB에 접근해 deleteMany가 겹치게 되면 DB를 불러오는데 문제가 발생 

 

해결 방법 1) package.json 의 test 호출 명령어에 옵션 추가 

[기존] 
"test": "dotenv -e .env.test -- npm run prisma:migrate && dotenv -e .env.test -- jest",

[변경 : --runInBand] test 실행이 직렬형 처리가 되도록 설정
"test": "dotenv -e .env.test -- npm run prisma:migrate && dotenv -e .env.test -- jest --runInBand",

[변경 : --maxWorkers=2 ] 한번에 실행되는 테스트 갯수 설정
"test": "dotenv -e .env.test -- npm run prisma:migrate && dotenv -e .env.test -- jest --maxWorkers=2",

 

--runInBand 옵션

  • 전체 파일이 알파벳 순으로 순차적으로 실행 되게 하는 방식
  • 파일이 많지 않고 간단한 서비스에선 해당 기능을 사용해 처리 가능 
  • 단, 테스트 시간이 많이 소모됨

--maxWorkers=숫자 옵션

  • 병렬로 실행 될 파일 숫자를 설정
  • 실행 속도를 조절 할 수 있음 
  • 완벽한 분리 테스트는 이루어 지지 않음

 

 

해결 방법 2) TEST DB의 역할 분리 작업

  1. 테스트 전용 DB 여러 개 생성 (--maxWorkers 옵션에서 셋팅 한 숫자만큼 생성)
  2. .env.test (또는 테스트용 env 기본값)의 DB 이름을 동적으로 설정
  3. Jest 실행 시 worker id 기반 DB 선택 & Jest 환경 설정 파일 셋팅
src/lib/db.ts 또는 DB 연결 설정 파일

const workerId = process.env.JEST_WORKER_ID || '1';

const databaseName =
  process.env.NODE_ENV === 'test'
    ? `test_db_${workerId}`
    : process.env.DB_NAME;

const DATABASE_URL = `postgresql://${process.env.DB_USER}:${process.env.DB_PASSWORD}@${process.env.DB_HOST}:${process.env.DB_PORT}/${databaseName}`;
jest.config.json

module.exports = {
  ...
  
  testEnvironment: 'node',
  maxWorkers: 3, // ← 만든 DB 개수와 맞추기
  setupFilesAfterEnv: ['<rootDir>/test/jest.setup.ts'],
  
  ...
};

 

 

개발 화면
개발 화면

 

 


 

📃 내일은 뭘 배울까 🤔

- 클라우드 컴퓨팅과 AWS, GCP, Azure 개론

- AWS 스토리지 및 데이터베이스 다루기

- AWS 네트워킹 및 관리 서비스

반응형