持续测试
了解如何在 Quarkus 应用程序中使用持续测试。
1. 前提条件
要完成本指南,您需要
-
大约 15 分钟
-
一个 IDE
-
已安装 JDK 17+ 并正确配置了
JAVA_HOME
-
Apache Maven 3.9.9
-
如果您想使用它,可以选择 Quarkus CLI
-
如果您想构建本机可执行文件(或者如果您使用本机容器构建,则为 Docker),可以选择安装 Mandrel 或 GraalVM 并进行适当的配置
-
来自入门指南的已完成的 greeter 应用程序
3. 解决方案
使用以下命令启动入门应用程序(或任何其他应用程序)
quarkus dev
./mvnw quarkus:dev
./gradlew --console=plain quarkusDev
Quarkus 将像往常一样以开发模式启动,但在屏幕底部,您应该看到以下内容
--
Tests paused, press [r] to resume, [h] for more options>
按r
,测试将开始运行。您应该看到状态在屏幕底部发生变化,最终以以下内容结束
--
Tests all passed, 2 tests were run, 0 were skipped. Tests took 1470ms.
Press [r] to re-run, [v] to view full results, [p] to pause, [h] for more options>
如果您希望持续测试自动启动,您可以在application.properties 中设置quarkus.test.continuous-testing=enabled 。如果您完全不希望它启动,您可以将其更改为disabled 。 |
现在您可以开始更改您的应用程序了。进入GreetingResource
并将 hello 端点更改为返回"hello world"
,然后保存文件。Quarkus 应该立即重新运行测试,您应该得到类似于以下的输出
2021-05-11 14:21:34,338 ERROR [io.qua.test] (Test runner thread) Test GreetingResourceTest#testHelloEndpoint() failed
: java.lang.AssertionError: 1 expectation failed.
Response body doesn't match expectation.
Expected: is "hello"
Actual: hello world
at io.restassured.internal.ValidatableResponseImpl.body(ValidatableResponseImpl.groovy)
at org.acme.getting.started.GreetingResourceTest.testHelloEndpoint(GreetingResourceTest.java:21)
--
Test run failed, 2 tests were run, 1 failed, 0 were skipped. Tests took 295ms
Press [r] to re-run, [v] to view full results, [p] to pause, [h] for more options>
将其改回,测试将再次运行。
4. 控制持续测试
您可以使用各种热键来控制持续测试。按h
将显示以下命令列表
The following commands are available:
[r] - Re-run all tests
[f] - Re-run failed tests
[b] - Toggle 'broken only' mode, where only failing tests are run (disabled)
[v] - Print failures from the last test run
[p] - Pause tests
[o] - Toggle test output (disabled)
[i] - Toggle instrumentation based reload (disabled)
[l] - Toggle live reload (enabled)
[s] - Force restart
[h] - Display this help
[q] - Quit
以下是对这些命令的解释
- [r] - 重新运行所有测试
-
这将重新运行所有测试
- [f] - 重新运行失败的测试
-
这将重新运行所有失败的测试
- [b] - 切换“仅中断”模式,其中仅运行失败的测试
-
即使其他测试通常会受到代码更改的影响,“仅中断”模式也只会运行以前失败的测试。如果您正在修改被许多测试使用的代码,但您只想专注于调试失败的测试,这可能会很有用。
- [v] - 打印上次测试运行中的失败
-
再次将失败打印到控制台,如果在上次运行后控制台输出了大量内容,这可能会很有用。
- [p] - 暂停测试
-
暂时停止运行测试。如果您正在进行大量更改,并且在所有更改完成后才想要反馈,这可能会很有用。
- [o] - 切换测试输出
-
默认情况下,测试输出会被过滤,不会显示在控制台上,因此测试输出和开发模式输出不会交错。启用测试输出将在运行测试时将输出打印到控制台。即使禁用输出,过滤后的输出也会被保存,并且可以在 Dev UI 中查看。
- [i] - 切换基于检测的重新加载
-
这与测试没有直接关系,但允许您切换基于检测的重新加载。如果更改不影响类的结构,这将允许实时重新加载避免重启,从而提供更快的重新加载并允许您保持状态。
- [l] - 切换实时重新加载
-
这与测试没有直接关系,但允许您打开和关闭实时重新加载。
- [s] - 强制重启
-
这将强制扫描已更改的文件,并将使用任何更改执行实时重新加载。请注意,即使没有更改,应用程序仍将重启。即使禁用实时重新加载,这仍然有效。
5. 无需开发模式的持续测试
可以在不启动开发模式的情况下运行持续测试。如果开发模式会干扰您的测试(例如,在同一端口上运行 wiremock),或者您只想使用测试进行开发,这可能会很有用。要启动持续测试模式,请运行mvn quarkus:test
或gradle quarkusTest
。
在持续测试模式下运行时,Dev UI 不可用,因为它是由开发模式提供的。 |
6. 选择要运行的测试
配置属性quarkus.test.include-pattern
和quarkus.test.exclude-pattern
可用于选择要运行的测试。它们是与测试类的完全限定类名匹配的正则表达式。如果配置了include-patterns
,则忽略exclude-patterns
。
或者,可以使用构建系统原生的方法。在 Maven 中,它是-Dtest=...
系统属性,而在 Gradle 中,它是--tests ...
命令行选项。当这些选项与maven quarkus:[dev|test]
或gradle quarkus[Dev|Test]
一起使用时,它们的工作方式与mvn test
或gradle test
相同,只是它们过滤了持续测试期间执行的测试集。使用这些选项时,将忽略quarkus.test.[include|exclude]-pattern
配置。
6.1. Maven
-Dtest=...
系统属性选择给定的测试进行持续测试。此配置属性的格式与 Maven Surefire -Dtest=...
格式相同。具体来说:它是由逗号 (,
) 分隔的类文件路径和/或方法名称的 glob 列表。每个 glob 都可能以感叹号 (!
) 为前缀,这使其成为排除过滤器而不是包含过滤器。排除具有比包含更高的优先级。类文件路径 glob 与方法名称 glob 由井号 (#
) 分隔,并且可能存在多个方法名称 glob,由加号 (+
) 分隔。
例如
-
Basic*
:所有以Basic
开头的类 -
???Test
:所有名称包含 3 个任意字符,后跟Test
的类 -
!Unstable*
:除以Unstable
开头的类之外的所有类 -
pkg/**/Ci*leTest
:包pkg
及其子包中,所有以Ci
开头,以leTest
结尾的类 -
*Test#test*One+testTwo?????
:所有以Test
结尾的类,以及其中仅以test
开头并以One
结尾的方法,或以testTwo
开头,后跟 5 个任意字符的方法 -
#fast*+slowTest
:所有类,以及其中仅以fast
开头的方法或名为slowTest
的方法
请注意,不支持语法%regex[...]
和%ant[...]
。
6.2. Gradle
--tests ...
命令行选项选择给定的测试进行持续测试。格式与gradle test --tests ...
格式相同。具体来说:可以多次传递该选项,并且每个项目都是测试类名称的简单模式,并且可以选择方法名称。当模式以大写字母开头时,它匹配类的简单名称;否则,它匹配类的完全限定名称。在类名之后,以句点 (.
) 分隔,可以包含方法名称模式。唯一支持的通配符是*
,它匹配任意数量的字符。请注意,*
纯粹基于文本,它不会额外关注包分隔符。
例如
-
com.example.Basic*
:包com.example
中所有以Basic
开头的类 -
MyTest*
:所有简单名称以MyTest
开头的类 -
*.pkg.Test*
:包pkg
(无论父包是什么)中所有以Test
开头的类 -
MyTest.test*
:所有简单名称为MyTest
的类,以及其中仅以test
开头的方法 -
com.example.IntegTest.fast*
:类com.example.IntegTest
,以及其中仅以fast
开头的方法
7. 多模块项目
请注意,持续测试支持多模块项目,因此当文件更改时,仍然可以运行应用程序以外的模块中的测试。可以使用下面列出的配置来控制运行的模块。
默认情况下启用此功能,可以通过quarkus.test.only-test-application-module=true
禁用。
8. 配置持续测试
持续测试支持多个配置选项,这些选项可用于限制运行的测试并控制输出。配置属性如下所示
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
是否启用持续测试。 默认值为“paused”,这将允许您从控制台或 Dev UI 启动测试,但不会在启动时运行测试。 如果设置为“enabled”,则测试将在应用程序启动后立即开始。 如果设置为“disabled”,则不会启用持续测试,并且不重新启动应用程序就无法启用。 环境变量: 显示更多 |
|
|
布尔值 |
|
|
要使用的 JUnit 环境变量: 显示更多 |
字符串 |
|
字符串列表 |
||
使用持续测试默认应排除的标签。 如果已设置 include-tags,则忽略此项。 默认为“slow”。 这支持 JUnit 标签表达式。 环境变量: 显示更多 |
字符串列表 |
|
持续测试应包含的测试。这是一个正则表达式,并且与测试类名称(不是文件名)匹配。 环境变量: 显示更多 |
字符串 |
|
使用持续测试应排除的测试。这是一个正则表达式,并且与测试类名称(不是文件名)匹配。 如果已设置 include-pattern,则忽略此项。 环境变量: 显示更多 |
字符串 |
|
字符串列表 |
||
使用持续测试默认应排除的测试引擎 ID。 如果已设置 include-engines,则忽略此项。 环境变量: 显示更多 |
字符串列表 |
|
更改测试以使用 Quarkus 1.x 版本中使用的“平面”类路径。 这意味着所有 Quarkus 和测试类都加载在同一个类加载器中,但这意味着您无法使用持续测试。 请注意,如果您发现您的应用程序需要这样做,那么您在开发模式下运行也可能会遇到问题,因为开发模式无法使用平面类路径。 环境变量: 显示更多 |
布尔值 |
|
在使用 环境变量: 显示更多 |
字符串 |
|
使用 @QuarkusTest 进行测试时要使用的配置文件的逗号分隔列表(dev、test、prod 或自定义配置文件) 环境变量: 显示更多 |
字符串列表 |
|
此配置文件关联的标签。当设置了 环境变量: 显示更多 |
字符串列表 |
|
控制在使用 @QuarkusIntegration 需要在容器中启动应用程序时要使用的容器网络。仅当 Quarkus 不需要使用共享网络时,此设置才适用 - 如果在使用测试时使用了 DevServices,则会出现这种情况。 环境变量: 显示更多 |
字符串 |
|
设置在使用 @QuarkusIntegration 需要在容器中启动应用程序时要公开的其他端口。 环境变量: 显示更多 |
Map<String,String> |
|
要添加到启动的容器的一组标签 环境变量: 显示更多 |
Map<String,String> |
|
要添加到启动的容器的一组卷挂载 环境变量: 显示更多 |
Map<String,String> |
|
当 Quarkus 为 环境变量: 显示更多 |
字符串 |
|
要在 环境变量: 显示更多 |
Map<String,String> |
|
在 环境变量: 显示更多 |
|
|
配置 @QuarkusTest 中的挂起检测。如果在此期间没有发生任何活动(即,未调用任何测试回调),则 QuarkusTest 将转储所有线程堆栈跟踪,以帮助诊断潜在的挂起。 请注意,初始超时(在 Quarkus 启动之前)仅在由系统属性提供时适用,因为在 Quarkus 启动之前无法读取所有配置源。 环境变量: 显示更多 |
|
|
要运行的测试类型,可以是 quarkus-test:仅运行 环境变量: 显示更多 |
|
|
如果为 true,则仅运行来自主应用程序模块的测试(即,当前正在运行 mvn quarkus:dev 的模块)。 如果为 false,则也将运行来自所有依赖模块的测试。 环境变量: 显示更多 |
布尔值 |
|
持续测试应包含的模块。这是一个正则表达式,并且与模块 groupId:artifactId 匹配。 环境变量: 显示更多 |
字符串 |
|
持续测试应排除的模块。这是一个正则表达式,并且与模块 groupId:artifactId 匹配。 如果已设置 include-module-pattern,则忽略此项。 环境变量: 显示更多 |
字符串 |
|
是否应为集成测试调用测试回调(使用 环境变量: 显示更多 |
布尔值 |
|
用于覆盖运行 允许的值为:jar、native 环境变量: 显示更多 |
字符串 |
关于 Duration 格式
要写入持续时间值,请使用标准 您还可以使用简化的格式,以数字开头
在其他情况下,简化格式将被转换为
|