在 GitHub 上叉我

用法

要使用故障安全插件,您需要将以下配置添加到您的pom.xml

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>3.0.0-M5</version>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

可以通过调用verify构建生命周期的阶段来调用故障安全插件。

mvn verify

使用不同的测试提供者

测试源目录中的测试可以是以下任意组合:

  • 测试NG
  • JUnit(3.8、4.x 或 5.x)
  • POJO

哪些提供程序可用仅通过包含适当的依赖项来控制(即,对于 JUnit4,对于 JUnit5 junit:junitjunit:junit-dep对于 JUnit5,对于junit-jupiter-enginejunit-vintage-engine ,对于 TestNG是 4.7+ org.testng:testng)。由于无论如何编译测试类都需要这样做,因此不需要额外的配置。

请注意,无论使用哪个提供程序,任何正常的 Surefire 集成都可以正常工作 - 例如,您仍然可以在项目网站上为您的 TestNG 测试生成 Cobertura 报告和 Surefire 结果报告。

上面的 POJO 提供程序允许您编写不依赖于 JUnit 和 TestNG 的测试。它的行为方式相同,运行test*类中公共的所有方法,但不需要 API 依赖项。要执行断言,assert可以使用 JDK 1.4 关键字。有关更多信息,请参阅使用 POJO 测试

所有提供程序都支持 Surefire 插件参数配置。但是,如果您正在运行 TestNG 测试(包括是否使用 TestNG 执行 JUnit 测试,如果两者都存在于 Surefire 中,则默认情况下会出现这种情况),还有其他可用选项。

有关更多信息,请参阅使用 TestNG

使用码头和 maven-failsafe-plugin

您需要将 、 或 之一jetty:start绑定到设置为 true的阶段jetty:run,绑定到阶段,绑定到阶段,最后绑定到阶段。这是一个例子:jetty:run-explodedjetty:run-warpre-integration-testdaemonfailsafe:integration-testintegration-testjetty:stoppost-integration-testfailsafe:verifyverify

<project>
  [...]
  <build>
    [...]
    <plugins>
      [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>3.0.0-M5</version>
        <executions>
          <execution>
            <id>integration-test</id>
            <goals>
              <goal>integration-test</goal>
            </goals>
          </execution>
          <execution>
            <id>verify</id>
            <goals>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>9.2.2.v20140723</version>
        [...]
        <configuration>
          [...]
          <scanIntervalSeconds>10</scanIntervalSeconds>
          <stopPort>8005</stopPort>
          <stopKey>STOP</stopKey>
          [...]
        </configuration>
        [...]
        <executions>
          [...]
          <execution>
            <id>start-jetty</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>start</goal>
            </goals>
            <configuration>
              <scanIntervalSeconds>0</scanIntervalSeconds>
              <daemon>true</daemon>
            </configuration>
          </execution>
          <execution>
            <id>stop-jetty</id>
            <phase>post-integration-test</phase>
            <goals>
              <goal>stop</goal>
            </goals>
          </execution>
          [...]
        </executions>
        [...]
      </plugin>
      [...]
    </plugins>
    [...]
  </build>
  [...]
</project>

然后,您可以调用 Mavenverify或稍后的阶段来运行集成测试。不要直接调用任何阶段pre-integration-test, integration-test, 或者post-integration-test因为这些太长而无法输入,它们可能会使码头容器运行。

mvn verify

注意:在测试开发期间,您可能会在后台运行一个码头实例。为了帮助运行集成测试,在启动集成测试码头实例之前,可以很方便地绑定jetty:stoppre-integration-test之前的阶段jetty:run以清除任何正在运行的码头实例,例如

<project>
  [...]
  <build>
    [...]
    <plugins>
      [...]
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>9.2.2.v20140723</version>
        [...]
        <executions>
          [...]
          <execution>
            <id>start-jetty</id>
            <phase>pre-integration-test</phase>
            <goals>
              <!-- stop any previous instance to free up the port -->
              <goal>stop</goal>
              <goal>start</goal>
            </goals>
            [...]
          </execution>
          [...]
        </executions>
        [...]
      </plugin>
      [...]
    </plugins>
    [...]
  </build>
  [...]
</project>

报告集成测试结果

Failsafe Plugin 使用与 Surefire Plugin 完全相同的格式,因此要生成报告,您只需使用 Failsafe 报告目录添加第二个 Surefire Report Plugin 报告集,例如

<project>
  [...]
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-report-plugin</artifactId>
        <version>3.0.0-M5</version>
        <reportSets>
          <reportSet>
            <id>integration-tests</id>
            <reports>
              <report>failsafe-report-only</report>
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
    </plugins>
  </reporting>
  [...]
</project>

多次运行集成测试

如果您需要多次运行集成测试,只需使用integration-test目标的多次执行即可。您需要为每次执行指定不同的摘要文件,然后verify使用多个摘要文件配置目标,以便在任何一次执行失败时使构建失败,例如

<project>
  [...]
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>3.0.0-M5</version>
        <executions>
          <execution>
            <id>integration-test-red-bevels</id>
            <goals>
              <goal>integration-test</goal>
            </goals>
            <configuration>
              <systemPropertyVariables>
                <bevels>red</bevels>
              </systemPropertyVariables>
              <summaryFile>target/failsafe-reports/failsafe-summary-red-bevels.xml</summaryFile>
            </configuration>
          </execution>
          <execution>
            <id>integration-test-no-bevels</id>
            <goals>
              <goal>integration-test</goal>
            </goals>
            <configuration>
              <systemPropertyVariables>
                <bevels>none</bevels>
              </systemPropertyVariables>
              <summaryFile>target/failsafe-reports/failsafe-summary-no-bevels.xml</summaryFile>
            </configuration>
          </execution>
          <execution>
            <id>verify</id>
            <goals>
              <goal>verify</goal>
            </goals>
            <configuration>
              <summaryFiles>
                <summaryFile>target/failsafe-reports/failsafe-summary-red-bevels.xml</summaryFile>
                <summaryFile>target/failsafe-reports/failsafe-summary-no-bevels.xml</summaryFile>
              </summaryFiles>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </reporting>
  [...]
</project>

在多模块项目中的使用

本页顶部列出的使用故障安全插件的建议适用于 95% 的用例。当您在父 pom 中定义故障安全插件的共享定义时,定义执行 id 以允许子项目覆盖配置被认为是最佳实践。因此,您的父母中可能有以下内容pom.xml

<project>
  [...]
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-failsafe-plugin</artifactId>
          <version>3.0.0-M5</version>
          <executions>
            <execution>
              <id>integration-test</id>
              <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  [...]
</project>

然后子项目可以触发故障安全插件的使用

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>3.0.0-M5</version>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

对于非常复杂的构建,最好将integration-testverify目标的执行分开。

<project>
  [...]
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-failsafe-plugin</artifactId>
          <version>3.0.0-M5</version>
          <executions>
            <execution>
              <id>integration-test</id>
              <goals>
                <goal>integration-test</goal>
              </goals>
            </execution>
            <execution>
              <id>verify</id>
              <goals>
                <goal>verify</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  [...]
</project>