测试运行的结果在启动 SuiteRunner 时指定的目录中的index.html文件中创建。该文件指向包含整个测试运行结果的各种其他 HTML 和文本文件。
使用带有 Listeners 和 Reporters 的 TestNG 生成您自己的报告非常容易:

  • 侦听器实现接口org.testng.ITestListener并实时通知测试何时开始、通过、失败等…
  • Reporters实现接口org.testng.IReporter并在所有套件都由 TestNG 运行时收到通知。IReporter 实例接收描述整个测试运行的对象列表。

例如,如果要生成测试运行的 PDF 报告,则不需要实时通知测试运行,因此您可能应该使用IReporter。如果您想编写测试的实时报告,例如带有进度条的 GUI 或在调用每个测试时显示点(“.”)的文本报告器(如下所述),ITestListener是您的最好的选择。

记录监听器listener

这是一个显示“.”的侦听器。对于每个通过的测试,每个失败一个“F”,每个跳过一个“S”:

  1. public class DotTestListener extends TestListenerAdapter {
  2. private int m_count = 0;
  3. @Override
  4. public void onTestFailure(ITestResult tr) {
  5. log("F");
  6. }
  7. @Override
  8. public void onTestSkipped(ITestResult tr) {
  9. log("S");
  10. }
  11. @Override
  12. public void onTestSuccess(ITestResult tr) {
  13. log(".");
  14. }
  15. private void log(String string) {
  16. System.out.print(string);
  17. if (++m_count % 40 == 0) {
  18. System.out.println("");
  19. }
  20. }
  21. }

在这个例子中,我选择扩展TestListenerAdapter,它用空方法实现ITestListener,所以我不必重写接口中我不感兴趣的其他方法。如果你愿意,可以直接实现接口。

下面是我如何调用 TestNG 来使用这个新的监听器:

  1. java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -listener org.testng.reporters.DotTestListener test\testng.xml

和输出:

  1. ........................................
  2. ........................................
  3. ........................................
  4. ........................................
  5. ........................................
  6. .........................
  7. ===============================================
  8. TestNG JDK 1.5
  9. Total tests run: 226, Failures: 0, Skips: 0
  10. ===============================================

请注意,当您使用-listener 时,TestNG 将自动确定您要使用的侦听器类型。

记录报告器Reporter

org.testng.IReporter接口只有一个方法:

  1. public void generateReport(List<ISuite> suites, String outputDirectory)

当所有套件都已运行时,TestNG 将调用此方法,您可以检查其参数以访问刚刚完成的运行的所有信息。

JUnitReports

TestNG 包含一个监听器,它接收 TestNG 结果并输出一个 XML 文件,然后可以将其馈送到 JUnitReport。 是一个示例,以及创建此报告的 ant 任务:

  1. <target name="reports">
  2. <junitreport todir="test-report">
  3. <fileset dir="test-output">
  4. <include name="*/*.xml"/>
  5. </fileset>
  6. <report format="noframes" todir="test-report"/>
  7. </junitreport>
  8. </target>

注意:当前 JDK 1.5 和 JUnitReports 之间的不兼容导致框架版本无法正常工作,因此您需要指定“noframes”以使其暂时正常工作。

报告 API

如果您需要记录应该出现在生成的 HTML 报告中的消息,可以使用org.testng.Reporter类:

XML 报告

TestNG 提供了一个 XML 报告器,用于捕获 JUnit 报告中不可用的 TestNG 特定信息。当用户的测试环境需要使用带有 JUnit 格式无法提供的 TestNG 特定数据的 XML 结果时,这尤其有用。这个记者可以通过命令行使用-reporter注入到 TestNG 中。
这是一个示例用法:-reporter org.testng.reporters.XMLReporter:generateTestResultAttributes=true,generateGroupsAttribute=true。
可以通过的全套选项在下表中详细说明。确保使用:

  • : - 将报告者名称与其属性分开
  • = - 分隔属性的键/值对
  • , - 分隔多个键/值对

以下是此类报告器的输出示例:

  1. <testng-results>
  2. <suite name="Suite1">
  3. <groups>
  4. <group name="group1">
  5. <method signature="com.test.TestOne.test2()" name="test2" class="com.test.TestOne"/>
  6. <method signature="com.test.TestOne.test1()" name="test1" class="com.test.TestOne"/>
  7. </group>
  8. <group name="group2">
  9. <method signature="com.test.TestOne.test2()" name="test2" class="com.test.TestOne"/>
  10. </group>
  11. </groups>
  12. <test name="test1">
  13. <class name="com.test.TestOne">
  14. <test-method status="FAIL" signature="test1()" name="test1" duration-ms="0"
  15. started-at="2007-05-28T12:14:37Z" description="someDescription2"
  16. finished-at="2007-05-28T12:14:37Z">
  17. <exception class="java.lang.AssertionError">
  18. <short-stacktrace>
  19. <![CDATA[
  20. java.lang.AssertionError
  21. ... Removed 22 stack frames
  22. ]]>
  23. </short-stacktrace>
  24. </exception>
  25. </test-method>
  26. <test-method status="PASS" signature="test2()" name="test2" duration-ms="0"
  27. started-at="2007-05-28T12:14:37Z" description="someDescription1"
  28. finished-at="2007-05-28T12:14:37Z">
  29. </test-method>
  30. <test-method status="PASS" signature="setUp()" name="setUp" is-config="true" duration-ms="15"
  31. started-at="2007-05-28T12:14:37Z" finished-at="2007-05-28T12:14:37Z">
  32. </test-method>
  33. </class>
  34. </test>
  35. </suite>
  36. </testng-results>

此报告器与其他默认侦听器一起注入,因此您可以默认获得这种类型的输出。侦听器提供了一些属性,可以调整报告器以满足您的需求。下表包含这些属性的列表以及简短说明,详见官网参数列表
image.png

TestNG 退出代码

当 TestNG 完成执行时,它会以返回码退出。
可以检查此返回代码以了解故障的性质(如果有的话)。
下表总结了 TestNG 当前使用的不同退出代码
image.png

YAML支持

TestNG 支持YAML作为指定套件文件的替代方式。例如,以下 XML 文件:

  1. <suite name="SingleSuite" verbose="2" thread-count="4">
  2. <parameter name="n" value="42" />
  3. <test name="Regression2">
  4. <groups>
  5. <run>
  6. <exclude name="broken" />
  7. </run>
  8. </groups>
  9. <classes>
  10. <class name="test.listeners.ResultEndMillisTest" />
  11. </classes>
  12. </test>
  13. </suite>

testng.yaml

  1. name: SingleSuite
  2. threadCount: 4
  3. parameters: { n: 42 }
  4. tests:
  5. - name: Regression2
  6. parameters: { count: 10 }
  7. excludedGroups: [ broken ]
  8. classes:
  9. - test.listeners.ResultEndMillisTest

注意:
默认情况下,TestNG 不会将 YAML 相关库引入您的类路径。因此,根据您的构建系统(Gradle/Maven),您需要在构建文件中添加对 YAML 库的显式引用。
例如,如果您使用的是 Maven,则需要在pom.xml文件中添加如下依赖项:

  1. <dependency>
  2. <groupid>org.yaml</groupid>
  3. <artifactid>snakeyaml</artifactid>
  4. <version>1.23</version>
  5. </dependency>

或者,如果您使用的是 Gradle,您可以在build.gradle文件中添加如下依赖项:

  1. compile group: 'org.yaml', name: 'snakeyaml', version: '1.23'