Express 완벽 마스터

Express의 핵심 개념과 실전 활용법

JavaScript중급
6시간
3개 항목
학습 진행률0 / 3 (0%)

학습 항목

1. JavaScript
중급
Express|테스트|전략|완벽|가이드
퀴즈튜토리얼
2. JavaScript
Middleware|활용|완벽|가이드
퀴즈튜토리얼
3. JavaScript
중급
REST|API|실전|프로젝트|완벽|가이드
퀴즈튜토리얼
1 / 3

이미지 로딩 중...

Express 테스트 전략 완벽 가이드 - 슬라이드 1/13

Express 테스트 전략 완벽 가이드

Express.js 애플리케이션의 효과적인 테스트 전략을 학습합니다. 단위 테스트부터 통합 테스트까지 실전에서 바로 적용 가능한 테스트 패턴을 다룹니다.


카테고리:JavaScript
언어:JavaScript
난이도:intermediate
메인 태그:#Express
서브 태그:
#Jest#Testing#Integration#UnitTest

들어가며

이 글에서는 Express 테스트 전략 완벽 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. 기본_라우트_테스트
  2. POST_요청_테스트
  3. 미들웨어_단위_테스트
  4. 데이터베이스_모킹
  5. 에러_핸들링_테스트
  6. 인증_토큰_테스트
  7. 비동기_컨트롤러_테스트
  8. 쿼리_파라미터_테스트
  9. 파일_업로드_테스트
  10. 테스트_환경_설정
  11. 통합_테스트_예제
  12. 테스트_커버리지_확인

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

#Express#Jest#Testing#Integration#UnitTest#JavaScript