非 'app' 模块中的多模块项目 Instrumentation 测试代码覆盖率
Multi module project Instrumentation test code coverage in non 'app' modules
我的项目结构如下:
--app
--module2 //library module
--module3 //library module
我正在为我的多模块 android 项目编写 仪器测试用例 ,jacoco 代码覆盖率。如果我从 'app' 模块执行检测测试用例,则仅为 'app' 模块 类.
生成代码覆盖率
因此,为了获得 'module2' & 'module3' 类 的代码覆盖率;我已经在各个模块中编写了仪器测试用例。
当我在非应用程序模块中执行插桩测试用例时出现问题,无法启动主 activity,插桩期间应用程序未启动且测试用例失败。
根本原因是:
@Rule
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);
@Rule 未在启动 'MainActivity.class' 的 'module2' & 'module3' 中声明。由于一些循环依赖问题,我无法将 'MainActiviy' 导入这些模块。
错误:
java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar?
如何解决这个问题?
注意:此题专用于仪器测试,不用于单元测试(这已在单元测试中处理)
Similiar question
我已按照此 并根据我的要求更改了 gradle 任务。
添加 gradle 任务以供参考。
task jacocoUiTestReportAllModules(type: JacocoReport, dependsOn: 'createDebugCoverageReport') {
group "Reports"
description "Generate Jacoco Instrumented Tests coverage reports for all modules"
reports {
xml.enabled = true
html.enabled = true
html.destination file("${rootProject.buildDir}/coverage-report")
}
def javaClasses = []
def kotlinClasses = []
def javaSrc = []
def kotlinSrc = []
def execution = []
rootProject.subprojects.each { proj ->
javaClasses << fileTree(dir: "$proj.buildDir/intermediates/javac/debug", excludes: fileFilter)
kotlinClasses << fileTree(dir: "$proj.buildDir/tmp/kotlin-classes/debug", excludes: fileFilter)
javaSrc << "$proj.projectDir/src/main/java"
kotlinSrc << "$proj.projectDir/src/main/kotlin"
execution << fileTree(dir: proj.buildDir, includes: [
'outputs/code_coverage/debugAndroidTest/connected/**/*.ec'])
}
getSourceDirectories().setFrom(files([javaSrc, kotlinSrc]))
getClassDirectories().setFrom(files([javaClasses, kotlinClasses]))
getExecutionData().setFrom(execution)
doLast() {
print "file://${reports.html.destination}/index.html"
}
}
在 运行 gradlew jacocoUiTestReportAllModules
之后,完整报道的报告将出现在 [projRoot]/build/coverage-report
。
我的项目结构如下:
--app
--module2 //library module
--module3 //library module
我正在为我的多模块 android 项目编写 仪器测试用例 ,jacoco 代码覆盖率。如果我从 'app' 模块执行检测测试用例,则仅为 'app' 模块 类.
生成代码覆盖率因此,为了获得 'module2' & 'module3' 类 的代码覆盖率;我已经在各个模块中编写了仪器测试用例。
当我在非应用程序模块中执行插桩测试用例时出现问题,无法启动主 activity,插桩期间应用程序未启动且测试用例失败。
根本原因是:
@Rule
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);
@Rule 未在启动 'MainActivity.class' 的 'module2' & 'module3' 中声明。由于一些循环依赖问题,我无法将 'MainActiviy' 导入这些模块。
错误:
java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar?
如何解决这个问题?
注意:此题专用于仪器测试,不用于单元测试(这已在单元测试中处理)
Similiar question
我已按照此
task jacocoUiTestReportAllModules(type: JacocoReport, dependsOn: 'createDebugCoverageReport') {
group "Reports"
description "Generate Jacoco Instrumented Tests coverage reports for all modules"
reports {
xml.enabled = true
html.enabled = true
html.destination file("${rootProject.buildDir}/coverage-report")
}
def javaClasses = []
def kotlinClasses = []
def javaSrc = []
def kotlinSrc = []
def execution = []
rootProject.subprojects.each { proj ->
javaClasses << fileTree(dir: "$proj.buildDir/intermediates/javac/debug", excludes: fileFilter)
kotlinClasses << fileTree(dir: "$proj.buildDir/tmp/kotlin-classes/debug", excludes: fileFilter)
javaSrc << "$proj.projectDir/src/main/java"
kotlinSrc << "$proj.projectDir/src/main/kotlin"
execution << fileTree(dir: proj.buildDir, includes: [
'outputs/code_coverage/debugAndroidTest/connected/**/*.ec'])
}
getSourceDirectories().setFrom(files([javaSrc, kotlinSrc]))
getClassDirectories().setFrom(files([javaClasses, kotlinClasses]))
getExecutionData().setFrom(execution)
doLast() {
print "file://${reports.html.destination}/index.html"
}
}
在 运行 gradlew jacocoUiTestReportAllModules
之后,完整报道的报告将出现在 [projRoot]/build/coverage-report
。