【问题标题】:Running instrumentation tests from specific package via spoon-gradle plugin通过spoon-gradle插件从特定包运行仪器测试
【发布时间】:2016-01-08 14:57:38
【问题描述】:

我正在使用 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,它应该能够编辑勺子中的一些属性。

正如我在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

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

-e package com.myapp.instrumentation.flowtests

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

./gradlew spoon

在我使用之后:

./gradlew spoonAuthFlowTests

它还运行整个测试集。

【问题讨论】:

    标签: java android spoon android-instrumentation


    【解决方案1】:

    您的问题是您错误地解释了 spoon 块在 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 个包的测试。您将不得不使用不同的值调用它两次。

    【讨论】:

    • 如何通过命令行属性传递多个设备列表?
    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多