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'//添加插件jacoco
jacoco {
toolVersion = "0.7.9"//声明jacoco的版本号
}
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.weex.jasso"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "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 = true
html.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任务即可
```java
gradlew -Dfile.encoding=UTF-8 jacocoTestReport
gradle -Dfile.encoding=UTF-8 jacocoTestReport