【问题标题】:How to run only one unit test class using Gradle如何使用 Gradle 只运行一个单元测试类
【发布时间】:2014-04-25 16:17:06
【问题描述】:

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

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

【问题讨论】:

  • 给出答案,应该清楚这是关于本地测试,而不是仪器测试。 Android / Gradle 将这些本地测试称为“单元”测试,从而使事情变得混乱。
  • 将措辞从“本地测试”改为“单元测试”,因为“本地测试”似乎是 Android 特有的概念,但这个问题比这更笼统。

标签: unit-testing testing gradle


【解决方案1】:

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

如果您想测试单个类或使用像gradle -Dtest.single=ClassName*Test test 这样的正则表达式,您可以使用gradle -Dtest.single=ClassUnderTestTest test,您可以找到更多用于测试的过滤类示例under this link

Gradle 5 删除了这个选项,因为它被 test filtering 使用 --tests 命令行选项取代。

【讨论】:

    【解决方案2】:

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

    使用一些命令行选项,找到here,你可以简单地做这样的事情。

    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
    

    从 1.10 版的 gradle 开始,它支持选择测试,使用 test filter。例如,

    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 的常见用例),check this answer,因为 --tests 参数将不受支持,您会收到错误消息。

    【讨论】:

    • 过滤器方法可能还可以与任务规则结合使用,以便进行一些方便的测试选择
    • 对于大型测试套件,即使使用--tests 调用类中的单个测试方法,我们也会看到所有类的迭代,甚至所有未运行的类,这太慢了。不知道这种缓慢是由于我们的环境还是会影响其他人。如果发现更多可以更新。
    • 如果你需要测试一个嵌套类gradle test --tests org.gradle.SomeTest$NestedClassTest
    【解决方案3】:

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

    让我们说你的模块结构是

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

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

    因为这里你有兴趣在 b-module 中运行测试,所以你应该看到可用于 b-module 的任务。

    ./gradlew :b-module:tasks
    

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

    ./gradlew :b-module:test
    

    现在,你已经到了运行 b-module 中所有测试的地步了,最后你可以给上面的任务传递一个参数来运行匹配特定路径模式的测试

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

    现在,如果你运行,而不是这个

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

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

    【讨论】:

    • 或者干脆./gradlew :b-module:test --tests testToRun
    • 有没有办法通过底层测试来确定有问题的模块?我想重新运行仅在我们的 Jenkins 上失败的测试。但我也没有从 Jenkins 那里得到模块信息。
    【解决方案4】:

    经过深思熟虑,以下对我有用:

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

    【讨论】:

    • 这个命令对我不起作用。 > 错误:未知的命令行选项“--tests”
    【解决方案5】:

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

    【讨论】:

    • 遇到这种情况谢谢!
    • 你能详细说明一个完整的例子吗?我正在尝试使用 ./gradlew test --tests *testMyCollectionTake* 运行与通配符匹配的 3 个测试,但我不知道应该如何将 test 替换为通配符测试名称
    • 还要注意test任务必须专门使用;例如,check 任务不能使用。
    • @DanielCuadra 试试./gradlew testDebug --tests "*testMyCollectionTake*"
    【解决方案6】:

    以下是使用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 
    

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        您应该尝试在末尾添加星号 (*)。

        gradle 测试 --tests "com.a.b.c.*"

        【讨论】:

          【解决方案9】:

          运行一个名为 MyTest 的测试:

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

          【讨论】:

            【解决方案10】:

            这对我有用

            • 发布案例:

              gradle testReleaseUnitTest --tests testClass

            • 调试案例:

              gradle testDebugUnitTest --tests AsyncExecutorTest

            您可以通过以下方式查看项目:gradle -q projects 并移至要测试的类所在的项目

            【讨论】:

              【解决方案11】:

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

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

              要运行某些测试方法,使用相同的命令,但使用测试名称:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-06-23
                • 1970-01-01
                • 1970-01-01
                • 2013-08-06
                • 1970-01-01
                • 2015-08-25
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多