| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 엑셀 프린트하기
- 카카오뷰 탭이동
- 실시간 통신
- 카카오뷰 부업
- 카카오뷰 온라인 수익화
- ppt 다이어그램
- 위드굿즈 굿즈샵
- 웹기초
- 카카오뷰 성장
- ppt 도형 색
- 엑셀 기초 함수
- 이석증
- 도서 원씽
- git 협업하기
- Axios 라이브러리
- 자기관리
- 성공비법
- 위드굿즈
- CSS
- 성공에 대한 거짓말
- 카카오뷰 초보
- express.js 환경 셋팅
- HTML
- Git 팀 작업
- 책 원씽
- 카카오뷰 수익
- 카카오뷰N잡
- 원씽
- 카뷰 수익 인증
- 30일 글쓰기
- Today
- Total
김데이의 개발공부
[ TIL ] Day 84~86 - JEST & SuperTest 실습하기 본문
[ 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 사용방법
- beforeAll() : 전체 테스트 시작 전 딱 한 번 실행
- 반복 구간 (테스트 케이스 개수만큼 반복)
- beforeEach() : 각 테스트(test) 시작 직전마다 실행
- test: 실제 테스트 코드 실행
- afterEach() : 각 테스트 끝난 직후 실행
- 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의 역할 분리 작업
- 테스트 전용 DB 여러 개 생성 (--maxWorkers 옵션에서 셋팅 한 숫자만큼 생성)
- .env.test (또는 테스트용 env 기본값)의 DB 이름을 동적으로 설정
- 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 네트워킹 및 관리 서비스
'코드잇 Node.js(BE) 부트 캠프 > TIL (Today I Learn) 📑' 카테고리의 다른 글
| [ TIL ] Day 88~90 - AWS 사용하기 - EC2, PM2, Nginx, ELB (2) | 2026.02.02 |
|---|---|
| [ TIL ] Day 87 - 클라우드 & AWS (Amazon Web Services) (0) | 2026.01.28 |
| [ TIL ] Day 82, 83 - Express SuperTest 라이브러리 (0) | 2026.01.22 |
| [ TIL ] Day 82 - Jest 프레임 워크 2 "Mock/Spy" 및 여러 개념들 (0) | 2026.01.21 |
| [ TIL ] Day 81 - JEST 프레임워크 사용법 1 (1) | 2026.01.20 |