Diffblue Cover插件
1、安装
- IDEA应用市场搜索Diffblue Cover,选择第一个社区版进行安装。
2、环境条件
- IntelliJ 版本 2021.1 或更高版本,或 IntelliJ 版本 2020.3 或更高版本
- Java 8 或 11 源代码(但请注意不支持 Java 11.0.7)
- 基于 Maven 或 Gradle 的项目
- 2 GB 最低内存要求(要在 IntelliJ 中进行修改,请选择
Help
thenChange Memory Settings
) - 您的项目必须编译成功并运行
- JUnit 始终是必需的依赖项。
3、 图标
- 索引 - 我们正在发现您的项目结构!同时,单击该图标以编写测试。
- 编写测试 - 单击图标为此方法或类编写测试。
- 不可测试 - 此方法或类无法测试;单击图标以找出原因。
- 私有方法 - 此方法无法测试,因为它是私有的,但可以通过公共方法间接测试。如果您想编写单元测试,请将此方法设为 public 或包保护。
- 测试写作正在进行中 - 请稍等,我们完成!
4、使用
- 点击类或方法左侧图标((或者右键->Write Tests),点击类左侧图标会生成该类下面的所有方法的测试类,对应文件夹下面生成单元测试文件,文件路径src/test/java
5、原理
下图显示了 Diffblue Cover 执行的流水线。
- 它首先确保您的代码已编译。这是必需的,因为它对字节码执行分析。
- 然后它通过要测试的每个方法的路径进行尝试生成测试文件。它使用的输入与开发人员的输入相似。同时,它模拟了测试所依赖的文件
- 最后,它找出可能有用的断言并将它们添加到测试中。请注意,断言始终反映代码的当前行为。
- 它不做的是猜测您的代码的预期行为。
- 有时它可能找不到适合您的代码的测试,在这种情况下,它可能会返回一个部分测试供您完成。
6、进阶使用
1. 将 DCover 添加到 CI 管道
将 Diffblue Cover 添加到您的 CI 管道意味着您可以自动生成单元测试以检查您的代码质量,从而节省编写它们所需的时间和资源。这有助于开发人员的工作并对开发计划产生积极影响。它还强制开发人员确保他们正在更新测试,并且不会将任何失败的测试传递给其他拉取请求。在 CI 环境中使用 DCover 还可以保护代码库。CI管道如下图所示:
前置条件
确保您的项目在功能齐全的 CI 管道中成功编译。
将 DCover 添加到 CI 管道
创建一个新的工作流并选择下面的相关脚本,注意在每种情况下进行设置:
- 工作流名称
- 合适的环境变量。这些都是:
- 作为您的 CI 用户的帐户的访问令牌(请注意,这不能是 Bot 帐户)
- DCover 发布 URL。
下面的脚本是自我记录的,包含每个实现所需的所有详细信息。
示例脚本:
- 该脚本检查机器人是否进行了最后一次提交。这是为了避免可能的无限 CI 循环。
- 输出值为:
- 0 = 最后一次提交不是由机器人完成的
- 1 = 最后一次提交是由机器人完成的。
脚本地址
-
GitHub 和 Azure
https://github.com/diffblue/cover-pipelines/tree/master/azure-github
-
GitLab
https://github.com/diffblue/cover-pipelines/tree/master/gitlab-ci
2、生成Jacoco的HTML覆盖率报告
-
在pom.xml文件下添加以下声明
<dependency> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.5</version> </dependency>
<build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.5</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
-
运行mvn test
- 这将创建一个二进制格式的覆盖率报告
jacoco.exec
, 该报告在您的 Maven 项目目录target中。该报告在target/site/jacoco
同时生成 XML、HTML 和 CSV 格式的报告。 - 如果运行报错,尝试使用 mvn spring-javaformat:apply命令进行修复
- 这将创建一个二进制格式的覆盖率报告
-
Jacoco是从代码指令(Instructions, Coverage),分支(Branches, Coverage),圈复杂度(Cyclomatic Complexity),行(Lines),方法(Methods),类(Classes)等维度进行分析的。
-
覆盖率报告字段说明
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-91vFztwb-1626176416173)(C:/Users/15652/AppData/Roaming/Typora/typora-user-images/image-20210713190810498.png)]
3、Jacoco覆盖率报告详细分析
3.1 一级目录
-
红色方框对应对应颜色是总包,对应java文件下的一级目录。
-
蓝色对应总包下面的各个包,总包的覆盖率取决于子包的覆盖率。
-
进度条:红色进度条表未覆盖,绿色进度条表示已覆盖,Cov为总体覆盖率。
3.2 二级目录
展示当前分组>包下面所有的类。
类的覆盖率取决于方法的覆盖情况。
3.3 三级目录
展示当前分组>包>类下面的所有方法。
方法的覆盖率取决于方法内代码覆盖的情况。
3.4 四级内容
展示方法内代码覆盖情况。
- 绿色:表示行覆盖充分。
- 红色:表示未覆盖的行。
- 黄色棱形:表示分支覆盖不全。
- 绿色棱形:表示分支覆盖完全。
4. 相关参考资料
jacoco报告资料参考:
https://www.jianshu.com/p/ef987f1b6f2f
https://www.jianshu.com/p/50c5cc021396
官方文档:
https://docs.diffblue.com/getting-started/
5. 特殊说明
DCover CLI 命令行工具需要向官网工作人员申请,已申请,暂未回复,官方文档中的可视化方法暂时无法复现。