测试运行的结果在启动 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;
@Override
public void onTestFailure(ITestResult tr) {
log("F");
}
@Override
public void onTestSkipped(ITestResult tr) {
log("S");
}
@Override
public 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.5
Total 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: SingleSuite
threadCount: 4
parameters: { n: 42 }
tests:
- name: Regression2
parameters: { 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'