如何单独运行Android单渠道单元测试而跳过通用测试?
Android渠道专属单元测试独立运行配置方案
问题背景
我正在为Android应用编写单元测试,项目在default.gradle中配置了flavor1和flavor2两个产品渠道。通用测试代码放在test目录,渠道专属测试分别放在flavor1Test和flavor2Test目录,应用包含多个模块,每个模块的测试配置逻辑一致。
当前执行./gradlew testFlavor1UnitTest时,Gradle会同时运行test和flavor1Test目录下的所有测试。需要实现两个目标:
- 执行渠道专属测试任务(如
testFlavor1UnitTest)时,仅运行对应渠道测试目录的测试,跳过通用test目录 - 保留单独运行通用
test目录测试的能力,即执行./gradlew test时仍能正常运行通用测试
解决方案
核心思路
Gradle默认会将通用test源集的代码纳入所有渠道测试任务的类路径,因此需要通过修改源集关联关系和测试任务配置,让渠道测试任务仅绑定自身的测试源,同时保留通用测试任务的独立性。
具体配置
在default.gradle中添加以下配置(保留原有配置的基础上补充):
1. 配置渠道测试源集独立化
修改sourceSets块,为每个渠道测试源集指定独立的目录,并手动配置类路径,避免继承通用test源集:
sourceSets { // 原有配置保留 release { java.srcDirs += ['src/prod/java'] } debug { res.srcDirs += ['src/debug/res'] assets.srcDirs = ['src/debug/assets'] } test { resources.srcDirs += ["$rootDir/dependencies/resources"] } // 配置flavor1专属测试源集 flavor1Test { java.srcDirs = ['src/flavor1Test/java'] resources.srcDirs = ['src/flavor1Test/resources'] // 手动配置编译和运行时类路径,依赖主代码和测试依赖 compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath runtimeClasspath += sourceSets.main.output + configurations.testRuntimeClasspath } // 配置flavor2专属测试源集 flavor2Test { java.srcDirs = ['src/flavor2Test/java'] resources.srcDirs = ['src/flavor2Test/resources'] compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath runtimeClasspath += sourceSets.main.output + configurations.testRuntimeClasspath } }
2. 调整渠道测试任务的扫描范围
通过任务规则,让所有渠道测试任务仅加载自身源集的测试类:
tasks.withType(Test) { if (name.startsWith('testFlavor')) { // 提取渠道名称,匹配对应的测试源集 def flavorTestSourceSetName = name.replace('test', '').replace('UnitTest', '').toLowerCase() + 'Test' // 指定测试类目录和类路径为渠道专属源集的内容 testClassesDirs = sourceSets[flavorTestSourceSetName].output.classesDirs classpath = sourceSets[flavorTestSourceSetName].runtimeClasspath } }
验证方法
- 执行
./gradlew testFlavor1UnitTest:仅运行flavor1Test目录下的测试,通用test目录测试不执行 - 执行
./gradlew test:正常运行test目录下的所有通用测试 - 执行
./gradlew testFlavor2UnitTest:仅运行flavor2Test目录下的测试
内容的提问来源于stack exchange,提问作者Barry Fruitman
相关产品推荐
相关产品推荐

