JUnit 5中是否有任何API可以测试包含或排除的标签?

时间:2019-01-23 07:27:38

标签: junit5

如果要“包含”某个标记,即通过ConsoleLauncher的选项--include-tag或Gradle中的useJUnitPlatform.includeTags属性通过,我想启用测试。在测试类或方法的上下文中是否有任何API可以检索此选项的值?

我尝试了基于脚本的条件@EnabledIf这样:

@EnabledIf("'true' == systemProperty.get('itest.backendSystemPresent') || junitTags.contains('BackendSystemIT') == true")

但是junitTags包含相关元素的@Tag注释,而不是运行时包含的标签。

2 个答案:

答案 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

可能的解决方案

  1. @Tag("BackendSystemIT")注释测试
  2. 在运行测试之前,请检查itest.backendSystemPresent系统属性,如果已设置,请将--include-tag "BackendSystemIT"传递给测试运行。
  3. 让Jupiter从事评估标签表达的工作

答案 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