Skip to main content
Sonamu의 Vitest 기반 테스트 시스템과 구조를 알아봅니다.

테스트 시스템 개요

Vitest

빠른 테스트 실행Vite 통합

Context 기반

인증 테스트권한 시뮬레이션

Transaction

자동 롤백격리된 테스트

Fixture 시스템

테스트 데이터재사용 가능

Vitest 설정

Sonamu 프로젝트의 테스트 환경은 vitest.config.tsglobal.ts로 구성됩니다.

vitest.config.ts

Sonamu는 getSonamuTestConfig() 함수를 제공하여 테스트 설정을 간편하게 구성할 수 있습니다.
api/vitest.config.ts

getSonamuTestConfig 옵션

getSonamuTestConfig()는 Vitest의 모든 옵션을 지원하며, Sonamu에 최적화된 기본값을 제공합니다.

global.ts 설정

global.ts는 모든 테스트 실행 전에 한 번 실행되는 전역 설정 파일입니다. Sonamu의 setup 함수를 export하여 테스트 환경을 초기화합니다.
api/src/testing/global.ts
export { setup } from "sonamu/test"sonamu.config.tstest 설정을 읽어 병렬 테스트 환경(다중 테스트 DB)을 자동으로 구성합니다.

고급 설정 예시

커스텀 시퀀서나 리포터를 추가한 고급 설정 예시입니다.
api/vitest.config.ts

bootstrap 함수

Sonamu는 bootstrap 함수로 테스트 환경을 초기화합니다.

bootstrap의 역할

주요 기능:
  1. Sonamu 초기화: 테스트 모드로 프레임워크 초기화
  2. Transaction 관리: 각 테스트마다 자동 롤백
  3. 타이머 리셋: Vitest의 fake timers 초기화
  4. 테스트 리포팅: Naite 시스템에 결과 전달

test 함수

Sonamu는 Vitest의 test를 래핑한 커스텀 test 함수를 제공합니다.

기본 사용법

Context 주입

test 함수는 자동으로 Mock Context를 주입합니다.

Mock Context 전체 속성

Mock Context는 실제 Context 타입(src/api/context.ts)을 만족하는 최소 값으로 구성됩니다. 실제 HTTP 요청에서 채워지는 request/reply는 Mock에서 사용되지 않습니다.

기본 속성

인증 관련

Naite 로그

Mock에서 비활성화되는 속성

Context 사용 예제

testAs에서의 Context

커스텀 Context 설정

특수한 경우 Mock Context의 가변 속성을 직접 수정할 수 있습니다:
주의사항:
  1. Mock Context는 테스트용: 실제 HTTP 요청과 다를 수 있음
  2. 세션 유지 안됨: 테스트 종료 시 모든 상태 초기화
  3. Context 수정 비권장: 직접 수정보다 testAs() 사용 권장
Context 속성 요약:
  • 기본: transport, headers, locale
  • 인증: user, session
  • Naite: naiteStore
  • HTTP 전용(Mock 비활성화): request, reply, createSSE

testAs 함수

특정 사용자로 인증된 상태에서 테스트할 수 있습니다.

기본 사용법

권한 테스트

test.skip, test.only, test.todo

Vitest의 기능들을 그대로 사용할 수 있습니다.

test.each

여러 입력값으로 동일한 테스트를 반복할 수 있습니다.

Transaction 자동 롤백

각 테스트는 독립된 Transaction에서 실행되고 자동으로 롤백됩니다.
장점:
  • 테스트 간 격리
  • 데이터 정리 불필요
  • 빠른 실행 (실제 INSERT/DELETE 없음)

테스트 파일 구조

Context 접근

테스트 내에서 Context를 직접 사용할 수 있습니다.

비동기 테스트

모든 테스트는 async 함수여야 합니다.

주의사항

테스트 작성 시 주의사항:
  1. bootstrap(vi) 필수: 테스트 파일마다 호출
  2. async 필수: 모든 테스트 함수는 async
  3. Transaction 기반: 테스트 종료 후 자동 롤백
  4. Context 주입: test/testAs가 자동으로 Context 설정
  5. 격리된 테스트: 테스트 간 의존성 없어야 함

다음 단계

테스트 Scaffolding

자동 테스트 생성

테스트 헬퍼

Fixture와 유틸리티

Vitest 공식 문서

Vitest 가이드

Model System

Model 이해하기