如何使用Gradle只运行一个单元测试类

我是Gradle的新手。我使用的是Gradle 1.10和Ubuntu 13。

我想知道是否有任何命令只执行一个单元测试类,类似于SBT中的testOnly

459946 次浏览

在Gradle 5之前的版本中,test.single系统属性可以用来指定单个测试。

如果您想测试单个类,可以使用gradle -Dtest.single=ClassUnderTestTest test,或者使用gradle -Dtest.single=ClassName*Test test这样的regexp,您可以找到更多为测试在此连结下筛选类的示例。

Gradle 5删除了这个选项,因为它被使用--tests命令行选项的测试过滤所取代。

要运行单个测试类,Airborn的答案很好。

通过使用一些命令行选项(找到在这里),您可以简单地执行如下操作。

gradle test --tests org.gradle.SomeTest.someSpecificFeature
gradle test --tests '*SomeTest.someSpecificFeature'
gradle test --tests '*SomeSpecificTest'
gradle test --tests 'all.in.specific.package*'
gradle test --tests '*IntegTest'
gradle test --tests '*IntegTest*ui*'
gradle test --tests '*IntegTest.singleMethod'
gradle someTestTask --tests '*UiTest' someOtherTestTask --tests '*WebTest*ui'

从gradle 1.10版本开始,它支持选择测试,使用测试过滤器。例如,

apply plugin: 'java'


test {
filter {
//specific test method
includeTestsMatching "org.gradle.SomeTest.someSpecificFeature"


//specific test method, use wildcard for packages
includeTestsMatching "*SomeTest.someSpecificFeature"


//specific test class
includeTestsMatching "org.gradle.SomeTest"


//specific test class, wildcard for packages
includeTestsMatching "*.SomeTest"


//all classes in package, recursively
includeTestsMatching "com.gradle.tooling.*"


//all integration tests, by naming convention
includeTestsMatching "*IntegTest"


//only ui tests from integration tests, by some naming convention
includeTestsMatching "*IntegTest*ui"
}
}

对于多风格环境(Android的常见用例),检查这个答案作为--tests参数将不受支持,您将得到一个错误。

如果你有一个多模块的项目:

假设您的模块结构是

root-module
-> a-module
-> b-module

并且您希望运行的测试(testToRun)位于b模块中,具有完整的路径:com.xyz.b.module.TestClass.testToRun

因为这里您感兴趣的是在b模块中运行测试,所以您应该看到b模块可用的任务。

./gradlew :b-module:tasks
上面的命令将列出b-module中的所有任务,并附有描述。 在理想情况下,您将有一个名为测验的任务来运行该模块中的单元测试
./gradlew :b-module:test

现在,您已经到达了在b模块中运行所有测试的位置,最后您可以将一个参数传递给上面的任务以运行与特定路径模式匹配的测试

./gradlew :b-module:test --tests "com.xyz.b.module.TestClass.testToRun"

现在,如果你跑的话

# EYZ0

它将同时运行模块a和模块b的测试任务,这可能会导致失败,因为在模块a中没有匹配上述模式的内容。

经过深思熟虑后,我发现以下方法对我很有效:

# EYZ0

请注意,--tests选项可能无法工作,如果你有不同的构建types/flavors(失败与Unknown command-line option '--tests')。在这种情况下,有必要指定特定的测试任务(例如testProdReleaseUnitTest而不是test)

下面是使用gradlew命令行选项运行单个测试类的命令:

gradlew.bat Connected**your bundleVariant**AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass

下面的例子运行类com.example.TestClass和变量Variant_1:

gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass

在我的例子中,我的eclipse java编译器警告设置得太高,eclipse没有将我的类识别为可以执行的有效类。更新我的编译器设置解决了这个问题。你可以在这里阅读更多关于它:annotation-nonnull-cannot-be-resolved

你应该试着在结尾加上星号。

Gradle测试-测试“com.a.b.c *”

运行一个名为MyTest的测试:

./gradlew app:testDebug --tests=com.example.MyTest

这对我很有效

  • < p >释放的例子:

    gradle testReleaseUnitTest——测试testClass

  • < p >调试情况:

    gradle testDebugUnitTest——测试AsyncExecutorTest

您可以使用:gradle -q projects查看项目,并移动到要测试的类所在的项目

对于多模块项目,有必要使用模块的名称和buildType:

./gradlew :module_name:testDebugUnitTest --tests com.package_name.TestsClass.*

运行一些测试方法,使用相同的命令,但是使用test的名称:

./gradlew :module_name:testDebugUnitTest --tests com.package_name.TestsClass.test