surefire -Dtest 필터는 @Nested 안의 테스트를 못 찾는다
@Nested 클래스의 실제 이름이 FooTest$Bar 라서 FooTest 패턴에 안 걸립니다. 와일드카드를 붙입니다
infra · cover image
CI 빌드가 이렇게 죽었습니다.
[INFO] --- surefire:2.22.2:test (default-test) ---
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[ERROR] ... No tests were executed! (Set -DfailIfNoTests=false to ignore this error.)
컴파일이나 의존성 문제는 아니었습니다.
- 같은 커맨드로 다른 테스트는 정상 실행됐습니다. 그쪽은 톱레벨에
@Test가 있었습니다. target/test-classes에FooTest$NestedClass.class도 정상 컴파일돼 있었습니다.
필터 매칭 문제였습니다.
원인
surefire 2.22.2 의 -Dtest 필터는 클래스명 패턴을 매칭하는데, @Nested 테스트의 실제 클래스명은 FooTest$Bar 입니다. FooTest 패턴에 걸리지 않습니다.
톱레벨 @Test 가 하나라도 있으면 그것만 돌아서 문제가 드러나지 않고, 전부 @Nested 안에 있으면 0건이 됩니다.
해결
# @Nested 만 있는 클래스면 0건
mvn test -Dmaven.test.skip=false -Dtest='FlightRequestValidatorTest'
# 내부 클래스까지 매칭
mvn test -Dmaven.test.skip=false -Dtest='FlightRequestValidatorTest*'
Dockerfile 의 CI 테스트 단계가 -Dtest 로 클래스를 명시 나열하는 방식이라, @Nested 구조 테스트를 추가할 때 * 를 붙여 등록합니다.
RUN mvn test -Dmaven.test.skip=false -Dtest='RedisServiceScanKeysTest,FlightRequestValidatorTest*'
같은 에러 메시지의 다른 원인과 구분하기
No tests were executed! 가 나면 그 위 로그부터 봅니다.
- testCompile 이 "No sources to compile" → 빌드 컨텍스트에서
src/test/가 빠진 것입니다..dockerignore가 테스트 소스를 제외하고 있을 때 이렇게 나옵니다. - 컴파일은 됐는데 Tests run: 0 → 이 글의 경우입니다.
-Dtest패턴이$내부 클래스를 못 잡은 것이니 와일드카드를 붙입니다.