0


Spring Boot集成jacoco实现单元测试覆盖统计

1.什么是jacoco?

JaCoCo,即 Java Code Coverage,是一款开源的 Java 代码覆盖率统计工具。支持 Ant 、Maven、Gradle 等构建工具,支持 Jenkins、Sonar 等持续集成工具,支持 Java Agent 技术远程监控 Java 程序运行情况,支持Eclipse、IDEA等IDE,提供HTML,CSV 等格式的报表导出,轻量级实现,对外部库和系统资源的依赖性小,性能开销小。 JaCoCo 支持从 JDK1.0 版本到 JDK1.8 版本 的 Java 类文件。但是,JaCoCo 工具所需的JRE 版本最小为 1.5。另外,1.6及以上版本的测试中的类文件必须包含有效的堆栈映射帧。

它有以下功能特性:

  • 指令(C0)、分支(C1)、行、方法、类型和圈复杂度的覆盖分析。
  • 基于 Java 字节码,因此也可以在没有源文件的情况下工作。
  • 通过基于实时检测的Java 代理进行简单集成。通过 API 可以实现其他集成场景,例如自定义类加载器。
  • 与框架无关:基于 Java VM 的应用程序都可以顺利集成,例如普通 Java 程序、OSGi 框架、Web 容器或 EJB 服务器。
  • 与所有已发布的 Java 类文件版本兼容。
  • 支持不同 JVM 语言。
  • 多种报告格式(HTML、XML、CSV)。
  • 在任何时间点,可以使用远程协议和 JMX 控制从覆盖代理请求执行数据转储。
  • 用于收集和管理执行数据并创建结构化覆盖率报告的Ant 任务。
  • Maven 插件,用于收集覆盖信息并在 Maven 构建中创建报告。

非功能特性:

  • 简单的使用和与现有构建脚本和工具的集成。
  • 良好的性能,最小的运行时开销,尤其是对于大型项目。
  • 对外部库和系统资源的依赖最小的轻量级实现。
  • 综合文档。
  • 完整的API文档(JavaDoc)和 其他工具集成的示例。
  • 基于JUnit 测试用例的完整功能测试覆盖的回归测试。

2.代码工程

实验目标

实验单元测试覆盖率检测

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>springboot-demo</artifactId>
  7. <groupId>com.et</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>jacoco</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-autoconfigure</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. </dependencies>
  31. <build>
  32. <plugins>
  33. <plugin>
  34. <groupId>org.jacoco</groupId>
  35. <artifactId>jacoco-maven-plugin</artifactId>
  36. <version>0.8.6</version>
  37. <executions>
  38. <execution>
  39. <goals>
  40. <goal>prepare-agent</goal>
  41. </goals>
  42. </execution>
  43. <execution>
  44. <id>jacoco-report</id>
  45. <phase>test</phase>
  46. <goals>
  47. <goal>report</goal>
  48. </goals>
  49. </execution>
  50. <execution>
  51. <id>jacoco-check</id>
  52. <goals>
  53. <goal>check</goal>
  54. </goals>
  55. <configuration>
  56. <rules>
  57. <rule>
  58. <element>PACKAGE</element>
  59. <limits>
  60. <limit>
  61. <counter>LINE</counter>
  62. <value>COVEREDRATIO</value>
  63. <minimum>0.0</minimum>
  64. </limit>
  65. </limits>
  66. </rule>
  67. </rules>
  68. </configuration>
  69. </execution>
  70. </executions>
  71. </plugin>
  72. <plugin>
  73. <groupId>org.apache.maven.plugins</groupId>
  74. <artifactId>maven-surefire-plugin</artifactId>
  75. <version>3.0.0-M5</version>
  76. <configuration>
  77. <forkedProcessExitTimeoutInSeconds>60</forkedProcessExitTimeoutInSeconds>
  78. <forkCount>1</forkCount>
  79. </configuration>
  80. </plugin>
  81. </plugins>
  82. </build>
  83. </project>

controller

  1. package com.et.jacoco.controller;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. @RestController
  7. public class HelloWorldController {
  8. @RequestMapping("/hello")
  9. public Map<String, Object> showHelloWorld(){
  10. Map<String, Object> map = new HashMap<>();
  11. map.put("msg", "HelloWorld");
  12. return map;
  13. }
  14. }

测试类

  1. package com.et.jacoco;
  2. import org.junit.jupiter.api.Test;
  3. import org.junit.jupiter.api.extension.ExtendWith;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
  6. import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
  7. import org.springframework.http.MediaType;
  8. import org.springframework.test.context.junit.jupiter.SpringExtension;
  9. import org.springframework.test.web.servlet.MockMvc;
  10. import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
  11. import static org.hamcrest.core.StringContains.containsString;
  12. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
  13. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  14. @ExtendWith(SpringExtension.class)
  15. @WebMvcTest
  16. @AutoConfigureMockMvc
  17. public class HelloControllerTest {
  18. @Autowired
  19. private MockMvc mvc;
  20. @Test
  21. public void getHello() throws Exception {
  22. mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
  23. .andExpect(status().isOk())
  24. .andExpect(content().string(containsString("HelloWorld")));
  25. }
  26. }

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • GitHub - Harries/springboot-demo: a simple springboot demo with some components for example: redis,solr,rockmq and so on.

3.测试

执行

  1. mvn clean test 会自动在项目目录:

target/site/jacoco/index.html

  1. 即可查看到图形化的测试报告,如下:

点击链接,你可以查看每个类的代码覆盖情况,如下:

四.总结

本文简单介绍 JaCoCo 最基本使用和上手,希望你可以通过官网探索更多的高级功能,关于覆盖率给你一些建议:

  • 覆盖率指标大多数情况下仅作为参考,不要用它作为考核指标
  • 不要过于追求覆盖率指标,100% 的覆盖率也不能代表你的项目没有 BUG

4.引用


本文转载自: https://blog.csdn.net/dot_life/article/details/140218759
版权归原作者 HBLOGA 所有, 如有侵权,请联系我们删除。

“Spring Boot集成jacoco实现单元测试覆盖统计”的评论:

还没有评论