如何在Gradle上仅运行一个本地测试类


429

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

我想知道是否有任何命令只能执行一个本地测试类,类似于SBT中的“ testonly”。


有了答案,应该清楚这是关于本地测试,而不是仪器化测试。Android / Gradle通过将这些本地测试称为“单元”测试,使事情变得混乱。
tir38

Answers:


560

要运行一个单独的测试班,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参数不受支持,并且会出现错误。


过滤方法可以很可能还可以与任务相结合的规则对于一些方便的测试选择
马特·惠普尔

对于大型测试套件,即使--tests用于在类中调用单个测试方法,我们也会看到所有类(甚至是所有未运行的类)上的迭代,这太慢了。不知道这种缓慢是由于我们的环境造成的还是会影响其他人。如果有更多信息,可以更新。
arntg

185

gradle -Dtest.single=ClassUnderTestTest test如果您要测试单个类或使用regexp,则可以执行此操作,例如gradle -Dtest.single=ClassName*Test test可以在此链接第23.12节中找到更多测试过滤类的示例。测试。


30
最新版本(从1.10左右开始)支持--tests命令行选项,该选项设置为replace -DtestTaskName.single
Peter Niederwieser 2014年

58
使用该--test选项,您还可以将测试限制为测试类中的单个方法。例如: gradle test --tests *MyTest.someMethod 将仅someMethod在您的MyTest班级中运行单个测试。在构建测试用例时,通常一次只运行一个方法,以使其更容易专注于需要调试的输出,然后最后运行整个测试用例。
杰夫·法兰西

10
同样值得注意的是,如果要在多模块项目中运行单个测试,则命令为gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test。请参见上gradle.org讨论
布拉特

2
您可能还想使用一个--no-rebuild选项,例如gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:test,防止重建依赖关系,从而更快地执行单个测试。
falconepl '16

2
这个选项在摇篮5虽然过时
的Eyal

108

如果您有一个多模块项目:

假设您的模块结构是

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

而您要运行的test(testToRun)在b模块中,具有完整路径:com.xyz.b.module.TestClass.testToRun

如此处所示,您有兴趣在b模块中运行测试,因此您应该看到可用于b模块的任务。

./gradlew :b-module:tasks

上面的命令将列出带有描述的b模块中的所有任务。在理想情况下,您将有一个名为test的任务,以在该模块中运行单元测试。

./gradlew :b-module:test

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

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

现在,如果您运行,则代替此

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

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


1
或者简单地说./gradlew :b-module:test --tests testToRun
艾哈迈德·阿瑟

32

经过一番摸索,以下对我有用:

gradle test --tests "a.b.c.MyTestFile.mySingleTest"


10
该命令对我不起作用。>错误:未知命令行选项“--tests”
Tarkik

31

请注意,--tests如果您使用不同的版本types/flavors(失败Unknown command-line option '--tests'),则该选项可能不起作用。在这种情况下,有必要指定特定的测试任务(例如testProdReleaseUnitTest而不是test


6
碰到这种确切情况谢谢!
JPM

您能否详细说明一个例子?我正在尝试运行3个与使用通配符匹配的测试,但./gradlew test --tests *testMyCollectionTake*我不知道应该如何test用通配符替换测试名称
DanielCuadra

4

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

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

下面的示例运行com.example.TestClass带有variant的类Variant_1

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

2

您应该尝试在最后添加星号(*)。

gradle测试-测试“ com.abc *”


2

运行一个名为MyTest的测试:

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

0

就我而言,我的eclipse java编译器警告设置得太高,而eclipse不能识别我的类对于执行有效。更新我的编译器设置可以解决此问题。您可以在此处阅读有关此内容的更多信息:注解-无法为空-无法解析

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.