如何让mvn cobertura:cobertura不执行多于mvn test的测试用例
问题原因
cobertura:cobertura目标默认会自动触发Maven构建生命周期执行到test阶段,相当于它会自行重新跑一遍测试流程。你之前给mvn test配置的排除DSS测试的规则,大概率是仅在手动执行mvn test时生效,或者没有配置成全局的surefire插件规则,所以cobertura触发测试执行的时候没有读到排除规则,就把所有测试都跑了。- 如果你是把CEF DSS作为子模块引入项目的,cobertura默认会扫描所有子模块的测试用例执行,没有单独配置子模块排除的话,也会触发DSS自带的测试套件运行。
解决方案
方法一:配置全局测试排除规则(推荐)
直接给maven-surefire-plugin配置全局的DSS测试排除规则,所有场景下执行测试都会跳过DSS的用例,修改你的pom.xml:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>请替换为你当前使用的插件版本</version> <configuration> <excludes> <!-- 替换为实际DSS测试类所在的包路径,匹配所有DSS测试用例 --> <exclude>eu/europa/ec/cef/dss/**/*Test.java</exclude> </excludes> </configuration> </plugin>
配置完成后再执行mvn cobertura:cobertura就会自动跳过DSS的测试用例。
方法二:复用已有测试结果生成报告
如果不想修改pom配置,可以分两步执行命令,让cobertura不要自己重新跑测试,直接用你手动执行mvn test生成的测试结果生成报告:
- 先执行正常的测试命令(已经配置过跳过DSS测试):
mvn test - 执行cobertura命令时加参数禁止重新执行测试:
mvn cobertura:cobertura -Dcobertura.skipExec=true
方法三:排除DSS子模块的扫描
如果DSS是你项目的子模块,直接在cobertura插件的配置里排除该子模块即可:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>请替换为你当前使用的插件版本</version> <configuration> <modules> <!-- 替换为实际的DSS子模块的 artifactId --> <module>!dss-submodule-name</module> </modules> <!-- 也可以同步配置不统计DSS代码的覆盖率,避免影响你自有代码的覆盖率数据 --> <instrumentation> <excludes> <exclude>eu/europa/ec/cef/dss/**/*.class</exclude> </excludes> </instrumentation> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Wouter Verhelst
相关产品推荐
相关产品推荐

