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

Java 通过spoon gradle插件从特定软件包运行仪器测试,java,android,spoon,android-instrumentation,Java,Android,Spoon,Android Instrumentation,我用的是罗马玛祖尔的。我能够一次运行所有测试,但我无法指定要启动的“组”测试。目前,我的勺子设置如下所示: spoon { debug = true baseOutputDir = file("$buildDir/spoon-log") if (project.hasProperty('spoonClassName')) { className = project.spoonClassName if (project.hasProper

我用的是罗马玛祖尔的。我能够一次运行所有测试,但我无法指定要启动的“组”测试。目前,我的勺子设置如下所示:

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;
}
--e package=com.mypackage.unit_tests
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;
    }
}
我的测试位于包中:

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

正如我在上面看到的,有一篇文章写道,您可以指定包,spoon runner应该在其中查找您的测试,示例如下:

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;
}
--e package=com.mypackage.unit_tests
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;
    }
}
所以我的想法是把这个属性放到instrumentationArgs中。因此,我创建了这样的勺子任务:

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;
}
--e package=com.mypackage.unit_tests
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
块在Gradle配置中的工作方式。 当你写这样的东西时

spoon {
  debug = true
}
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.
}
基本上可以修改与Gradle项目关联的单例对象。此项目包含由spoon插件创建的所有任务之间共享的配置。 Spoon插件为项目中定义的不同口味创建单独的任务(这样您就可以分别为每个口味运行测试)。还有一些任务,如
spoonSmall
spoonMedium
,只运行带有
@Small
@Medium
注释的测试。 所有这些任务都使用您使用
spoon{}
更改的同一配置对象

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

如果您想创建一个定制的spoon runner任务,您应该编写如下内容

spoon {
  debug = true
}
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.
}
您可以在中查看所有任务属性。其中大多数是在单个配置对象创建其任务时从该对象设置的

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

spoon {
  instrumentationArgs = ["package=${project.getProperty('spoonPackage')}"]
  noAnimations = true;
}
现在你可以跑了

./gradlew spoon -PspoonPackage=com.myapp.instrumentation.flowtests
因此,您将指定不同的项目属性,而不是在命令行中指定不同的任务


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

如何通过命令行属性传递多个设备列表?