在 GitHub 上叉我

使用 TestNG

不支持的 TestNG 版本

- TestNG 5.14.3:格式错误的 pom.xml。- TestNG 5.14.4 和 5.14.5:TestNG 正在使用缺少的依赖项 (org.testng:guice:2.0)。排除它,可能会破坏某些功能。

配置 TestNG

要开始使用 TestNG,请在您的项目中包含以下依赖项(将版本替换为您希望使用的版本):

<dependencies>
  [...]
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.9.8</version>
      <scope>test</scope>
    </dependency>
  [...]
</dependencies>

如果您使用的是旧版本的 TestNG (<= 5.11),则依赖项将如下所示:

<dependencies>
  [...]
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>5.11</version>
      <scope>test</scope>
      <classifier>jdk15</classifier>
    </dependency>
  [...]
</dependencies>

注意:如果您在 TestNG 测试中使用 JDK 1.4 Javadoc 注释,请将分类器替换为jdk15上述jdk14

这是开始所需的唯一步骤 - 您现在可以在测试源目录中创建测试(例如,src/test/java)。只要它们按照默认命名,例如*Test.java它们将由 Surefire 作为 TestNG 测试运行。

如果您想使用不同的命名方案,您可以更改includes参数,如测试的包含和排除示例中所述。

使用套件 XML 文件

另一种选择是使用 TestNG 套件 XML 文件。这允许灵活配置要运行的测试。这些文件以正常方式创建,然后添加到 Surefire 插件配置中:

<plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <suiteXmlFiles>
            <suiteXmlFile>testng.xml</suiteXmlFile>
          </suiteXmlFiles>
        </configuration>
      </plugin>
    [...]
</plugins>

此配置将覆盖包含和排除模式并运行套件文件中的所有测试。

指定测试参数

您的 TestNG 测试可以接受带有@Parameters注释的参数。您还可以将参数从 Maven 传递到您的 TestNG 测试,方法是将它们指定为系统属性,如下所示:

<plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <systemPropertyVariables>
            <propertyName>firefox</propertyName>
          </systemPropertyVariables>
        </configuration>
      </plugin>
    [...]
</plugins>

有关在 Surefire 测试中设置系统属性的更多信息,请参阅系统属性

使用组

TestNG 允许您对测试进行分组。然后,您可以执行一个或多个特定组。要使用 Surefire 执行此操作,请使用groups参数,例如:

<plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <groups>functest,perftest</groups>
        </configuration>
      </plugin>
    [...]
</plugins>

同样,该excludedGroups参数可用于运行除特定组之外的所有组。

并行运行测试

TestNG 允许您并行运行测试,包括 JUnit 测试。为此,您必须设置参数,如果默认值 5 不够parallel,可以更改参数。threadCount例如:

</plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <parallel>methods</parallel>
          <threadCount>10</threadCount>
        </configuration>
      </plugin>
    [...]
</plugins>

这对于可能具有高并发性的慢速测试或快速粗略地评估测试和代码的独立性和线程安全性特别有用。

TestNG 5.10 和插件版本 2.19 或更高版本允许您使用数据提供程序在并行测试中运行方法。

</plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <properties>
            <property>
              <name>parallel</name>
              <value>methods</value>
            </property>
            <property>
              <name>dataproviderthreadcount</name>
              <value>30</value>
            </property>
          </properties>
        </configuration>
      </plugin>
    [...]
</plugins>

TestNG 6.9.8 (JRE 1.7) 和插件版本 2.19 或更高版本允许您并行运行套件。

</plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <suiteXmlFiles>
            <file>src/test/resources/testng1.xml</file>
            <file>src/test/resources/testng2.xml</file>
          </suiteXmlFiles>
          <properties>
            <property>
              <name>suitethreadpoolsize</name>
              <value>2</value>
            </property>
          </properties>
        </configuration>
      </plugin>
    [...]
</plugins>

另请参阅分叉选项和并行测试执行

使用自定义侦听器和报告器

TestNG 支持将自定义侦听器、报告器、注释转换器和方法拦截器附加到您的测试。默认情况下,TestNG 附加了一些基本的侦听器来生成 HTML 和 XML 报告。

不支持的版本: - TestNG 5.14.1 和 5.14.2:由于内部 TestNG 问题,侦听器和报告器无法使用 TestNG。请将 TestNG 升级到 5.14.9 或更高版本。注意:它可能会在未来的万无一失的版本中得到修复。

您可以像这样配置多个自定义侦听器:

<dependencies>
[...]
  <dependency>
    <groupId>your-testng-listener-artifact-groupid</groupId>
    <artifactId>your-testng-listener-artifact-artifactid</artifactId>
    <version>your-testng-listener-artifact-version</version>
    <scope>test</scope>
  </dependency>
[...]
</dependencies>
[...]
</plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <properties>
            <property>
              <name>usedefaultlisteners</name>
              <value>false</value> <!-- disabling default listeners is optional -->
            </property>
            <property>
              <name>listener</name>
              <value>com.mycompany.MyResultListener,com.mycompany.MyAnnotationTransformer,com.mycompany.MyMethodInterceptor</value>
            </property>
            <property>
              <name>reporter</name>
              <value>listenReport.Reporter</value>
            </property>
          </properties>
        </configuration>
      </plugin>
    [...]
</plugins>

有关 TestNG 的更多信息,请参阅TestNG 网站

org.testng.ITestListener您可以在单独的测试工件your-testng-listener-artifact中使用 scope=test 或在项目测试源代码中实现 TestNG 侦听器接口src/test/java。您可以通过参数过滤测试工件以将dependenciesToScan其类加载到 surefire-testng 提供程序的当前 ClassLoader 中。TestNG 记者类应该实现org.testng.IReporter

详细程度

由于插件版本 2.19 或更高版本,可以在提供程序属性中配置详细级别surefire.testng.verbose。详细级别介于 0 和 10 之间,其中 10 是最详细的。您可以指定 -1,这会将 TestNG 置于调试模式(不再切断堆栈跟踪等)。默认级别为 0。

</plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          [...]
          <properties>
            <property>
              <name>surefire.testng.verbose</name>
              <value>10</value>
            </property>
          </properties>
          [...]
        </configuration>
      </plugin>
    [...]
</plugins>

自定义 TestNG 对象工厂

由于插件版本 2.19 和 TestNG 5.7 或更高版本,您可以通过实现org.testng.IObjectFactory类名称并将其绑定到objectfactory提供程序属性中的键来自定义 TestNG 对象工厂:

</plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          [...]
          <properties>
            <property>
              <name>objectfactory</name>
              <value>testng.objectfactory.TestNGCustomObjectFactory</value>
            </property>
          </properties>
          [...]
        </configuration>
      </plugin>
    [...]
</plugins>

自定义 TestNG 测试运行器工厂

由于插件版本 2.19 和 TestNG 5.9 或更高版本,您可以通过实现org.testng.ITestRunnerFactory类名称并将其绑定到testrunfactory提供程序属性中的键来自定义 TestNG 运行器工厂:

</plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          [...]
          <properties>
            <property>
              <name>testrunfactory</name>
              <value>testng.testrunnerfactory.TestNGCustomTestRunnerFactory</value>
            </property>
          </properties>
          [...]
        </configuration>
      </plugin>
    [...]
</plugins>

在测试标签中运行“testnames”

只有在test与这些名称之一匹配的标记中定义的测试才会运行。在这个例子中,两个测试用完了 7 个;即InstallTestATest。测试a-t3与suite.xml中的任何测试都不匹配。

</plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          [...]
          <suiteXmlFiles>
            <file>src/test/resources/suite.xml</file>
          </suiteXmlFiles>
          <properties>
            <property>
              <name>testnames</name>
              <value>a-t1,a-t3</value>
            </property>
          </properties>
          [...]
        </configuration>
      </plugin>
    [...]
</plugins>

测试套件“suite.xml”:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Component Tests" verbose="2" annotations="JDK">
  <test name="a-t1" preserve-order="true" >
    <classes>
      <class name="server.InstallTest" />
      <class name="server.ATest" />
    </classes>
  </test>
  <test name="a-t2" preserve-order="true" >
    <classes>
      <class name="server.SCHTest" />
      <class name="server.PRGTest" />
      <class name="server.SIBBTest" />
      <class name="server.EDNTest" />
      <class name="server.PPVTest" />
    </classes>
  </test>
</suite>

运行 TestNG 和 JUnit 测试

TestNG 6.5.1 及更高版本支持在当前 Maven 项目中运行 TestNG 和 JUnit 4.x。您只需要在 POM 中引入 TestNG 和 JUnit 依赖项。

<dependencies>
  [...]
  <dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.9.4</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    <scope>test</scope>
  </dependency>
  [...]
</dependencies>

您可能希望运行两个提供程序,例如surefire-junit47and ,并通过设置 propertysurefire-testng避免在提供程序内运行 JUnit 测试。surefire-testngjunit=false

<plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          [...]
          <properties>
            <property>
              <name>junit</name>
              <value>false</value>
            </property>
          </properties>
          <threadCount>1</threadCount>
          [...]
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>3.0.0-M5</version>
          </dependency>
          <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-testng</artifactId>
            <version>3.0.0-M5</version>
          </dependency>
        </dependencies>
      </plugin>
    [...]
</plugins>