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
相关产品推荐
相关产品推荐

