我想查找Android应用程序(Android Studio + Gradle)的手动测试和自动测试(appium)的代码覆盖范围。
在StackOverflow上已经有一些与此问题相关的问题,但是没有一个对我有用。我已按照以下问题的步骤操作:Android Coverage launch with JaCoCo 在sdcard /中生成的jacoco.exec文件为37个字节,基本上为空。
build.gradle的当前配置:
override fun onCreate() {
super.onCreate()
Fabric.with(this, Crashlytics())
val defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
val customExceptionHandler = DefaultExceptionHandler(defaultExceptionHandler)
Thread.setDefaultUncaughtExceptionHandler(customExceptionHandler)
}
jacoco.java:
apply plugin: 'com.android.application'
apply plugin: 'jacoco'
def coverageSourceDirs = [
'../app/src/main/java'
]
jacoco{
toolVersion = "0.7.4.201502262128"
}
task jacocoTestReport(type: JacocoReport) {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml.enabled = true
html.enabled = true
}
classDirectories = fileTree(
dir: './build/intermediates/classes/debug',
excludes: ['**/R*.class',
'**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
'**/*$ViewInjector*.class'
])
sourceDirectories = files(coverageSourceDirs)
executionData = files("$buildDir/outputs/code-coverage/connected/coverage.exec")
doFirst {
new File("$buildDir/intermediates/classes/").eachFileRecurse { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}
// this is for the report
...
答案 0 :(得分:0)
将这些更改放入build.gradle文件中
apply plugin: 'jacoco'
也添加
testCoverageEnabled true
到buildTypes中的debug {}。
我不能强调testCoverageEnabled的重要性,它会检测文件,如果没有它,您将无法获得覆盖。确保正确添加了这一行。
要正确设置“ build.gradle”,请检查“ build / intermediates”。
向AndroidManifest.xml添加读写外部存储权限
在MainActivity.java的onDestroy()函数中添加以下行:
Log.d("StorageSt", Environment.getExternalStorageState());
String coverageFilePath = Environment.getExternalStorageDirectory() + File.separator+ "coverage.exec";
File coverageFile = new File(coverageFilePath);
super.onStop();
if(BuildConfig.DEBUG)
{
try {
Class<?> emmaRTClass = Class.forName("com.vladium.emma.rt.RT");
Method dumpCoverageMethod = emmaRTClass.getMethod("dumpCoverageData",coverageFile.getClass(),boolean.class,boolean.class);
dumpCoverageMethod.invoke(null, coverageFile,true,false);
}
catch (Exception e) {}
运行您的应用程序,您将在/ sdcard /中找到coverage.exec。如果模拟器上的覆盖范围是37bytes,请在真实设备上尝试或构建APK,然后将其放入模拟器中进行安装。
然后您可以将coverage.exec拉入计算机,并使用jacoco从中生成HTML报告。