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



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

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

android{
      defaultConfig {
          //testInstrumentationRunner "my.custom.TestRunner"
           testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
      }
}

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

我试图通过迭代所有测试变量来改变testInstrumentationRunner。实际上有多个testInstrumentationRunner属性:

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

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

我怎么能改变testInstrumentationRunner(从gradle插件)动态?

我宁愿有2个不同的gradle任务,每个使用不同的testInstrumentationRunner,但测试相同的变体。因为我打算创建一个gradle插件的解决方案应该作为插件工作了。

您是否考虑过使用控制台参数作为两种配置之间的切换?就这么简单:

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

然后,例如,运行gradlew aDeb -PcustomRunner,如果你想测试使用自定义运行器或gradlew aDeb使用默认。

我知道这不是火箭科学,但越简单越好,对吧?你也可以在你的插件中使用它,只需要获取Project对象并做类似的事情。

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

查看github上的AndroidTestingBlueprint示例项目。

从@johan-stuyts得到赏金的解决方案工作得很好(或者至少它与android gradle插件1.2)。但它使用私有api,创建一个单独的模块更容易,也更适合未来使用。

我有一个类似的问题,我使用gradle的taskGraph。基于你的陈述"我的项目有两组不同的测试。"假设您定义了不同的任务,我将它们命名为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"
    }
}

这使您能够在配置之后但在执行之前设置testInstrumentationRunner的值。

这是部分解决方案,但这可能会使事情对您来说不那么麻烦:它不允许您在同一构建中使用两个测试运行器运行测试。如果你想这样做,你必须克隆DeviceProviderInstrumentTestTask的所有任务实例,在我看来,这太复杂和脆弱了。

这适用于我(Gradle 2.4和Android构建工具1.2.3)。它使用内部api,所以有可能在Android构建工具的下一个版本中不再工作。

您应该在项目评估完成后修改Android插件生成的任务。然后测试任务将使用这些更改。实际改变使用的测试运行器的属性是task.testVariantData.variantConfiguration.testedConfig.mergedFlavor.testInstrumentationRunner。而不是在配置阶段(即在任务之外)进行这些更改,这些更改是使用任务应用的,因此您的测试运行器仅在被请求时使用。通过强制测试任务在useMyTestRunner之后运行(如果后者是构建的一部分),当测试任务启动时,测试运行器的类名将被更改:

project.afterEvaluate {
    task useMyTestRunner << {
        tasks.withType(com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.class) { task ->
            task.testVariantData.variantConfiguration.testedConfig.mergedFlavor.testInstrumentationRunner = 'com.mycompany.MyTestRunner'
        }
    }
    tasks.withType(com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.class) { task ->
        task.mustRunAfter useMyTestRunner
    }
}

您现在可以使用为样式配置的默认测试运行器运行测试:

gradle :myApp:connectedAndroidTest

当您希望使用测试运行器运行测试时,请使用:

gradle :myApp:connectedAndroidTest :myApp:useMyTestRunner

我没有为null添加使用task.testVariantData.variantConfiguration.testedConfig.mergedFlavor.testInstrumentationRunner检索的任何属性的检查。您应该为健壮性添加它们。我认为至少testedConfig需要关注。参见getInstrumentationRunner()网址https://android.googlesource.com/platform/tools/build/+/master/builder/src/main/java/com/android/builder/VariantConfiguration.java

您可以在构建文件的顶部使用com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask的导入,因此您只需使用类的简单名称。

相关内容

  • 没有找到相关文章

最新更新