테스트 규칙 정리
테스트에서 규칙 정의가 필요한 항목
Section titled “테스트에서 규칙 정의가 필요한 항목”dictionary-app(vitest)과 dictionary-api(JUnit5 + Mockito + RestAssured + Jacoco) 저장소에서
사용 중인 규칙을 기준으로 정리한다.
- 단위 테스트 작성 규칙
- 통합 테스트 작성 규칙
- 테스트 커버리지 기준
- 테스트 데이터 관리 규칙
- CI 테스트 자동화 규칙
단위 테스트 작성 규칙
Section titled “단위 테스트 작성 규칙”- 백엔드: 순수 로직/DTO/엔티티는 JUnit5로, Service는
Mockito(
@ExtendWith(MockitoExtension.class))로 리포지토리를 목(mock) 처리해 검증한다 — 정상 흐름의 리포지토리 위임 결과와, 예외 발생 시BizException으로 감싸지는지(codeApiResult값)를 함께 확인한다. - 프런트엔드:
tests/디렉토리에src/utils의 순수 함수만을 대상으로 vitest 테스트를 작성한다(예-tests/utils/array.test.ts). 컴포넌트/훅 단위 테스트는 아직 도입돼 있지 않다. - 외부 API 클라이언트(
RestClient기반)는MockRestServiceServer로 요청 구성과 응답 파싱만 검증하는 순수 단위테스트로 커버한다 — 실제 네트워크 호출은 하지 않는다.
통합 테스트 작성 규칙
Section titled “통합 테스트 작성 규칙”- Repository는
@DataJpaTest+@ActiveProfiles("test")+@AutoConfigureTestDatabase(replace = NONE)(Flyway로 세팅된 실제 H2를 그대로 사용) +@Import(QuerydslConfig.class)(QueryDslJPAQueryFactory빈 주입)로 슬라이스 테스트한다. - Controller는
@SpringBootTest(RANDOM_PORT)+test프로파일을 쓰는 공통 베이스 (AbstractRestAssured)를 상속해 RestAssured로 실제 HTTP 호출을 검증하는 통합테스트로 커버한다. 로그인이 필요한 API는login()(테스트 전용 사용자로 로그인), 게스트 제한 검증은loginAsGuest()헬퍼를@BeforeEach에서 호출한다. - 실제 외부 API(국립국어원 사전 등)를 진짜로 호출하는 연동 테스트는
@Tag("integration")으로 분리해 별도 태스크로만 수동 실행한다(인터페이스 테스트 규칙 참고).
테스트 커버리지 기준
Section titled “테스트 커버리지 기준”- 백엔드는 Jacoco로 커버리지를 측정한다.
test태스크 완료 후 자동으로jacocoTestReport가 실행되며(finalizedBy), XML/HTML 리포트를 함께 생성한다. - 엔티티 패키지(
biz/mintchoco/dictionary/entity/**)는 단순 데이터 구조라 커버리지 측정 대상에서 제외한다. - 프런트엔드는 아직 커버리지 기준을 별도로 두지 않는다 — 테스트 대상이
src/utils(순수 함수)로 한정돼 있기 때문이다.
테스트 데이터 관리 규칙
Section titled “테스트 데이터 관리 규칙”- 모든 백엔드 테스트는
test프로파일의 H2(인메모리)로 실행된다 — 실행할 때마다 Flyway 마이그레이션이 처음부터 다시 적용되므로 별도로 데이터를 정리할 필요가 없다. - 로그인 상태가 필요한 테스트는 매번 고유한 이메일로 테스트 전용 사용자를 만들어 로그인한다 — 테스트 간 데이터가 서로 간섭하지 않도록 한다.
- 실제 네트워크 호출이 필요한 연동 테스트(
@Tag("integration"))는 하루 호출 제한이 있는 실제 발급 API 키를 사용하므로, 반복 실행 횟수를 신경 써서 관리한다.
CI 테스트 자동화 규칙
Section titled “CI 테스트 자동화 규칙”- 백엔드:
./gradlew test(mock 기반, 네트워크 호출 없음)로 기본 테스트를 실행하고, 외부 API 연동을 실제로 확인할 때만./gradlew integrationTest를 별도로 돌린다. - 프런트엔드:
pnpm test(vitest 전체 실행) 또는pnpm test:watch로 실행한다. - 커밋 전 검증은 pre-commit 훅이 담당한다 — 백엔드는
spotlessCheck(포맷)만, 프런트엔드는lint-staged+pnpm run build(타입체크 포함)까지 검증하며, 어느 쪽도 테스트 스위트 전체를 커밋 훅에서 강제하지는 않는다.