Android 非';app&x27;模块

Android 非';app&x27;模块,android,code-coverage,jacoco,ui-testing,android-instrumentation,Android,Code Coverage,Jacoco,Ui Testing,Android Instrumentation,我的项目结构如下: --应用程序 --模块2//库模块 --模块3//库模块 我正在为我的多模块android项目编写测试用例,该项目包含jacoco代码覆盖范围。如果我从“app”模块执行插装测试用例,则只为“app”模块类生成代码覆盖率 因此,为了获得“module2”和“module3”类的代码覆盖率;我在各个模块中编写了仪器测试用例 当我在非应用程序模块中执行插装测试用例、无法启动主活动、插装期间应用程序未启动以及测试用例失败时,会出现问题 根本原因是: @Rule public Act

我的项目结构如下:

--应用程序

--模块2//库模块

--模块3//库模块

我正在为我的多模块android项目编写测试用例,该项目包含jacoco代码覆盖范围。如果我从“app”模块执行插装测试用例,则只为“app”模块类生成代码覆盖率

因此,为了获得“module2”和“module3”类的代码覆盖率;我在各个模块中编写了仪器测试用例

当我在非应用程序模块中执行插装测试用例、无法启动主活动、插装期间应用程序未启动以及测试用例失败时,会出现问题

根本原因是:

@Rule
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);
如何解决这个问题

NB:这个问题专门针对仪器测试,而不是单元测试(这已经在单元测试中处理过了)

我遵循了这一点,并根据我的要求更改了梯度任务。 添加渐变任务以供参考

 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"

    }
}
任务jacocoUiTestReportAllModules(类型:JacocoReport,dependsOn:'createDebugCoverageReport'){
组“报告”
说明“为所有模块生成Jacoco仪表化测试覆盖率报告”
报告{
xml.enabled=true
html.enabled=true
html.destination文件(“${rootProject.buildDir}/coverage report”)
}
def javaClasses=[]
def kotlinClasses=[]
def javaSrc=[]
def kotlinSrc=[]
def执行=[]
rootProject.subprojects.each{proj->

javaClasses关于
MainActivity
的一些内容不清楚。您提到
module2
module3
中的测试代码有
规则
来启动
MainActivity
,但是
MainActivity
应用程序
模块中?我猜
module2
module3
只是一个例子在
应用程序
模块中使用的,并且它们没有任何
活动
类。您可以通过以下两种方式之一来实现这一点:1)如果测试用例需要
上下文
,您可以使用instrumentation test
上下文
而不是您的应用程序
上下文
来实现某些测试的依赖性。2)Impl一个可以由仪器测试用例启动的
活动
。该活动的代码应该在
androidTest
文件夹中,您需要管理
AndroidManifest.xml
andoidTest
来声明
活动
@ahasbini是否可以启动app
main活动
from module2/module3库模块?如果
app
依赖于
module2/module3
,则在检测测试期间无法启动
MainActivity
,因为
MainActivity
不属于
module2/module3
main
androidTest
代码。为模块运行检测测试时,Android Studio/Gradle编译该模块的
main
androidTest
代码以及它所依赖的子模块的
main
代码。在这种情况下,我需要在
app
模块本身中编写仪器测试用例,并遵循以下步骤。
 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"

    }
}