如何使用gradle动态切换/更改testInstrumentationRunner

tha*_*sma 22 android gradle android-testing android-gradle-plugin

我的项目有两组不同的测试.一个组仅使用默认运行,另一个组AndroidJUnitRunner必须使用自定义实现运行TestRunner extends MonitoringInstrumentation.

目前我每次需要运行另一组测试时都会testInstrumentationRunner通过编辑来切换build.gradle:

android{
      defaultConfig {
          //testInstrumentationRunner "my.custom.TestRunner"
           testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
      }
}
Run Code Online (Sandbox Code Playgroud)

我知道口味可以有自己的味道,testInstrumentationRunner但我目前的应用程序已经有2个flavourDimensions.使用flavor实际上是为了拥有不同版本的app.我需要2个版本的测试应用程序,都使用不同的testInstrumentationRunners 测试相同的应用程序.

我尝试testInstrumentationRunner通过迭代所有测试变体来改变.实际上有多个testInstrumentationRunner属性:

android.testVariants.all { TestVariant variant ->
    //readonly
    variant.variantData.variantConfiguration.instrumentationRunner

    variant.variantData.variantConfiguration.defaultConfig.testInstrumentationRunner

}
Run Code Online (Sandbox Code Playgroud)

但是一旦android.testVariants调用,构建就会被配置,并且所有更改都不会反映在构建中.

如何动态更改testInstrumentationRunner(从gradle插件)?

我更喜欢有2个不同的gradle任务,每个任务使用不同的testInstrumentationRunner但是测试相同的变体.因为我打算创建一个gradle插件,所以解决方案也应该像插件一样工作.

Dmi*_*ide 9

您是否考虑过使用控制台参数作为两种配置之间的切换?就如此容易:

android {
      defaultConfig {
           if (project.ext.has("customRunner")) {
               testInstrumentationRunner "my.custom.TestRunner"
           } else {
               testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
           }
      }
}
Run Code Online (Sandbox Code Playgroud)

然后,例如,gradlew aDeb -PcustomRunner如果您想使用自定义运行程序进行测试或gradlew aDeb使用默认运行程序,则运行。

我知道这不是火箭科学,但越简单越好,对吧?您也可以在插件中使用它,只需获取 Project 对象并执行类似的操作即可。


tha*_*sma 5

由于android gradle插件1.3,可以创建单独的测试模块。每个测试模块都可以具有自己的testInstrumentationRunner。

有关详细示例,请参见github上的AndroidTestingBlueprint示例项目。

来自@ johan-stuyts的解决方案可以很好地工作(或者至少它与android gradle插件1.2兼容)。但是它使用私有API,并且创建一个单独的模块更加容易,并且可以面向未来。

  • 该示例项目未在单个项目中说明多个测试模块,实际上它无法正确构建。 (3认同)

小智 2

我有一个类似的问题,我使用了gradle的taskGraph。根据您的陈述“我的项目有 2 组不同的测试”。我假设您定义了不同的任务,我将它们称为 testGroupOne 和 testGroupTwo:

task testGroupOne{
}
task testGroupTwo{
}
gradle.taskGraph.whenReady {taskGraph ->
    if(taskGraph.hasTask(testGroupOne)){
        testInstrumentationRunner "my.custom.TestRunner"
    } else if (taskGraph.hasTask(testGroupTwo)){
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}
Run Code Online (Sandbox Code Playgroud)

这使您可以在配置之后、执行之前设置 testInstrumentationRunner 的值。