我有一个较大的Maven多模块项目构建。我开始使用PowerMock进行所有测试,并使用Jacoco 0.7.8和离线仪器。
尽管这些被称为“单元测试”,但是一个模块中的类测试确实在其他模块中调用了重要的代码。因此,当我们查看生成的报告时,我们会在与测试相同的模块中看到类的覆盖范围,但是我们没有看到测试期间执行的其他模块中的类的覆盖范围。
我的假设是,如果我能够将其更改为使用在线检测,则生成的覆盖率报告将包括当前模块之外的其他模块的类。
所以,我开始着手修复我们的CUT(被测试类)中的一个细节,这需要使用PowerMock而不是Mockito(这部分非常简单)。我在每个测试和相应的CUT中逐一修复了这个问题,但是现在我只在更大的版本中的单个模块中进行了这些更改。我验证了测试的有效性,并且我可以看到EclEmma的交互式覆盖(PowerMock的另一个限制)。
jacoco-maven-plugin在所有子模块使用的父pom中配置,目前使用离线检测。最后,我要更改此父pom中的配置以使用在线检测,但我决定暂时保留它并覆盖我已完成转换的每个模块中的配置,以便该模块使用在线仪器。我相信我已经“正确地”完成了这项工作,尽管我必须使用hack来覆盖子模块中的执行列表(请记住,一旦所有这些都被转换,我将删除它们。)< / p>
当我运行构建(“clean install
”)时,我看到它执行“prepare-agent
”,打印生成的“argLine
”值,然后稍后执行surefire,然后执行“report
”目标执行,打印jacoco.exec
文件的路径,我看到它显示“Analyzed bundle 'my-module-name' with 1 classes
”。这似乎表明存在问题。
由于构建现已完成,然后我在浏览器中打开了“target/site/jacoco/index.html
”文件,我发现它只包含当前模块的覆盖范围,只包含单个类。
同样好奇的是我在表面上检查了生成的“jacoco.exec
”文件。我注意到它肯定比我以前从使用离线仪器的其他模块看到的要大。我没有办法解释文件的格式,但我确实尝试简单地“cat
”文件,只是为了看看我能看到什么。我看到了在我的测试正在执行的其他模块中表示类名的字符串。
因此,似乎在线检测至少是为其他模块中的类记录数据,但结果报告没有显示。
是否可以获得此保险?
以下是“effective-pom”输出的摘录:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.8</version>
<executions>
<execution>
<id>default-instrument</id>
<phase>none</phase>
<goals>
<goal>instrument</goal>
</goals>
</execution>
<execution>
<id>default-restore-instrumented-classes</id>
<phase>none</phase>
<goals>
<goal>restore-instrumented-classes</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<executions>
<execution>
<id>default-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<argLine>@{argLine} -Xmx1024m</argLine>
<includes>
<include>**/*Test.java</include>
</includes>
<systemPropertyVariables>
<running-unit-test>true</running-unit-test>
<jacoco-agent.destfile>...\target/jacoco.exec</jacoco-agent.destfile>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
<configuration>
<argLine>@{argLine} -Xmx1024m</argLine>
<includes>
<include>**/*Test.java</include>
</includes>
<systemPropertyVariables>
<running-unit-test>true</running-unit-test>
<jacoco-agent.destfile>...\target/jacoco.exec</jacoco-agent.destfile>
</systemPropertyVariables>
</configuration>
</plugin>
请注意,用于脱机检测的执行具有阶段“none
”,因此不使用它们,我还设置了“jacoco-agent.destfile
”属性,该属性仅用于脱机仪器