有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JUnit 5@Tag在@beforeach/@AfterEach中无法按预期工作

用JUnit 5开发一个简单的数学运算测试套件。 我使用两个标签@Tag("add")@Tag("minus")

使用maven和surefire插件,我为测试选择标签

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>3.0.0-M3</version>
  <configuration combine.children="append">
    <excludedGroups></excludedGroups>
    <groups>add</groups>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.5.2</version>
    </dependency>
  </dependencies>
</plugin>

当我在终端上执行mvn test时,它将只执行由@Tag("add")标记的测试,但出于某种原因,将执行@BeforeEach@AfterEach标记为@Tag("minus")

@Tag("minus")
@BeforeEach
void beforeEach(TestInfo test) { /* code */ }

@Tag("minus")
@AfterEach
void afterEach(TestInfo test) { /* code */ }

由于预期的行为不起作用,我甚至强制使用<excludedGroups>,从空值更改为<excludedGroups>minus</excludedGroups>on pom.xml,仍然不起作用

我在pom.xml上遗漏了什么

{}和{}加上{}之间的冲突


共 (2) 个答案

  1. # 1 楼答案

    @Tag用于测试类和方法。这与上述测试的设置/拆卸无关

    您可以将这些测试拆分为单独的测试类,也可以利用Nested Test。嵌套测试可能看起来像这样:

    @DisplayName("A stack")
    class MathTest {
    
        @Nested
        @DisplayName("when new")
        @Tag("add")
        class Add {
    
            @BeforeEach
            void setupAdding() {
                // ...
            }
    
            @Test
            @DisplayName("can add")
            void canAdd() {
                // ...
            }
    
        }
    
        @Nested
        @DisplayName("minus")
        @Tag("minus")
        class Minus {
    
            @BeforeEach
            void setupMinus() {
                // ...
            }
    
            @Test
            @DisplayName("can subtract")
            void testMinus() {
                // ...
            }
    
        }
    }
    
  2. # 2 楼答案

    我认为@Tag注释的构思只是为了根据一个共同的特征对测试进行分类。如果您需要不同的setUp()和teardown(),我想正确的方法是在不同的测试类中分离它们,而不是使用标记注释

    文档中描述了它可以用于测试类或测试方法:

    https://junit.org/junit5/docs/5.0.1/api/org/junit/jupiter/api/Tag.html