본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 5. · 67 Views
Express 테스트 전략 완벽 가이드
Express.js 애플리케이션의 효과적인 테스트 전략을 학습합니다. 단위 테스트부터 통합 테스트까지 실전에서 바로 적용 가능한 테스트 패턴을 다룹니다.
들어가며
이 글에서는 Express 테스트 전략 완벽 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- 기본_라우트_테스트
- POST_요청_테스트
- 미들웨어_단위_테스트
- 데이터베이스_모킹
- 에러_핸들링_테스트
- 인증_토큰_테스트
- 비동기_컨트롤러_테스트
- 쿼리_파라미터_테스트
- 파일_업로드_테스트
- 테스트_환경_설정
- 통합_테스트_예제
- 테스트_커버리지_확인
1. 기본 라우트 테스트
개요
Jest와 Supertest를 사용하여 Express 라우트의 기본적인 GET 요청을 테스트하는 방법입니다.
코드 예제
const request = require('supertest');
const app = require('./app');
test('GET /api/users returns 200', async () => {
const response = await request(app).get('/api/users');
expect(response.status).toBe(200);
expect(response.body).toBeInstanceOf(Array);
});
설명
Supertest를 사용하여 HTTP 요청을 시뮬레이션하고, 상태 코드와 응답 데이터 타입을 검증합니다.
2. POST 요청 테스트
개요
데이터를 전송하는 POST 요청의 유효성 검사와 응답을 테스트합니다.
코드 예제
test('POST /api/users creates user', async () => {
const newUser = { name: 'John', email: 'john@test.com' };
const response = await request(app)
.post('/api/users')
.send(newUser);
expect(response.status).toBe(201);
expect(response.body.name).toBe('John');
});
설명
send() 메서드로 요청 본문을 전송하고, 생성된 리소스의 상태 코드와 데이터를 확인합니다.
3. 미들웨어 단위 테스트
개요
Express 미들웨어 함수를 독립적으로 테스트하여 로직의 정확성을 검증합니다.
코드 예제
const authMiddleware = require('./middleware/auth');
test('authMiddleware blocks unauthorized', () => {
const req = { headers: {} };
const res = { status: jest.fn().mockReturnThis(), json: jest.fn() };
const next = jest.fn();
authMiddleware(req, res, next);
expect(res.status).toBeCalledWith(401);
});
설명
Jest의 모킹 기능으로 req, res, next 객체를 생성하여 미들웨어의 동작을 검증합니다.
4. 데이터베이스 모킹
개요
실제 데이터베이스 없이 데이터베이스 연산을 모킹하여 테스트 속도를 높입니다.
코드 예제
jest.mock('./models/User');
const User = require('./models/User');
test('findUser returns mocked data', async () => {
User.findById.mockResolvedValue({ id: 1, name: 'Test' });
const user = await User.findById(1);
expect(user.name).toBe('Test');
});
설명
jest.mock()으로 모델을 모킹하고 mockResolvedValue로 가짜 데이터를 반환하여 독립적인 테스트를 수행합니다.
5. 에러 핸들링 테스트
개요
Express의 에러 핸들러 미들웨어가 예외 상황을 올바르게 처리하는지 테스트합니다.
코드 예제
test('handles 404 errors', async () => {
const response = await request(app).get('/api/notfound');
expect(response.status).toBe(404);
});
test('handles server errors', async () => {
const response = await request(app).get('/api/error');
expect(response.status).toBe(500);
});
설명
존재하지 않는 라우트와 서버 에러 상황을 테스트하여 에러 핸들링의 견고함을 확인합니다.
6. 인증 토큰 테스트
개요
JWT 토큰 기반 인증이 포함된 보호된 라우트를 테스트합니다.
코드 예제
const jwt = require('jsonwebtoken');
test('protected route with valid token', async () => {
const token = jwt.sign({ userId: 1 }, 'secret');
const response = await request(app)
.get('/api/protected')
.set('Authorization', `Bearer ${token}`);
expect(response.status).toBe(200);
});
설명
실제 JWT 토큰을 생성하여 헤더에 포함시키고, 인증이 필요한 엔드포인트의 접근을 테스트합니다.
7. 비동기 컨트롤러 테스트
개요
async/await를 사용하는 비동기 컨트롤러 함수의 동작을 검증합니다.
코드 예제
const { getUsers } = require('./controllers/userController');
test('getUsers returns user list', async () => {
const req = {};
const res = { json: jest.fn() };
await getUsers(req, res);
expect(res.json).toHaveBeenCalled();
});
설명
컨트롤러 함수를 직접 호출하고 모킹된 응답 객체로 결과를 검증하여 단위 테스트를 수행합니다.
8. 쿼리 파라미터 테스트
개요
URL 쿼리 파라미터를 사용하는 필터링 및 페이지네이션 로직을 테스트합니다.
코드 예제
test('filters users by query params', async () => {
const response = await request(app)
.get('/api/users')
.query({ role: 'admin', page: 2 });
expect(response.status).toBe(200);
expect(response.body.page).toBe(2);
});
설명
query() 메서드로 쿼리 파라미터를 전달하고, 서버가 올바르게 필터링하여 응답하는지 확인합니다.
9. 파일 업로드 테스트
개요
Multer를 사용한 파일 업로드 기능의 정상 동작을 검증합니다.
코드 예제
test('uploads file successfully', async () => {
const response = await request(app)
.post('/api/upload')
.attach('file', 'test/fixtures/sample.jpg');
expect(response.status).toBe(200);
expect(response.body.filename).toBeDefined();
});
설명
attach() 메서드로 실제 파일을 업로드하고, 서버가 파일을 정상적으로 처리했는지 확인합니다.
10. 테스트 환경 설정
개요
프로덕션 환경과 분리된 테스트 전용 환경을 구성하는 방법입니다.
코드 예제
// jest.config.js
module.exports = {
testEnvironment: 'node',
setupFilesAfterEnv: ['./test/setup.js'],
coveragePathIgnorePatterns: ['/node_modules/'],
testMatch: ['**/__tests__/**/*.test.js']
};
설명
Jest 설정 파일로 테스트 환경을 정의하고, 테스트 실행 전 초기화 스크립트와 커버리지 제외 경로를 지정합니다.
11. 통합 테스트 예제
개요
여러 레이어(라우트-컨트롤러-DB)를 함께 테스트하는 통합 테스트를 작성합니다.
코드 예제
beforeAll(async () => await db.connect());
afterAll(async () => await db.close());
test('full user registration flow', async () => {
const res = await request(app)
.post('/api/register')
.send({ email: 'test@test.com', password: '1234' });
expect(res.status).toBe(201);
});
설명
실제 데이터베이스 연결을 사용하여 전체 사용자 등록 플로우를 테스트하고, 테스트 전후로 DB를 설정/정리합니다.
12. 테스트 커버리지 확인
개요
Jest의 커버리지 리포트를 활용하여 테스트되지 않은 코드를 찾아냅니다.
코드 예제
// package.json
{
"scripts": {
"test": "jest",
"test:coverage": "jest --coverage",
"test:watch": "jest --watch"
}
}
설명
npm 스크립트로 다양한 테스트 명령을 정의하고, --coverage 플래그로 코드 커버리지 리포트를 생성합니다. --- 이 카드 뉴스는 Express.js 테스트의 핵심 개념을 단계별로 다루며, 실전에서 바로 활용할 수 있는 패턴들을 포함하고 있습니다.
마치며
이번 글에서는 Express 테스트 전략 완벽 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#Express #Jest #Testing #Integration #UnitTest
이 카드뉴스가 포함된 코스
댓글 (0)
함께 보면 좋은 카드 뉴스
AI 에이전트 신뢰성 완벽 가이드 - 가드레일과 평가 시스템
AI 에이전트가 예상치 못한 행동을 하지 않도록 안전장치를 설계하고, 품질을 체계적으로 평가하는 방법을 배웁니다. 실무에서 바로 적용할 수 있는 가드레일 패턴과 평가 프레임워크를 다룹니다.
Flutter Flame 게임 테스팅과 디버깅 완벽 가이드
Flutter와 Flame 엔진으로 개발한 게임의 품질을 보장하는 테스팅 기법과 디버깅 도구를 다룹니다. 단위 테스트부터 골든 테스트, 크래시 리포팅까지 실무에서 바로 적용할 수 있는 내용을 담았습니다.
실전 프로젝트 커스텀 채널 추가하기
확장 가능한 메시징 시스템에 새로운 채널을 추가하는 방법을 실전 프로젝트로 배웁니다. 어댑터 패턴을 활용한 채널 설계부터 테스트, 배포까지 전 과정을 다룹니다.
테스트 전략 완벽 가이드
초급 개발자를 위한 테스트 전략의 모든 것을 다룹니다. Vitest부터 단위 테스트, 통합 테스트, E2E 테스트까지 실무에서 바로 적용할 수 있는 테스트 작성법을 배워봅니다.
Cron과 Webhooks 완벽 가이드
Node.js 환경에서 자동화의 핵심인 Cron 작업과 Webhooks를 활용하는 방법을 다룹니다. 정기적인 작업 스케줄링부터 외부 서비스 연동까지, 실무에서 바로 적용할 수 있는 자동화 기법을 배워봅니다.