代码覆盖率统计
通过对项目代码插桩的方式,来收集测试时代码的覆盖率数据。
代码覆盖率的用途
- 测试用例覆盖率,查缺补漏
- 单元测试有效覆盖
- 自动化测试与手工测试边界清晰划定
- 增量代码精准评估影响范围
插桩的用途
- trace追踪
- debug调试
- profile剖析
- log记录
插桩分类
- 源代码插桩
- 构建时插桩
- 字节码插桩
- 运行时插桩
java插桩技术分类
- 源代码插桩:硬编码log注解
- 构建时插桩:Android自动埋点gradle+asm、jacoco gradle插件
- 字节码插桩:jacoco offline(会修改jar包,不方便包还原)
- 运行时插桩:jvm-sndbox、jacoco-agent、bytebuddy
java agent机制优点
- 安全:不修改原始交付物:jar、class
- 便捷:按需加载,可以选择在启动前后按需插桩
- 使用范围最广:资料最多
agent的2种实现方式: - 启动前的premain入口模式
- 启动后的agentmain入口模式
java agent启动前premain模式插桩流程
1.修改jvm启动参数加入java agent
2.premain开始执行,创建Transformer
3.jvm加载类,并根据Transformer修改类
4.main主方法运行时,所有类已经被插桩
5.修改后的代码执行
java agent启动后的agentmain模式插桩流程
1.jvm进程启动
2.其他进程调用attach方法到当前进程
3.agentmain执行
4.修改后的代码执行
项目运行后覆盖率统计
maven项目代码覆盖率统计
编译时覆盖率统计
演练项目:
spring启动项目
参考文档:
jacoco mvn plugin配置参考文档
pom.xml文件配置添加plugin
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.9-SNAPSHOT</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>default-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>BUNDLE</element>
<limits>
<limit>
<counter>COMPLEXITY</counter>
<value>COVEREDRATIO</value>
<minimum>0.60</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
通过代码编译时统计单元测试覆盖率数据
1.mvn clean清理
2.prepare-agent配置agent
3.test执行测试
4.jacoco:report生成报告
mvn clean jacoco:prepare-agent test jacoco:report -Dmaven.gitcommitid.skip=true open site/jacoco/index.html
#不依赖jacoco插件安装
mvn clean org. jacoco:jacoco-maven-plugin:LATEST:prepare-agent test org.jacoco:jacoco-maven-plugin:LATEST:report -Dmaven.gitcommitid.skip=true open target/site/jacoco/index.html
- Dmaven.gitcommitid.skip=true:跳过git插件配置
- Dtest=JavaVersionProjectDescriptionCustomizerTests#java8IsMandatoryMaven:指定测试用例
gradle项目代码覆盖率统计
练习项目:
spring启动项目
build.gradle文件配置
plugins {
id 'java'
id 'jacoco'
id "org.sonarqube" version "3.3"
}
sonarqube {
properties {
property 'sonar.projectName', "sonar-scanner-gradlee"
property "sonar.host.url", ""
property "sonar.login", ""
property "sonar.sourceEncoding", "UTF-8"
}
}
jacoco {
toolVersion = "0.8.7"
}
jacocoTestReport {
reports {
xml.required = true
html.enabled true
xml.enabled true
}
}
tasks['sonarqube'].dependsOn jacocoTestReport
// 跳过javadoc
allprojects {
tasks.withType(Javadoc).all { enabled = false }
}
通过代码编译时统计单元测试覆盖率数据
1.clean清理
2.build构建并执行测试
3.acocoTestReport生成测试报告
执行命令
./gradlew clean build jacocoTestReport
查看项目目录下jacoco报告
open build/reports/jacoco/test/html/index.html