测试运行的结果在启动 SuiteRunner 时指定的目录中的index.html文件中创建。该文件指向包含整个测试运行结果的各种其他 HTML 和文本文件。
使用带有 Listeners 和 Reporters 的 TestNG 生成您自己的报告非常容易:
- 侦听器实现接口org.testng.ITestListener并实时通知测试何时开始、通过、失败等…
- Reporters实现接口org.testng.IReporter并在所有套件都由 TestNG 运行时收到通知。IReporter 实例接收描述整个测试运行的对象列表。
例如,如果要生成测试运行的 PDF 报告,则不需要实时通知测试运行,因此您可能应该使用IReporter。如果您想编写测试的实时报告,例如带有进度条的 GUI 或在调用每个测试时显示点(“.”)的文本报告器(如下所述),ITestListener是您的最好的选择。
记录监听器listener
这是一个显示“.”的侦听器。对于每个通过的测试,每个失败一个“F”,每个跳过一个“S”:
public class DotTestListener extends TestListenerAdapter {private int m_count = 0;@Overridepublic void onTestFailure(ITestResult tr) {log("F");}@Overridepublic void onTestSkipped(ITestResult tr) {log("S");}@Overridepublic void onTestSuccess(ITestResult tr) {log(".");}private void log(String string) {System.out.print(string);if (++m_count % 40 == 0) {System.out.println("");}}}
在这个例子中,我选择扩展TestListenerAdapter,它用空方法实现ITestListener,所以我不必重写接口中我不感兴趣的其他方法。如果你愿意,可以直接实现接口。
下面是我如何调用 TestNG 来使用这个新的监听器:
java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -listener org.testng.reporters.DotTestListener test\testng.xml
和输出:
.................................................................................................................................................................................................................................===============================================TestNG JDK 1.5Total tests run: 226, Failures: 0, Skips: 0===============================================
请注意,当您使用-listener 时,TestNG 将自动确定您要使用的侦听器类型。
记录报告器Reporter
该org.testng.IReporter接口只有一个方法:
public void generateReport(List<ISuite> suites, String outputDirectory)
当所有套件都已运行时,TestNG 将调用此方法,您可以检查其参数以访问刚刚完成的运行的所有信息。
JUnitReports
TestNG 包含一个监听器,它接收 TestNG 结果并输出一个 XML 文件,然后可以将其馈送到 JUnitReport。 这是一个示例,以及创建此报告的 ant 任务:
<target name="reports"><junitreport todir="test-report"><fileset dir="test-output"><include name="*/*.xml"/></fileset><report format="noframes" todir="test-report"/></junitreport></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。
可以通过的全套选项在下表中详细说明。确保使用:
- : - 将报告者名称与其属性分开
- = - 分隔属性的键/值对
- , - 分隔多个键/值对
以下是此类报告器的输出示例:
<testng-results><suite name="Suite1"><groups><group name="group1"><method signature="com.test.TestOne.test2()" name="test2" class="com.test.TestOne"/><method signature="com.test.TestOne.test1()" name="test1" class="com.test.TestOne"/></group><group name="group2"><method signature="com.test.TestOne.test2()" name="test2" class="com.test.TestOne"/></group></groups><test name="test1"><class name="com.test.TestOne"><test-method status="FAIL" signature="test1()" name="test1" duration-ms="0"started-at="2007-05-28T12:14:37Z" description="someDescription2"finished-at="2007-05-28T12:14:37Z"><exception class="java.lang.AssertionError"><short-stacktrace><![CDATA[java.lang.AssertionError... Removed 22 stack frames]]></short-stacktrace></exception></test-method><test-method status="PASS" signature="test2()" name="test2" duration-ms="0"started-at="2007-05-28T12:14:37Z" description="someDescription1"finished-at="2007-05-28T12:14:37Z"></test-method><test-method status="PASS" signature="setUp()" name="setUp" is-config="true" duration-ms="15"started-at="2007-05-28T12:14:37Z" finished-at="2007-05-28T12:14:37Z"></test-method></class></test></suite></testng-results>
此报告器与其他默认侦听器一起注入,因此您可以默认获得这种类型的输出。侦听器提供了一些属性,可以调整报告器以满足您的需求。下表包含这些属性的列表以及简短说明,详见官网参数列表
TestNG 退出代码
当 TestNG 完成执行时,它会以返回码退出。
可以检查此返回代码以了解故障的性质(如果有的话)。
下表总结了 TestNG 当前使用的不同退出代码
YAML支持
TestNG 支持YAML作为指定套件文件的替代方式。例如,以下 XML 文件:
<suite name="SingleSuite" verbose="2" thread-count="4"><parameter name="n" value="42" /><test name="Regression2"><groups><run><exclude name="broken" /></run></groups><classes><class name="test.listeners.ResultEndMillisTest" /></classes></test></suite>
testng.yaml
name: SingleSuitethreadCount: 4parameters: { n: 42 }tests:- name: Regression2parameters: { count: 10 }excludedGroups: [ broken ]classes:- test.listeners.ResultEndMillisTest
注意:
默认情况下,TestNG 不会将 YAML 相关库引入您的类路径。因此,根据您的构建系统(Gradle/Maven),您需要在构建文件中添加对 YAML 库的显式引用。
例如,如果您使用的是 Maven,则需要在pom.xml文件中添加如下依赖项:
<dependency><groupid>org.yaml</groupid><artifactid>snakeyaml</artifactid><version>1.23</version></dependency>
或者,如果您使用的是 Gradle,您可以在build.gradle文件中添加如下依赖项:
compile group: 'org.yaml', name: 'snakeyaml', version: '1.23'
