jaco and co :)
代码覆盖率是任何软件开发中的一个重要方面。它告诉你有多少代码被你的测试所执行。作为一种工具,它在单元/集成测试的开发过程中是非常有用的,因为它有助于突出你的测试可能错过的代码路径。
例如,如果你测试的代码有一个_if...then...else_条件,而你的测试用参数调用代码,导致_if_条件块被测试,但不是_else_块,代码覆盖率有助于突出未测试的代码。
有很多工具可以生成代码覆盖率报告。JaCoCo是一个免费的Java代码覆盖库,它是由EclEmma团队根据多年来使用和整合现有库的经验而创建的_。_
在maven项目的pom.xml中配置jacoco,以生成单元和集成的覆盖率报告,这对于开始使用jacoco是很容易的。但是,在某些时候,你需要一份合并的报告,将单元、集成和功能测试报告一并考虑在内。
在这篇博客中,我们将讨论生成单元、集成和功能测试单独覆盖报告所需的配置选项。由于我们使用不同的测试框架,如Junit和Cucumber/KarateJacoco也将有助于生成一个整体的覆盖率报告,整合合并的覆盖率数据。
设置
我们要建立的多模块maven项目由3个maven模块组成。
module1 和_module2_由一个带有一些功能的java域类组成,并有各自的单元集成测试类。
模块3 由cucumber功能测试组成,还包含合并jacoco报告的配置。
pom模块和属性的片段看起来像下面这样。
主pom.xml
我们还配置了一些pom配置文件,这将有助于激活_单元_、集成测试_和_testAll 配置文件。
我们将配置单元测试和集成测试的配置文件。
配置surefire插件
Surefire插件是在构建生命周期的测试阶段用于执行应用程序的单元测试。我们可以使用excludes属性排除那些我们不希望surefire插件在测试阶段包含的测试文件。
surefire插件
配置故障安全插件
_Failureafe_插件用于项目的集成测试**。**它有两个目标。
- _integration-test -_这个目标默认是绑定在_集成测试阶段_的。
- _verify -_验证集成测试是否通过。这个目标默认与_验证_阶段绑定。
故障安全插件
包括jacoco插件
Jacoco将测试覆盖率数据的收集与覆盖率报告的生成分开。下面的块告诉jacoco启动单元测试和集成测试的代理。
jacoco代理初始化。
现在,我们在模块3中配置jacoco插件来执行cucumber测试,有一个关于_argLine_的重要说明,应该注意并牢记。_argLine_有助于保持测试执行的命令行参数,随后有助于生成合并报告。
现在,我们将在模块3中配置jacoco maven插件,用于合并和汇总不同执行步骤的jacoco报告。现在,我们将在插件中添加不同的目标。
report-aggregate:从reactor内的多个项目中创建结构化的代码覆盖报告(HTML、XML和CSV)。该报告是由该项目依赖的所有模块创建的。
report-aggregate
合并。这个目标有助于将一组执行数据文件(*.exec)合并成一个文件。
因为每个模块都有一个由jacoco生成的单独的*.exec文件。这个_合并_ 目标将那些在includes属性中指定的文件合并成一个单一的聚合文件,并放到destFile中的指定位置。
合并报告。
我们也可以从日志中获得目标_报告--聚合和_合并的 视图,看起来像下面这样。
聚合和合并日志。
现在,为了增加一层额外的条件,你可以在插件中添加一个检查目标,它将验证执行块内给出的规则,如果不符合规则,则构建失败。dataFile属性指定了合并报告的位置,规则将被检查。
检查执行。
至此,jacoco的插件配置结束。你可以查看源代码,了解项目中使用的依赖的确切列表。
现在如果你运行mvn clean install -P testAll,这将激活_testAll_ 配置文件并生成jacoco合并报告。
现在你可以通过打开_module3/target/site/jacoco-aggregate/index.html_文件在浏览器中查看合并后的报告。
index.html
现在我们将尝试忽略模块3的黄瓜测试,看看对jacoco报告的影响。你可以通过简单地忽略特征文件中指定的标签来实现这一目的。运行这个命令:mvn clean install -P testAll -Dcucumber.options="--tags ~@Concatenation"
忽略cucumber测试。
结果显示_模块1_ 的函数连接没有被调用,因此覆盖率降低,构建失败。
总结
我们已经看到了如何配置jacoco以及fail safe和sure fire插件来获得maven项目的整体代码覆盖率。如果您需要jacoco的其他配置及其规则,请访问官方文档。我们也试图通过使用cucumber测试框架来提高_模块1_ 和_模块3_ 的覆盖率。如果使用Karate API测试框架而不是cucumber,也会采用类似的方法。要了解更多关于Karate与Spring boot的集成,请访问我的repo。
源代码可在此获得。学习愉快!!