You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android多模块间共享Instrumentation测试方案咨询

解决方案:剥离共享UI组件的Instrumentation测试到独立模块

当然可以!这种重复编写测试的问题确实很头疼,把共享UI的Instrumentation测试剥离到独立模块是非常合理的方案——既能减少冗余代码,又能统一维护测试逻辑,还能实现你想要的“指定业务APK运行测试套件”的需求。下面是具体的实现步骤:

1. 创建独立的测试模块

在你的Project下新建一个Android Library类型的模块(比如命名为CommonUITestModule),这个模块专门存放所有共享UI组件的Instrumentation测试代码。

注意:选择Android Library而非Test模块,这样我们可以更灵活地配置它与不同业务模块的关联。

2. 配置测试模块的Gradle依赖

在CommonUITestModule的build.gradle(或build.gradle.kts)中进行如下配置:

android {
    compileSdk 34 // 保持与业务模块、Common UI库一致的SDK版本

    defaultConfig {
        minSdk 21 // 根据你的应用支持范围调整
        targetSdk 34

        // 核心配置:接收外部传入的目标业务模块参数,默认值设为Module1
        def targetModule = project.findProperty("targetModule") ?: "Module1"
        // 指定测试要关联的目标应用模块
        targetProjectPath = ":$targetModule"
        // 指定测试运行器
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        debug {
            // 确保测试模块使用debug变体,和业务模块的debug APK匹配
            matchingFallbacks = ['debug']
        }
    }
}

dependencies {
    // 依赖Common UI库,让测试代码能访问到要测试的UI组件
    implementation project(":CommonUILibrary")

    // 引入Instrumentation测试所需的依赖
    androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1"
    androidTestImplementation "androidx.test.ext:junit:1.1.5"
    androidTestImplementation "androidx.test:runner:1.5.2"
    androidTestImplementation "androidx.test:rules:1.5.2"
}

3. 编写共享测试代码与测试套件T

在CommonUITestModule的src/androidTest/java目录下,编写所有针对Common UI组件的测试代码(比如登录页面、通用列表组件的测试)。

然后创建你需要的测试套件T,把需要批量运行的测试类整合起来:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
    LoginPageUITest.class,
    CommonListUITest.class,
    SettingsPanelUITest.class
    // 添加所有需要纳入套件T的测试类
})
public class TestSuiteT {}

4. 命令行指定业务APK运行测试套件

现在你可以通过Gradle命令,指定不同的业务模块运行测试套件T:

针对Module1运行测试套件T

./gradlew :CommonUITestModule:connectedAndroidTest -PtargetModule=Module1 -Pandroid.testInstrumentationRunnerArguments.class=com.yourpackage.TestSuiteT

针对Module2运行测试套件T

./gradlew :CommonUITestModule:connectedAndroidTest -PtargetModule=Module2 -Pandroid.testInstrumentationRunnerArguments.class=com.yourpackage.TestSuiteT

小技巧:如果觉得命令太长,可以在项目根目录的build.gradle中自定义Gradle任务,比如:

task runTestsForModule1(type: GradleBuild) {
    tasks = [":CommonUITestModule:connectedAndroidTest"]
    startParameter.projectProperties = [
        "targetModule": "Module1",
        "android.testInstrumentationRunnerArguments.class": "com.yourpackage.TestSuiteT"
    ]
}

之后只需执行./gradlew runTestsForModule1即可快速运行Module1的测试套件。

额外注意事项

  • 确保Module1和Module2都正确依赖CommonUILibrary,这样它们的APK中才包含测试所需的UI组件;
  • 如果测试需要访问业务模块的特定资源/配置,尽量通过Common UI库封装的接口获取,避免测试代码直接依赖业务模块;
  • 保持测试模块的编译SDK、minSdk版本与业务模块一致,避免兼容性问题;
  • 可以通过-Pandroid.testInstrumentationRunnerArguments.package参数指定测试包,替代单个测试套件,实现更灵活的测试范围控制。

内容的提问来源于stack exchange,提问作者smk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:54:35