jacoco简介
jacoco是Java Code Coverage的缩写,顾名思义,是Java代码覆盖率统计的主流工具之一。在安卓项目的代码覆盖率统计使用了jacoco的离线插桩方式,在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试(单元测试、UI测试或者手工测试等)插过桩的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。
android stu
1.配置build.gradle
使用Android Studio打开项目,打开build.gradle文件,添加以下内容:
添加jacoco插件并设置版本
apply plugin: 'jacoco' //加载代码覆盖库jacoco
jacoco {
toolVersion = "0.7.9" //代码覆盖库jacoco版本号
}
在buildTypes中启用jacoco
testCoverageEnabled = true
添加生成报告的相关设置
//代码覆盖率相关配置
def coverageSourceDirs = [
'../app/src/main/java'
]
task jacocoTestReport(type: JacocoReport) {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml.enabled = true
html.enabled = true
}
classDirectories = fileTree(
//检测覆盖率的class所在目录(以项目class所在目录为准)
dir: './build/intermediates/javac/debug/classes',
//增加以上目录中不需要检测的文件列表
// excludes: ['**/R*.class',
// '**/*$InjectAdapter.class',
// '**/*$ModuleAdapter.class',
// '**/*$ViewInjector*.class'
// ]
)
//设置需要检测覆盖率的目录
sourceDirectories = files(coverageSourceDirs)
//存储APP运行时产生报告的路径
executionData = files("$buildDir/outputs/code-coverage/connected/code_coverage.ec")
}
2.配置AndroidManifest.xml
确认APP有开启文件读写权限
3.配置项目代码
在基类Activity中的onDestory中添加生成代码覆盖率的方法
public class BaseActivity extends AppCompatActivity {
public static String DEFAULT_COVERAGE_FILE_PATH = Environment.getExternalStorageDirectory()+"/";
@Override
protected void onDestroy() {
generateCoverageFile();
super.onDestroy();
}
/**
* 生成executionData
*/
public void generateCoverageFile() {
OutputStream out = null;
try {
out = new FileOutputStream(DEFAULT_COVERAGE_FILE_PATH + "/code_coverage.ec", false); //在SDcard根目录下生产检测报告,文件名自定义
Object agent = Class.forName("org.jacoco.agent.rt.RT").getMethod("getAgent").invoke(null);
// 这里之下就统计不到了
out.write((byte[]) agent.getClass().getMethod("getExecutionData", boolean.class).invoke(agent, false));
} catch (Exception e) {
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.生成代码覆盖率文件
项目build成功后,点击Gradle->app->install->installDebug安装应用
启动应用,手动点击或者执行自动化脚本,执行完成后退出应用并杀掉进程,使用adb shell命令进入scard目录下,查看是否生成code_coverage.ec文件,如果生成该文件使用adb pull把文件pull到本地
5.生成报告
把pull出的code_coverage.ec文件放到项目app/build/outputs/code-coverage/connected/目录下,如果没有该目录,可手动创建,注意这里的路径要跟上面build.gradle里面写的“executionData”一致
点击Gradle->app->reporting->jacocoTestReport,会在项目的app\build\reports目录下生成报告
报告会在项目的以下位置生成
打开html目录下面的index.html文件即可在网页中查看代码覆盖率
6.常见问题
未生成code_coverage.ec文件
1.检查项目配置是否正确
2.确认获取代码覆盖率的方法是在哪个生命周期中添加的,例如在onDestory中添加则需要操作完成后杀掉应用进程才会生成覆盖率文件
已生成code_coverage.ec文件,但生成的报告中数据为空
检查build.gradle中的配置地址是否与本地项目一致
报告中无法查看代码执行情况
检查build.gradle中的源码配置路径是否与本地项目一致