如何在 maven surefire 运行测试之前执行一次方法

And*_* H. 5 java junit4 maven maven-surefire-plugin

我有一个测试套件,它需要事先执行一些设置代码,以确保我们数据库中的某些数据是正确的。

我们使用 maven surefire 插件并行运行测试。${tests.wildcard}由配置文件指定。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <forkCount>4</forkCount>
        <reuseForks>false</reuseForks>
        <includes>
            <include>${tests.wildcard}</include>
        </includes>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

在surefire并行运行我的测试之前,我希望每次整个maven执行只能运行一次方法。我怎样才能做到这一点?

A_D*_*teo 3

您可以有一个特殊的测试用例来执行您的验证代码(如果是这种情况,则会失败)。

然后,该测试用例将由特定的 Maven Surefire 执行(不包括其他测试)执行,并附加到该阶段之前发生的testMaven 阶段(如process-test-classes):因此,每次 Maven 运行且在任何其他测试之前,有效地调用一次。

然后,正常test阶段将执行任何其他所需的测试,不包括特殊的初始化测试。

这种配置的一个例子是:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19</version>
    <configuration>
        <excludes>
            <exclude>**/InitTest.java</exclude>
        </excludes>
    </configuration>
    <executions>
        <execution>
            <id>test-init</id>
            <phase>process-test-classes</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>
                <test>InitTest</test>
            </configuration>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

请注意,任何 Surefire 执行的全局配置都将排除特殊的初始化测试。然后,将执行额外的执行(在该test阶段之前),并且仅运行 init 测试(使用该<test>元素,该元素优先于任何其他包含/排除)。

因此,您将具有以下流程:

  • 执行特殊的初始化测试并验证数据到数据库中(如果需要则失败)
  • 执行任何其他测试

更新请
注意,您可以通过覆盖默认的 Surefire 测试执行(具有default-test执行 id)来运行特殊测试(并排除其他测试),然后以更语义上更正确的方式实现相同的目标,然后为其余部分添加另一个 Surefire 执行(如上面描述的是全局配置,这次是具体的执行配置)。
通过这种方法,所有内容都将附加到阶段test,这就是为什么它在语义上会更正确,尽管 pom 中有点冗长。