如果一个测试没有抛出任何异常就完成运行或者说抛出了期望的异常(参见@Test注解的expectedExceptions属性文档),就说,这个测试时成功的。
测试方法的组成常常包括抛出多个异常,或者包含各种各样的断言(使用Java "assert" 关键字)。一个 "assert" 失败会触发一个 AssertionErrorException,结果就是测试方法被标记为失败(记住,如果你看不到断言错误,要在加上 -ea 这个JVM参数)。
下面是个例子:
@TestTestNG 也包括 JUnit 的 Assert 类,允许你对复杂的对象执行断言:
public void verifyLastName() {
assert "Beust".equals(m_lastName) : "Expected name Beust, for" + m_lastName;
}
import static org.testng.AssertJUnit.*;
//...
@Test
public void verify() {
assertEquals("Beust", m_lastName);
}
注意,上述代码使用了静态导入,以便能够使用 assertEquals 方法,而无需加上它的类前缀。
通过使用监听器和报表器,可以很轻松的生成自己的TestNG报表:
6.2.1 - 日志监听器
这里是对每个传递进来的测试显示"."的监听器,如果测试失败则显示 "F" ,跳过则是"S":
public class DotTestListener extends TestListenerAdapter {上例中,我们选择扩展 TestListenerAdapter ,它使用空方法实现了 ITestListener 。所以我不需要去重写那些我不需要的方法。如果喜欢可以直接实现接口。
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("");
}
}
}
这里是我使用这个新监听器调用TestNG的例子:
java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -listener org.testng.reporters.DotTestListener test/testng.xml输出是:
........................................注意,当你使用 -listener 的时候,TestNG 会自动的检测你所使用的监听器类型。
........................................
........................................
........................................
........................................
.........................
===============================================
TestNG JDK 1.5
Total tests run: 226, Failures: 0, Skips: 0
===============================================
6.2.2 - 日志报表
org.testng.IReporter 接口只有一个方法:
public void generateReport(List<ISuite> suites, String outputDirectory)这个方法在 TestNG 中的所有测试都运行完毕之后被调用,这样你可以方法这个方法的参数,并且通过它们获得刚刚完成的测试的所有信息。
6.2.3 - JUnit 报表
TestNG 包含了一个可以让TestNG的结果和输出的XML能够被JUnitReport所使用的监听器。这里 有个例子,并且ant任务创建了这个报告:
name="reports">
todir="test-report">
dir="test-output">
name="*/*.xml"/>
format="noframes" todir="test-report"/>
注意: 由于JDK 1.5 和 JUnitReports 不兼容性,导致了frame版本不能够正常工作,所以你需要指定 "noframes" 使其能够正常工作。6.2.4 - 报表 API
如果你要在HTML报告中显示日志信息,那么就要用到类 org.testng.Reporter:
Reporter.log ( "M3 WAS CALLED" ) ;6.2.5 - XML 报表
TestNG 提供一种XML报表器,使得能够捕捉到只适用于TestNG而不适用与JUnit报表的那些特定的信息。这在用户的测试环境必须要是用TestNG特定信息的XML,而JUnit又不能够提供这些信息的时候非常有用。下面就是这种报表器生成XML的一个例子:
name="Suite1">
name="group1">
signature="com.test.TestOne.test2()" name="test2" class="com.test.TestOne"/>
signature="com.test.TestOne.test1()" name="test1" class="com.test.TestOne"/>
name="group2">
signature="com.test.TestOne.test2()" name="test2" class="com.test.TestOne"/>
name="test1">
name="com.test.TestOne">
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">
class="java.lang.AssertionError">
java.lang.AssertionError
... Removed 22 stack frames
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">
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">
这个报表器是随着默认监听器一起诸如的,所以你默认的情况下就可以得到这种类型的输出。这个监听器提供了一些属性,可以修改报表来满足你的需要。下表包含了这些属性,并做简要说明:
属性 | 说明 | Default value |
---|---|---|
outputDirectory | 一个 String 指明了XML文件要存放的目录 | TestNG 输出目录 |
timestampFormat | 指定报表器生成日期字段的格式 | yyyy-MM-dd'T'HH:mm:ss'Z' |
fileFragmentationLevel | 值为1,2或3的整数,指定了XML文件的生成方式:1 - 在一个文件里面生成所有的结果 |
1 |
splitClassAndPackageNames | boolean值,指明了对 |
false |
generateGroupsAttribute | boolean值指定了对 |
false |
stackTraceOutputMethod | 指定在发生异常的时候生成异常,追踪弹栈信息的类型,有如下可选值:0 - 无弹栈信息 (只有异常类和消息). |
2 |
generateDependsOnMethods | 对于 |
true |
generateDependsOnGroups | 对于 |
true |
为了配置报表器,你可以在命令行下使用 -reporter 选项,或者在 Ant 任务中嵌入
返回到 我的个人主页。
或者看看我的其他项目: