java - 通过 spoon-gradle 插件从特定包运行仪器测试

标签 java android spoon android-instrumentation

我正在使用 spoon-gradle-plugin来自罗马马祖尔。我能够一次运行所有测试,但我无法指定我想要启动的“组”测试。目前我的勺子设置如下所示:

spoon {
    debug = true

    baseOutputDir = file("$buildDir/spoon-log")
    if (project.hasProperty('spoonClassName')) {
        className = project.spoonClassName

        if (project.hasProperty('spoonMethodName')) {
            methodName = project.spoonMethodName
        }
    }

    adbTimeout = 60 * 60;
}

我的测试位于包中:

enter image description here

我的目标是创建独立的 gradle 任务,这些任务依赖于 spoon 来分别从每个包启动测试。 Roman 给了我们参数 instrumentationArgs它应该能够编辑勺子中的某些属性。

正如我在 main git of spoon 上看到的那样上面写着你可以指定包,spoon-runner 应该在其中查找你的测试,示例如下:

--e package=com.mypackage.unit_tests

所以我的想法是将此属性放入 instrumentationArgs 中。因此,我创建了这样的勺子任务:

task spoonAuthFlowTests(type: GradleBuild, dependsOn: ['spoon']) {
    spoon {
        instrumentationArgs = ["package=com.myapp.instrumentation.flowtests.AuthFlowTests"]
        noAnimations = true;
    }
}

task spoonFlowTests(type: GradleBuild, dependsOn: ['spoon']) {
    spoon {
        instrumentationArgs = ["package=com.myapp.instrumentation.flowtests"]
        noAnimations = true;
    }
}

我能说的是 noAnimations 参数很好地扩展了默认的勺子配置,防止创建 gif。所以 instrumentationArgs 肯定会采用我的字符串数组,但不会应用更改,因为在我的终端中:

2016-01-08 15:13:10 [SDR.run] About to actually run tests for [04ffe19ad317d2e7]
03:13:10 I/RemoteAndroidTest: Running am instrument -w -r   -e package com.myapp.instrumentation.flowtests -e class com.myapp.instrumentation.flowtests.AuthFlowTests.LoginUserFlowTests com.myapp.debug1.test/com.myapp.instrumentation.helper.runner.MyAppTestRunner on lge-nexus_4-04ffe19ad317d2e7

不管我用“package”属性做什么,我总是收到结果:

-e package com.myapp.instrumentation.flowtests

我想改变它,但不知道如何。此外,我可以说我试图在我的项目“com.myapp.instrumentation.flowtests”字符串中查找,唯一使用它的位置是:包中的测试 + 上面介绍的 gradle 任务。所以它没有在任何地方硬编码。如果我通过以下方式开始测试,则会选择相同的位置:

./gradlew spoon

在我使用之后:

./gradlew spoonAuthFlowTests

它还运行整个测试集。

最佳答案

您的问题是您错误地解释了 spoon block 在 Gradle 配置中的工作方式。 当你写类似的东西时

spoon {
  debug = true
}

您基本上修改了与您的 Gradle 项目关联的单例对象。该项目包含一个在 spoon 插件创建的所有任务之间共享的配置。 Spoon 插件为项目中定义的不同口味创建单独的任务(以便您可以分别为每种口味运行测试)。还有一些任务,如 spoonSmallspoonMedium 仅运行带有 @Small@Medium 注释的测试。 所有这些任务都使用您使用 spoon {} 更改的相同配置对象。

因此,当您在任务定义中调用 spoon {} 时,您只需覆盖现有值即可。并应用最后的值。

如果你想创建一个自定义的 spoon runner 任务,你应该这样写

import com.stanfy.spoon.gradle.SpoonRunTask
task spoonAuthFlowTests(type: SpoonRunTask) {
  instrumentationArgs = ['package=com.myapp.instrumentation.flowtests.AuthFlowTests']
  // But you will have to set many other options on the tasks,
  // like instrumentationApk and applicationApk files.
}

您可以在 SpoonRunTask sources 中查看所有任务属性.其中大部分是从单个配置对象设置的 by the plugin当它创建任务时。

如果这听起来太复杂,您可以选择不同的方式。使用可在命令行中定义的项目属性配置参数。

spoon {
  instrumentationArgs = ["package=${project.getProperty('spoonPackage')}"]
  noAnimations = true;
}

现在你可以跑了

./gradlew spoon -PspoonPackage=com.myapp.instrumentation.flowtests

因此,您无需在命令行中指定不同的任务,而是指定不同的项目属性。

缺点是您将无法通过一次 gradle 调用为 2 个包运行测试。您必须使用不同的值调用它两次。

关于java - 通过 spoon-gradle 插件从特定包运行仪器测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34679937/

相关文章:

android - 如何使用 jacoco 和 Spoon 生成 .xml 或 .html

java - String.format() 格式参数

java - 按下背面按钮我想从适配器转到上一个 Activity

android - 在网络响应后将参数应用于 fragment 时出现 IllegalStateException

android - Eclipse Juno 安装依赖(离线解决)

android - 使用 Gradle Spoon 插件在特定位置启动测试

android - 使用 Espresso 和 Spoon 运行特定测试

java - 如何使用 Java Streams API 在两个相同维度的列表之间进行元素明智的乘法

java - synchronized(this) 和 synchronized(ClassName.class) 有什么区别?

java - 将下拉列表和文本框中的值传递给 JSP 中的 JavaScript