jacco.zip
更新后可能需要更改的地方
https://www.cnblogs.com/renjiaqi/p/11456358.html
使用教程
https://blog.csdn.net/qq_27103959/article/details/74549964
gradle报错相关解决办法
https://www.jianshu.com/p/e0ba79c83183
https://blog.csdn.net/zengsidou/article/details/79797417
使用步骤
1.更改app目录里的gradle文件
apply plugin: 'com.android.application'apply plugin: 'jacoco'//添加插件jacocojacoco {toolVersion = "0.7.9"//声明jacoco的版本号}android {compileSdkVersion 25buildToolsVersion "25.0.2"defaultConfig {applicationId "com.weex.jasso"minSdkVersion 16targetSdkVersion 25versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {debug {testCoverageEnabled = true//设置为true}}}dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {exclude group: 'com.android.support', module: 'support-annotations'})compile 'com.android.support:appcompat-v7:25.1.1'//compile 'org.jacoco:org.jacoco.core:0.7.9' 旧语法导入jacoco的版本包implementation 'org.jacoco:org.jacoco.core:0.7.9'//新语法导入jacoco的版本包compile 'com.android.support.constraint:constraint-layout:+'}//添加资源目录def coverageSourceDirs = ['../app/src/main/java']//建立task任务将outputs/code-coverage/connected/目录下coverage.ec文件的生成覆盖率报告task jacocoTestReport(type: JacocoReport) {group = "Reporting"description = "Generate Jacoco coverage reports after running tests."reports {xml.enabled = truehtml.enabled = true}classDirectories.from = fileTree(dir: './build/intermediates/javac/debug/classes',excludes: ['**/R*.class','**/*$InjectAdapter.class','**/*$ModuleAdapter.class','**/*$ViewInjector*.class'])sourceDirectories.from = files(coverageSourceDirs)executionData.from = files("$buildDir/outputs/code-coverage/connected/coverage.ec")doFirst {new File("$buildDir/intermediates/javac/debug/classes/").eachFileRecurse { file ->if (file.name.contains('$$')) {file.renameTo(file.path.replace('$$', '$'))}}}}
2.修改基础类BaseActivity
- 基础类在oncreate()创建coverage.ec文件用于写入代码覆盖率及方法createFile()方法,在界面关闭的onDestroy()生命周期写入覆盖数据方法closeFile();
创建文件夹等操作需动态获取安卓读写权限 ```java public abstract class BaseActivity extends Activity { private static final int PERMISSIONS_READ_WRITE_STATE = 300;//读写权限 public static String DEFAULT_COVERAGE_FILE_PATH = Environment.getExternalStorageDirectory() + “/jacco”;//生成覆盖率文件的路径 public static String TAG = Test1Activity.class.getName();//获取activity名字,随实际情况修改 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//activity创建时,生成测试覆盖率文件createFile(DEFAULT_COVERAGE_FILE_PATH,"coverage.ec");
}
@Override protected void onDestroy() {
super.onDestroy();//activity关闭时,将数据写入到覆盖率文件中closeFile();
}
//创建覆盖率文件 public void createFile(String path, String fileName) {
File file = null;file = new File(path, fileName);//先创建文件夹后在创建文件if (!file.exists()) {file.getParentFile().mkdirs();try {Toast.makeText(this,"创建文件",Toast.LENGTH_LONG).show();file.createNewFile();} catch (IOException e) {e.printStackTrace();}}
}
//关闭activity写入数据到覆盖率文件
public void closeFile(){OutputStream out = null;try {out = new FileOutputStream(DEFAULT_COVERAGE_FILE_PATH + "/coverage.ec", false);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) {Log.d(TAG, e.toString(), e);} finally {if (out != null) {try {out.close();} catch (IOException e) {e.printStackTrace();}}}}
/*** 检测读写权限是否开启*/private static String[] PERMISSIONS_STORAGE = {"android.permission.READ_EXTERNAL_STORAGE","android.permission.WRITE_EXTERNAL_STORAGE" };public void showReadWriteContacts(){if (Build.VERSION.SDK_INT >= 23) { //判断是否为android6.0系统版本,如果是,需要动态添加权限if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {//权限还没有授予,需要在这里写申请权限的代码ActivityCompat.requestPermissions(this,PERMISSIONS_STORAGE, PERMISSIONS_READ_WRITE_STATE);}} else {Toast.makeText(this,"安卓6.0以下",Toast.LENGTH_LONG).show();}}
}
<a name="CjRD3"></a>### 3.生成报告1. 携带编码参数以防乱码,两个选一个就好生成报告2. 将手机中的coverage.ec文件复制到build/outputs/code-coverage/connected下,执行task任务即可```javagradlew -Dfile.encoding=UTF-8 jacocoTestReportgradle -Dfile.encoding=UTF-8 jacocoTestReport
