Maven YAML流水线未执行现有测试用例的问题求助
我最近碰到个棘手的问题:在YAML流水线里用Maven跑测试时,mvn test总是跳过已经编译好的测试用例。下面是我的流水线配置,麻烦重点看下test-job部分:
default: image: maven:latest before_script: - apt-get update - apt-get -y install make test-job: stage: test script: - mvn compile test-compile - mvn -X test artifacts: reports: junit: - target/surefire-reports/*.xml paths: - target/ rules: - if: '$CI_COMMIT_BRANCH == "main"'
本地执行测试的结果
在我本地运行mvn test时,测试是能正常执行的——虽然有失败和错误,但至少测试跑起来了:
[ERROR] Failures:
[ERROR] ForwardTest.movingForwardChangesPositionTest:145->movingForwardChangesPosition:177 expected: <1> but was: <0>
[ERROR] LaunchTest.canLaunchAnotherRobot:268 expected:but was:
[ERROR] LookAroundTest.RobotSeesObstacleAndThreeRobotsTest:266->RobotSeesObstacleAndThreeRobots:289 R1 failed to launch ==> expected:but was:
[ERROR] Errors:
[ERROR] LaunchTest.launchRobotsIntoWorldWithObject:316 NullPointer Cannot invoke "com....
[INFO]
[ERROR] Tests run: 59, Failures: 3, Errors: 1, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:19 min
[INFO] Finished at: 2025-07-15T19:17:04+02:00
[INFO] ------------------------------------------------------------------------
流水线执行测试的异常情况
但流水线运行时,测试完全没执行——显示0测试运行。我加了-X参数看debug日志,能看到类路径里确实包含了target/test-classes目录,JUnit相关依赖也都在,但就是没有测试被发现和执行:
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[DEBUG] Determined Maven Process ID 253
[DEBUG] boot classpath: /root/.m2/repository/org/apache/maven/surefire/surefire-booter/2.22.1/surefire-booter-2.22.1.jar /root/.m2/repository/org/apache/maven/surefire/surefire-api/2.22.1/surefire-api-2.22.1.jar /root/.m2/repository/org/apache/maven/surefire/surefire-logger-api/2.22.1/surefire-logger-api-2.22.1.jar /builds/jurosecpt024/brownfields_robot_worlds_5/target/test-classes /builds/jurosecpt024/brownfields_robot_worlds_5/target/classes /root/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.13.4.2/jackson-databind-2.13.4.2.jar /root/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.13.4/jackson-annotations-2.13.4.jar /root/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.13.4/jackson-core-2.13.4.jar /root/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.6.3/junit-jupiter-engine-5.6.3.jar /root/.m2/repository/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar /root/.m2/repository/org/junit/platform/junit-platform-engine/1.6.3/junit-platform-engine-1.6.3.jar /root/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar /root/.m2/repository/org/junit/platform/junit-platform-commons/1.6.3/junit-platform-commons-1.6.3.jar /root/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.6.3/junit-jupiter-api-5.6.3.jar /root/.m2/repository/org/mockito/mockito-core/3.6.28/mockito-core-3.6.28.jar /root/.m2/repository/net/bytebuddy/byte-buddy/1.10.18/byte-buddy-1.10.18.jar /root/.m2/repository/net/bytebuddy/byte-buddy-agent/1.10.18/byte-buddy-agent-1.10.18.jar /root/.m2/repository/org/objenesis/objenesis/3.1/objenesis-3.1.jar /root/.m2/repository/info/picocli/picocli/4.6.1/picocli-4.6.1.jar /root/.m2/repository/za/co/wethinkcode/flow/1.0.2/flow-1.0.2.jar /root/.m2/repository/org/junit/jupiter/junit-jupiter/5.9.3/junit-jupiter-5.9.3.jar /root/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.3/junit-jupiter-params-5.9.3.jar /root/.m2/repository/org/eclipse/jgit/org.eclipse.jgit/6.8.0.202311291450-r/org.eclipse.jgit-6.8.0.202311291450-r.jar /root/.m2/repository/com/googlecode/javaewah/JavaEWAH/1.2.3/JavaEWAH-1.2.3.jar /root/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar /root/.m2/repository/org/yaml/snakeyaml/2.0/snakeyaml-2.0.jar /root/.m2/repository/org/slf4j/slf4j-nop/2.0.17/slf4j-nop-2.0.17.jar /root/.m2/repository/org/slf4j/slf4j-api/2.0.17/slf4j-api-2.0.17.jar /root/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar /root/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar /root/.m2/repository/org/json/json/20250107/json-20250107.jar /root/.m2/repository/org/apache/maven/surefire/surefire-junit-platform/2.22.1/surefire-junit-platform-2.22.1.jar /root/.m2/repository/org/junit/platform/junit-platform-launcher/1.3.1/junit-platform-launcher-1.3.1.jar
[DEBUG] boot(compact) classpath: surefire-booter-2.22.1.jar surefire-api-2.22.1.jar surefire-logger-api-2.22.1.jar test-classes classes jackson-databind-2.13.4.2.jar jackson-annotations-2.13.4.jar jackson-core-2.13.4.jar junit-jupiter-engine-5.6.3.jar apiguardian-api-1.1.0.jar junit-platform-engine-1.6.3.jar opentest4j-1.2.0.jar junit-platform-commons-1.6.3.jar junit-jupiter-api-5.6.3.jar mockito-core-3.6.28.jar byte-buddy-1.10.18.jar byte-buddy-agent-1.10.18.jar objenesis-3.1.jar picocli-4.6.1.jar flow-1.0.2.jar junit-jupiter-5.9.3.jar junit-jupiter-params-5.9.3.jar org.eclipse.jgit-6.8.0.202311291450-r.jar JavaEWAH-1.2.3.jar commons-codec-1.16.0.jar snakeyaml-2.0.jar slf4j-nop-2.0.17.jar slf4j-api-2.0.17.jar junit-4.13.2.jar hamcrest-core-1.3.jar json-20250107.jar surefire-junit-platform-2.22.1.jar junit-platform-launcher-1.3.1.jar
我已排查的方向
- 确认了流水线中
mvn compile test-compile执行成功,target/test-classes目录下确实存在编译好的测试类文件 - 本地和流水线使用的都是
maven:latest镜像,Maven版本一致 - 初步核对了Surefire插件版本,流水线里用的是2.22.1,本地暂未完全确认版本是否匹配
有没有大佬遇到过类似问题?或者能给我一些新的排查思路?比如是不是Surefire插件和JUnit版本不兼容?还是流水线环境里有什么隐含配置影响了测试类的发现?
内容来源于stack exchange

