如何使用 Gradle 运行多个命名测试?

Posted

技术标签:

【中文标题】如何使用 Gradle 运行多个命名测试?【英文标题】:How to run multiple named tests with Gradle? 【发布时间】:2018-11-08 08:28:01 【问题描述】:

我知道怎么说

gradle test --tests mypackage.MyTest

但是如何指定多个?

gradle test --tests mypackage.MyTest,mypackage.model.ModelTest,BasicTests

这似乎只是随机运行其中一项测试。

gradle test --tests mypackage.MyTest mypackage.model.ModelTest BasicTests

这告诉我

在根项目“myproject”中找不到任务“mypackage.model.ModelTest”。

我阅读了很多手册和教程(以及一些 SO 帖子),但没有明确提及答案。但我看到有人通过 --tests "somepackage.*" 作为参数,所以我认为空格周围的引号可能会有所帮助。

gradle test --tests "mypackage.MyTest mypackage.model.ModelTest BasicTests"

这不会很快失败,但不幸的是只运行列表中的第一个测试。

所以我想我只是被“--tests”中的复数形式误导了,没有办法真正给它一个列表,对吧?

【问题讨论】:

【参考方案1】:

这是一个简单的例子,如果有人在之后,我就是。

--tests "test.packageFoo.*" --tests "test.packageBar.*"

如果您只有另一个 --tests,它会很好用。此示例不在文档中。

【讨论】:

【参考方案2】:

Testing in Java & JVM projects 上的文档文章非常清楚 --tests 选项的工作原理。它只是一个包容性过滤器,用于注册要执行的所有匹配测试,就像在 Test 任务的 filter 块中使用 includeTestsMatching 一样:

test 
    filter 
        includeTestsMatching 'org.gradle.internal.*'
    

这也是参数名称中使用复数的原因,因为通配符允许包含任意数量的测试。

注意通配符'*''.'包分隔符没有特别的理解。它纯粹基于文本。所以--tests *.SomeTestClass 将匹配任何包,无论其“深度”如何。

从 Gradle 4.7 开始,如果过滤器以大写字母开头,则可以使用没有包信息的简单类名。

要包含不共享通用包结构的多个测试,您必须并且可以使用多个 --tests 参数,如文档中所述:

另请注意,可以提供多个--tests 选项,其所有模式都会生效。

可以在上面的链接和这个相关问题中找到有关测试过滤器的其他信息:

How to run only one test class on gradle


关于您的一种方法为何不起作用的附加信息:

在命令行上执行 Gradle 符合如下结构。任务名称前后都可以有选项。

gradle [taskName...] [--option-name...]

在您的第三个示例中,--tests 选项的其他选项被解释为任务名称,这解释了错误消息,因为具有指定名称的任务不存在。

为防止选项值和任务名称混淆并阻止任何 shell 干扰,您应该按照Mr Haki in his blog 的建议在引号之间定义过滤器。

【讨论】:

以上是关于如何使用 Gradle 运行多个命名测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在多模块项目中使用 JUnit5 和 SpringBoot2 通过 gradle 而不是 intelliJ 运行测试

如何使用 Gradle 运行 JUnit 测试?

如何使用 Gradle + Spring boot 运行多个配置文件? [复制]

如何使用 Gradle 和 JUnit 5 仅运行特定测试?

如何使用命令行在 Gradle 上运行空手道测试

如何使用 Android Studio 运行单元测试