/ E2E \ 소수 — 핵심 사용자 흐름만
/----------\
/ Integration \ 중간 — API, DB, 외부 서비스 경계
/--------------\
/ Unit Tests \ 다수 — 순수 함수, 비즈니스 로직
/------------------\
많은 단위 테스트로 빠른 피드백, 적은 E2E로 핵심 흐름 보장.
Arrange → 테스트 환경 설정, 입력 준비
Act → 테스트 대상 실행
Assert → 결과 검증
it('이메일이 유효하지 않으면 false를 반환한다', () => {
// Arrange
const invalidEmail = 'not-an-email'
// Act
const result = isValidEmail(invalidEmail)
// Assert
expect(result).toBe(false)
})
✅ '이메일이 없으면 에러를 던진다'
✅ 'returns null when user is not found'
❌ 'test1'
❌ 'works correctly'
테스트 하나에 검증 포인트는 하나. 여러 개 검증이 필요하면 테스트 분리.
// ❌ 여러 관심사
it('유저 생성', () => {
expect(user.id).toBeDefined()
expect(user.email).toBe('test@example.com')
expect(sendWelcomeMail).toHaveBeenCalled()
})
// ✅ 분리
it('생성된 유저는 id를 갖는다', ...)
it('생성된 유저의 이메일이 저장된다', ...)
it('유저 생성 시 웰컴 메일을 발송한다', ...)
// ✅ 외부 서비스 mock
jest.mock('../slack/slack.service')
// ❌ 내부 로직까지 과도하게 mock → 테스트 의미 퇴색
jest.mock('../rule/rule.service')
대상 파일과 같은 위치에 .test. 접미사로 배치.
utils/format-date.ts
utils/format-date.test.ts
hooks/use-user.ts
hooks/use-user.test.ts
아직 피드백이 없어요. 첫 번째로 의견을 남겨보세요!