4

我正在使用Roman Mazur的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;
}

我的测试位于包中:

在此处输入图像描述

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

正如我在spoon的主git上看到的那样,您可以指定包,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

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

-e package com.myapp.instrumentation.flowtests

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

./gradlew spoon

在我使用之后:

./gradlew spoonAuthFlowTests

它还运行整个测试集。

4

1 回答 1

5

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

spoon {
  debug = true
}

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

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

如果你想创建一个自定义的勺子运行任务,你应该写类似

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 源中查看所有任务属性。它们中的大多数是由插件在创建其任务时从该单个配置对象设置的。

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

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

现在你可以运行

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

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

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

于 2016-01-21T07:47:28.303 回答