Maven多模块项目执行指定模块单集成测试报错解决方法
现有一个Maven多模块项目,结构如下:
尝试执行pollen-reports-framework模块下的单个集成测试时,使用命令如下:
mvn test -Dtest="com.jspollen.reports.resource.ReportResourceIntegrationTest"
命令运行初期状态正常,目标测试成功执行,输出结果如下:
[INFO] Results: [INFO] [INFO] Tests run: 44, Failures: 0, Errors: 0, Skipped: 0
但后续Maven会尝试在其他子模块运行该指定测试,最终触发构建失败,核心日志如下:
[INFO] pollen-service-reports ............................. SUCCESS [ 1.607 s] [INFO] pollen-reports-framework ........................... SUCCESS [ 30.620 s] [INFO] pollen-reports-askpollen ........................... FAILURE [ 0.444 s] [INFO] pollen-reports-homepagestats ....................... SKIPPED [INFO] pollen-reports-keymeasures ......................... SKIPPED [INFO] pollen-reports-customerprofile ..................... SKIPPED [INFO] pollen-reports-kpitree ............................. SKIPPED [INFO] pollen-reports-contributionbykpi ................... SKIPPED [INFO] pollen-reports-productassociation .................. SKIPPED [INFO] pollen-reports-contributionbyuserdefined ........... SKIPPED [INFO] pollen-reports-rangeoptimiser ...................... SKIPPED [INFO] pollen-reports-promotionscalendar .................. SKIPPED [INFO] pollen-reports-repeatpurchase ...................... SKIPPED [INFO] pollen-reports-crossshop ........................... SKIPPED [INFO] pollen-reports-npdcalendar ......................... SKIPPED [INFO] pollen-reports-customerjourney ..................... SKIPPED [INFO] pollen-reports-controlstoreselector ................ SKIPPED [INFO] pollen-reports-productswitching .................... SKIPPED [INFO] pollen-reports-npdbenchmark ........................ SKIPPED [INFO] pollen-reports-promotionsoptimisation .............. SKIPPED [INFO] pollen-reports-rangingtree ......................... SKIPPED [INFO] pollen-reports-gmandckeymeasures ................... SKIPPED [INFO] pollen-reports-gmandccustomerprofile ............... SKIPPED [INFO] pollen-reports-app ................................. SKIPPED [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 33.141 s [INFO] Finished at: 2022-06-24T17:09:43+01:00 [INFO] ------------------------------------------------------------------------ [WARNING] The requested profile "artifactory" could not be activated because it does not exist. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project pollen-reports-askpollen: No tests were executed! (Set -DfailIfNoTests=false to ignore this error.) -> [Help 1]
从报错信息可知,Maven默认会遍历本次构建包含的所有子模块,匹配-Dtest指定的测试类。pollen-reports-askpollen等其他模块不存在目标测试类,maven-surefire-plugin默认开启了「无匹配测试则构建失败」的校验规则,直接中断构建流程,后续模块全部跳过,无法正常获取已执行测试的运行报告。
注:日志中提示的
artifactoryprofile不存在为警告信息,不是本次构建失败的原因,无需额外处理。
以下三种方案均可解决该问题,按推荐优先级排序:
方案1:指定测试运行的目标模块,自动构建依赖模块
通过-pl参数指定仅在pollen-reports-framework模块执行测试,搭配-am参数自动构建该模块依赖的上游模块,命令如下:mvn test -pl pollen-reports-framework -am -Dtest="com.jspollen.reports.resource.ReportResourceIntegrationTest"该方案下Maven不会在其他无关子模块执行测试匹配,构建效率最高,也不会出现测试漏跑、误判的问题,是单模块测试执行的首选方案。
方案2:全局关闭无测试失败校验
在命令中追加参数,关闭surefire插件「无匹配测试则失败」的规则,让没有目标测试的模块直接跳过校验:mvn test -Dtest="com.jspollen.reports.resource.ReportResourceIntegrationTest" -DfailIfNoTests=false该方案的缺点是Maven仍会遍历所有子模块执行插件检查,构建速度慢于方案1;如果出现测试类名写错、目标测试未被匹配到的情况,不会触发报错,容易遗漏测试问题。
方案3:进入目标模块目录执行命令
先切换到pollen-reports-framework模块的根目录,再执行原始测试命令,此时Maven仅会构建当前模块,不会遍历父工程下的其他子模块:cd pollen-reports-framework mvn test -Dtest="com.jspollen.reports.resource.ReportResourceIntegrationTest"注意如果该模块依赖同项目下的其他上游模块,需要先在项目根目录执行一次
mvn install,将依赖模块安装到本地Maven仓库,否则会出现依赖找不到的报错。
内容的提问来源于stack exchange,提问作者Nestor Milyaev

