donghakim.dev — zsh
← ls ../blog

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-classesFooTest$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! 가 나면 그 위 로그부터 봅니다.

  1. testCompile 이 "No sources to compile" → 빌드 컨텍스트에서 src/test/ 가 빠진 것입니다. .dockerignore 가 테스트 소스를 제외하고 있을 때 이렇게 나옵니다.
  2. 컴파일은 됐는데 Tests run: 0 → 이 글의 경우입니다. -Dtest 패턴이 $ 내부 클래스를 못 잡은 것이니 와일드카드를 붙입니다.
#ci#docker#junit#maven#surefire#troubleshooting