KMM项目注册Gradle任务时遭遇commonTest SourceSet未找到错误
解决KMM自定义一致性测试任务的Gradle问题
1. 确保SourceSet配置正确
先检查你的build.gradle.kts(Groovy则用build.gradle)中sourceSet的定义,conformanceTest需要正确融入KMM的sourceSet体系,同时关联commonTest的配置:
kotlin { sourceSets { val commonTest by getting val conformanceTest by creating { // 继承commonTest的依赖与源码结构 dependsOn(commonTest) kotlin.srcDir("src/conformanceTest/kotlin") resources.srcDir("src/conformanceTest/resources") // 配置测试依赖 dependencies { implementation(kotlin("test")) // 按需添加其他测试库,如kotest、mockk等 } } // 可选:配置各平台专属的conformanceTest(如Android、iOS) val androidConformanceTest by creating { dependsOn(conformanceTest) // 平台特定配置 } } }
2. 正确注册自定义测试任务
KMM的测试任务不能直接用常规Gradle Test任务,需贴合KMM的插件逻辑绑定sourceSet的输出与类路径,同时显式依赖编译任务避免时序问题:
// 注册通用conformance测试任务 tasks.register<Test>("conformanceTest") { // 确保先完成conformanceTest的编译 dependsOn(kotlin.sourceSets["conformanceTest"].compileTaskName) // 设置测试类路径:包含编译输出与运行时依赖 classpath = kotlin.sourceSets["conformanceTest"].runtimeClasspath // 指定测试类所在目录 testClassesDirs = kotlin.sourceSets["conformanceTest"].output.classesDirs // 配置测试执行引擎,比如JUnit Platform useJUnitPlatform() }
Groovy版本的build.gradle写法:
tasks.register('conformanceTest', Test) { dependsOn kotlin.sourceSets.conformanceTest.compileTaskName classpath = kotlin.sourceSets.conformanceTest.runtimeClasspath testClassesDirs = kotlin.sourceSets.conformanceTest.output.classesDirs useJUnitPlatform() }
3. 解决testClassesDirs为空的问题
之前用doFirst导致目录为空,本质是测试任务执行时编译任务还未完成,或是路径引用错误。上面的写法通过dependsOn强制编译优先执行,同时直接引用sourceSet的官方输出目录,避免手动拼接路径的误差。
另外确认项目结构是否符合预期:src/conformanceTest/kotlin下要有测试代码,同步Gradle后检查是否生成了compileConformanceTestKotlin这类编译任务。
4. 排查commonTest找不到的问题
若仍出现SourceSet with name 'commonTest' not found,需确保:
kotlin {}块中用by getting获取commonTest(而非by creating)- 升级Kotlin与KMM插件到最新稳定版本,避免兼容性问题
内容的提问来源于stack exchange,提问作者Maverick1st
相关产品推荐
相关产品推荐

