Skip to content

테스트 규칙 정리

테스트에서 규칙 정의가 필요한 항목

Section titled “테스트에서 규칙 정의가 필요한 항목”

dictionary-app(vitest)과 dictionary-api(JUnit5 + Mockito + RestAssured + Jacoco) 저장소에서 사용 중인 규칙을 기준으로 정리한다.

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