编辑此页面

持续测试

了解如何在 Quarkus 应用程序中使用持续测试。

1. 前提条件

要完成本指南,您需要

  • 大约 15 分钟

  • 一个 IDE

  • 已安装 JDK 17+ 并正确配置了 JAVA_HOME

  • Apache Maven 3.9.9

  • 如果您想使用它,可以选择 Quarkus CLI

  • 如果您想构建本机可执行文件(或者如果您使用本机容器构建,则为 Docker),可以选择安装 Mandrel 或 GraalVM 并进行适当的配置

  • 来自入门指南的已完成的 greeter 应用程序

2. 简介

Quarkus 支持持续测试,测试会在代码更改保存后立即运行。这使您可以获得有关代码更改的即时反馈。Quarkus 会检测哪些测试覆盖哪些代码,并使用此信息仅在代码更改时运行相关的测试。

3. 解决方案

使用以下命令启动入门应用程序(或任何其他应用程序)

CLI
quarkus dev
Maven
./mvnw quarkus:dev
Gradle
./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:testgradle quarkusTest

在持续测试模式下运行时,Dev UI 不可用,因为它是由开发模式提供的。

6. 选择要运行的测试

配置属性quarkus.test.include-patternquarkus.test.exclude-pattern可用于选择要运行的测试。它们是与测试类的完全限定类名匹配的正则表达式。如果配置了include-patterns,则忽略exclude-patterns

或者,可以使用构建系统原生的方法。在 Maven 中,它是-Dtest=...系统属性,而在 Gradle 中,它是--tests ...命令行选项。当这些选项与maven quarkus:[dev|test]gradle quarkus[Dev|Test]一起使用时,它们的工作方式与mvn testgradle 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”,则不会启用持续测试,并且不重新启动应用程序就无法启用。

环境变量: QUARKUS_TEST_CONTINUOUS_TESTING

显示更多

paused, enabled, disabled

paused

是否应在控制台中显示正在运行的测试的输出。

环境变量: QUARKUS_TEST_DISPLAY_TEST_OUTPUT

显示更多

布尔值

false

要使用的 JUnit ClassOrderer 的 FQCN。如果找不到该类,则回退到 JUnit 默认行为,该行为根本不设置 ClassOrderer

环境变量: QUARKUS_TEST_CLASS_ORDERER

显示更多

字符串

io.quarkus.test.junit.util.QuarkusTestProfileAwareClassOrderer

持续测试应包含的标签。这支持 JUnit 标签表达式。

环境变量: QUARKUS_TEST_INCLUDE_TAGS

显示更多

字符串列表

使用持续测试默认应排除的标签。

如果已设置 include-tags,则忽略此项。

默认为“slow”。

这支持 JUnit 标签表达式。

环境变量: QUARKUS_TEST_EXCLUDE_TAGS

显示更多

字符串列表

slow

持续测试应包含的测试。这是一个正则表达式,并且与测试类名称(不是文件名)匹配。

环境变量: QUARKUS_TEST_INCLUDE_PATTERN

显示更多

字符串

使用持续测试应排除的测试。这是一个正则表达式,并且与测试类名称(不是文件名)匹配。

如果已设置 include-pattern,则忽略此项。

环境变量: QUARKUS_TEST_EXCLUDE_PATTERN

显示更多

字符串

.*\.IT[^.]+|.*IT|.*ITCase

持续测试应包含的测试引擎 ID。

环境变量: QUARKUS_TEST_INCLUDE_ENGINES

显示更多

字符串列表

使用持续测试默认应排除的测试引擎 ID。

如果已设置 include-engines,则忽略此项。

环境变量: QUARKUS_TEST_EXCLUDE_ENGINES

显示更多

字符串列表

更改测试以使用 Quarkus 1.x 版本中使用的“平面”类路径。

这意味着所有 Quarkus 和测试类都加载在同一个类加载器中,但这意味着您无法使用持续测试。

请注意,如果您发现您的应用程序需要这样做,那么您在开发模式下运行也可能会遇到问题,因为开发模式无法使用平面类路径。

环境变量: QUARKUS_TEST_FLAT_CLASS_PATH

显示更多

布尔值

false

在使用 @QuarkusIntegrationTest 测试时要使用的配置文件

环境变量: QUARKUS_TEST_INTEGRATION_TEST_PROFILE

显示更多

字符串

prod

使用 @QuarkusTest 进行测试时要使用的配置文件的逗号分隔列表(dev、test、prod 或自定义配置文件)

环境变量: QUARKUS_TEST_PROFILE

显示更多

字符串列表

test

此配置文件关联的标签。当设置了 quarkus.test.profile.tags 系统属性(其值是以逗号分隔的字符串列表)时,Quarkus 将仅执行使用 @TestProfile 注释的测试,该测试至少具有一个提供的(通过上述系统属性)标签。

环境变量: QUARKUS_TEST_PROFILE_TAGS

显示更多

字符串列表

控制在使用 @QuarkusIntegration 需要在容器中启动应用程序时要使用的容器网络。仅当 Quarkus 不需要使用共享网络时,此设置才适用 - 如果在使用测试时使用了 DevServices,则会出现这种情况。

环境变量: QUARKUS_TEST_CONTAINER_NETWORK

显示更多

字符串

设置在使用 @QuarkusIntegration 需要在容器中启动应用程序时要公开的其他端口。

环境变量: QUARKUS_TEST_CONTAINER_ADDITIONAL_EXPOSED_PORTS__HOST_PORT_

显示更多

Map<String,String>

要添加到启动的容器的一组标签

环境变量: QUARKUS_TEST_CONTAINER_LABELS__LABEL_NAME_

显示更多

Map<String,String>

要添加到启动的容器的一组卷挂载

环境变量: QUARKUS_TEST_CONTAINER_VOLUME_MOUNTS__HOST_PATH_

显示更多

Map<String,String>

当 Quarkus 为 @QuarkusIntegrationTest 启动生成的工件时要使用的其他启动参数。当工件是 jar 时,此字符串将紧跟在 java 命令之后传递。当工件是 container 时,此字符串将紧跟在 docker run 命令之后传递。当工件是 native binary 时,此字符串将紧跟在 native binary 名称之后传递。

环境变量: QUARKUS_TEST_ARG_LINE

显示更多

字符串

要在 @QuarkusIntegrationTest 启动的进程中设置的其他环境变量。

环境变量: QUARKUS_TEST_ENV__ENVIRONMENT_VARIABLE_NAME_

显示更多

Map<String,String>

@QuarkusIntegrationTest 中用于确定测试将等待应用程序启动多长时间

环境变量: QUARKUS_TEST_WAIT_TIME

显示更多

Duration 

PT1M

配置 @QuarkusTest 中的挂起检测。如果在此期间没有发生任何活动(即,未调用任何测试回调),则 QuarkusTest 将转储所有线程堆栈跟踪,以帮助诊断潜在的挂起。

请注意,初始超时(在 Quarkus 启动之前)仅在由系统属性提供时适用,因为在 Quarkus 启动之前无法读取所有配置源。

环境变量: QUARKUS_TEST_HANG_DETECTION_TIMEOUT

显示更多

Duration 

10M

要运行的测试类型,可以是

quarkus-test:仅运行 @QuarkusTest 注释的测试类 unit:仅运行未使用 @QuarkusTest 注释的类 all:同时运行两者,首先运行单元测试

环境变量: QUARKUS_TEST_TYPE

显示更多

unit, quarkus-test, all

all

如果为 true,则仅运行来自主应用程序模块的测试(即,当前正在运行 mvn quarkus:dev 的模块)。

如果为 false,则也将运行来自所有依赖模块的测试。

环境变量: QUARKUS_TEST_ONLY_TEST_APPLICATION_MODULE

显示更多

布尔值

false

持续测试应包含的模块。这是一个正则表达式,并且与模块 groupId:artifactId 匹配。

环境变量: QUARKUS_TEST_INCLUDE_MODULE_PATTERN

显示更多

字符串

持续测试应排除的模块。这是一个正则表达式,并且与模块 groupId:artifactId 匹配。

如果已设置 include-module-pattern,则忽略此项。

环境变量: QUARKUS_TEST_EXCLUDE_MODULE_PATTERN

显示更多

字符串

是否应为集成测试调用测试回调(使用 @QuarkusIntegrationTest 注释的测试)。

环境变量: QUARKUS_TEST_ENABLE_CALLBACKS_FOR_INTEGRATION_TESTS

显示更多

布尔值

false

用于覆盖运行 @QuarkusIntegrationTest@QuarkusMainIntegrationTest 所针对的工件类型。例如,如果应用程序的工件是从 jar 构建的容器,则可以使用此属性来测试 jar 而不是容器。

允许的值为:jar、native

环境变量: QUARKUS_TEST_INTEGRATION_TEST_ARTIFACT_TYPE

显示更多

字符串

关于 Duration 格式

要写入持续时间值,请使用标准 java.time.Duration 格式。有关更多信息,请参阅 Duration#parse() Java API 文档

您还可以使用简化的格式,以数字开头

  • 如果该值仅为一个数字,则表示以秒为单位的时间。

  • 如果该值是一个数字后跟 ms,则表示以毫秒为单位的时间。

在其他情况下,简化格式将被转换为 java.time.Duration 格式以进行解析

  • 如果该值是一个数字后跟 hms,则在其前面加上 PT

  • 如果该值是一个数字后跟 d,则在其前面加上 P

相关内容