如果要“包含”某个标记,即通过ConsoleLauncher的选项--include-tag
或Gradle中的useJUnitPlatform.includeTags
属性通过,我想启用测试。在测试类或方法的上下文中是否有任何API可以检索此选项的值?
我尝试了基于脚本的条件@EnabledIf这样:
@EnabledIf("'true' == systemProperty.get('itest.backendSystemPresent') || junitTags.contains('BackendSystemIT') == true")
但是junitTags
包含相关元素的@Tag注释,而不是运行时包含的标签。
答案 0 :(得分:2)
再次阅读您的问题,我的回答是“否” 。您无法使用junitTags
实现目标。不,目前没有这样的API。您将需要以下内容:
@EnabledIf("'true' == evaluateTagExpression('BackendSystemIT') || ...)
因为您还需要在此处处理标签表达:https://junit.org/junit5/docs/current/user-guide/#running-tests-tag-expressions
但是,标签会在此过程的早期进行评估。如果标签评估已经排除了测试,则您的条件将无法执行。因此,我想,您必须坚持使用单个系统属性开关来控制测试方法的启用状态。
顺便说一句。我们即将使用any()
和none()
令牌来改进标签表达语言。 https://github.com/junit-team/junit5/issues/1679
可能的解决方案:
@Tag("BackendSystemIT")
注释测试itest.backendSystemPresent
系统属性,如果已设置,请将--include-tag "BackendSystemIT"
传递给测试运行。答案 1 :(得分:0)
在测试类或方法的上下文中,是否有任何API可以检索直接附加或继承的所有标签的值(此选项)?>
是的。在测试方法中声明并使用一个org.junit.jupiter.api.TestInfo
参数。
@Test
@DisplayName("TEST 1")
@Tag("my-tag")
void test1(TestInfo testInfo) {
assertEquals("TEST 1", testInfo.getDisplayName());
assertTrue(testInfo.getTags().contains("my-tag"));
}
有关详细信息,请参见https://junit.org/junit5/docs/current/user-guide/#writing-tests-dependency-injection
但是junitTags包含有问题的元素的@Tag注释,而不是运行时包含的标签。
这是预期的行为-平台(此处为控制台启动器)已应用通过--include-tag
传递的过滤器和其他配置参数。简而言之:无需在标准木星测试中手动检查标签。如果内置过滤存在问题,请在此处创建一个问题:https://github.com/junit-team/junit5/issues/new/choose