Gradle:如何排除某些测试?

43

src/test/文件夹中包含单元测试和功能测试。功能测试的类路径中包含单词cucumber,而单元测试则没有。那么,我如何只运行单元测试呢?

非常感谢。

P.S.:我知道使用“包含”逻辑来选择测试很容易。例如,在我的情况下仅运行功能测试,我可以简单地使用此命令:
./gradlew test -Dtest.single=cucumber/**/
但是,我不知道如何简单地排除测试。

顺便说一下,我正在使用gradle 1.11。

4个回答

38

信用: 这篇回答的灵感来自JB Nizet的答案。它被发布是因为它更直接地回答了我的问题。

要仅运行单元测试,请创建一个新任务,如下所示:

task unitTest( type: Test ) {
    exclude '**/cucumber/**'
}

这样我们就有了:
运行所有测试:./gradlew test
运行所有单元测试:./gradlew unitTest
运行所有功能测试:./gradlew test -Dtest.single=cucumber/**/


如果你正在使用"./gradle build"运行测试,我认为你需要在"./gradlew unitTest"中添加"-x test",以避免在构建时同时运行test和unitTest。 - Raul G

33

该任务的文档解释了它,包括示例和其他细节:

apply plugin: 'java' // adds 'test' task

test {
  // ...

  // explicitly include or exclude tests
  include 'org/foo/**'
  exclude 'org/boo/**'

  // ...
}

6
@JB Nizet:这将永久排除一些测试。它不够灵活。如果我有时想运行所有的测试怎么办?是否可以创建一个名为“unitTest”的任务,它扩展了“test”任务但带有一些过滤? - JBT
7
创建一个名为cucumberTest的新任务,类型为Test,仅包含黄瓜测试,并创建第三个任务allTests,它依赖于testcucumberTest。然后可以运行test来运行单元测试,运行cucumberTest来运行黄瓜测试,运行allTests来运行所有测试。 - JB Nizet
1
@user447607 什么?我简直是从文档中复制粘贴了这个示例。你有点击链接吗? - JB Nizet
1
好的,我找到了,但它对我仍然不起作用。 很自然地,我首先尝试了它。 - user447607
org/foo/** 是路径还是包? - jpganz18
显示剩余2条评论

15

您可以基于外部系统属性来排除此内容。

-Dtest.profile=integration

并在 build.gradle 文件中

test {
    if (System.properties['test.profile'] != 'integration') {
    exclude '**/*integrationTests*'
   }
}

5

你也可以在build.gradle中定义自定义标志:

test {
    if (project.hasProperty('excludeTests')) {
        exclude project.property('excludeTests')
    }
}

然后在命令行中:

gradle test -PexcludeTests=com.test.TestToExclude

1
参考 Mathijs de Groot 的博客:https://blog.jdriven.com/2017/10/run-one-or-exclude-one-test-with-gradle/ - Arne Burmeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接