一、成功、失败和断言

如果一个测试没有抛出任何异常就完成运行或者说抛出了期望的异常(参见@Test注解的expectedExceptions属性文档),就说,这个测试时成功的。

测试方法的组成常常包括抛出多个异常,或者包含各种各样的断言(使用Java "assert" 关键字)。一个"assert"失败会触发一个AssertionErrorException,结果就是测试方法被标记为失败(记住,如果你看不到断言错误,要在加上 -ea 这个JVM参数)。

下面是个例子:

  1. @Test
  2. public void verifyLastName() {
  3. assert "Beust".equals(m_lastName) : "Expected name Beust, for" + m_lastName;
  4. }
  5. TestNG 也包括 JUnit 的 Assert 类,允许你对复杂的对象执行断言:
  6. import static org.testng.AssertJUnit.*;
  7. //...
  8. @Test
  9. public void verify() {
  10. assertEquals("Beust", m_lastName);
  11. }

注意,上述代码使用了静态导入,以便能够使用 assertEquals 方法,而无需加上它的类前缀。

二、日志与结果

当运行SuiteRunner的时候会指定一个目录,之后测试的结果都会保存在一个在那个目录中叫做index.html 的文件中。这个index文件指向其他多个HTML和文本文件,被指向的文件包含了整个测试的结果。你可以再这里看到一个例子。

通过使用监听器和报表器,可以很轻松的生成自己的TestNG报表:

(1)监听器---实现接口 org.testng.ITestListener ,并且会在测试开始、通过、失败等时刻实时通知

(2)报告器---实现接口org.testng.IReporter ,并且当整个测试运行完毕之后才会通知。IReporter 接受一个对象列表,这些对象描述整个测试运行的情况

例如,如果你想要生成一个PDF报告,那么就不需要实时通知,所以用IReporter。如果需要写一个实时报告,例如用在GUI上,还要在每次测试时(下面会有例子和解释)有进度条或者文本报告显示点 ("."),那么 ITestListener 是你最好的选择。

例如,如果你想要生成一个PDF报告,那么就不需要实时通知,所以用IReporter。如果需要写一个实时报告,例如用在GUI上,还要在每次测试时(下面会有例子和解释)有进度条或者文本报告显示点 ("."),那么ITestListener 是你最好的选择。

1.日志监听器

这里是对每个传递进来的测试显示"."的监听器,如果测试失败则显示 "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的例子:

java -classpath testng.jar;%CLASSPATH%org.testng.TestNG -listener org.testng.reporters.DotTestListenertest/testng.xml

2.日志报表

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

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

这个方法在 TestNG 中的所有测试都运行完毕之后被调用,这样你可以修改这个方法的参数,并且通过它们获得刚刚完成的测试的所有信息。

3.JUnit 报表

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 不兼容性,导致了frame版本不能够正常工作,所以你需要指定 "noframes" 使其能够正常工作。

4.报表 API

如果你要在HTML报告中显示日志信息,那么就要用到类 org.testng.Reporter:

Reporter.log("M3 WAS CALLED");

5. XML 报表

TestNG 提供一种XML报表器,使得能够捕捉到只适用于TestNG而不适用与JUnit报表的那些特定的信息。这在用户的测试环境必须要是用TestNG特定信息的XML,而JUnit又不能够提供这些信息的时候非常有用。下面就是这种报表器生成XML的一个例子:

  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>java.lang.AssertionError
  19. ... Removed 22 stack frames
  20. </short-stacktrace>
  21. </exception>
  22. </test-method>
  23. <test-method status="PASS" signature="test2()" name="test2" duration-ms="0"
  24. started-at="2007-05-28T12:14:37Z" description="someDescription1"
  25. finished-at="2007-05-28T12:14:37Z">
  26. </test-method>
  27. <test-method status="PASS" signature="setUp()" name="setUp" is-config="true" duration-ms="15"
  28. started-at="2007-05-28T12:14:37Z" finished-at="2007-05-28T12:14:37Z">
  29. </test-method>
  30. </class>
  31. </test>
  32. </suite>
  33. </testng-results>

这个报表器是随着默认监听器一起诸如的,所以你默认的情况下就可以得到这种类型的输出。这个监听器提供了一些属性,可以修改报表来满足你的需要。下表包含了这些属性,并做简要说明:

为了配置报表器,你可以在命令行下使用 -reporter 选项,或者在 Ant 任务中嵌入<reporter> 元素。对于每个情况,你都必须指明类org.testng.reporters.XMLReporter。但是要注意你不能够配置内建的报表器,因为这个只使用默认配置。如果你的确需要XML报表,并且使用自定义配置,那么你就不得不手工完成。可以通过自己添加一两个方法,并且禁用默认监听器达到目的。

本文转载自http://blog.sina.com.cn/bestfeiyong

TestNG 六 测试结果的更多相关文章

  1. TestNG之测试执行后没有生成默认测试报告(IDEA)

    使用IDEA+TestNG进行测试,没有生成 测试报告,是因为没有勾选监听器使用默认报告,具体操作如下: “Run” -> "Edit Configurations" -&g ...

  2. TestNG 搭建测试框架 自动化测试

    框架层级及基本组件:    参考:https://www.cnblogs.com/jier888/p/8998724.html Java作为开发语言 Maven管理项目及Jar包 Testng作为测试 ...

  3. testng入门教程10 TestNG参数化测试

    在TestNG的另一个有趣的功能是参数测试.在大多数情况下,你会遇到这样一个场景,业务逻辑需要一个巨大的不同数量的测试.参数测试,允许开发人员运行同样的测试,一遍又一遍使用不同的值. TestNG让你 ...

  4. testng入门教程9 TestNG依赖测试

    有时候,你可能需要在一个特定的顺序调用方法在测试案例,或你想分享一些数据和方法之间的状态.TestNG支持这种依赖测试方法之间的显式依赖它支持声明. TestNG允许指定依赖,无论与否: 使用属性de ...

  5. testng入门教程8 TestNG异常测试

    TestNG跟踪异常处理代码提供了一个选项.可以测试是否需要代码抛出异常或不抛出. @Test注释expectedExceptions 参数一起使用.现在,让我们来看看@Test(expectedEx ...

  6. testng入门教程7 TestNG组测试

    在TestNG中组测试是一个新的创新功能,它不存在于JUnit框架,它允许调度到适当的部分方法和瓶坯复杂的测试方法分组.您不仅可以声明属于群体的那些方法,但你也可以指定一组包含其他组.然后,TestN ...

  7. testng入门教程6 TestNG忽略测试

    有时,我们的代码是没有准备好,如果测试用例写入到测试方法/代码将无法运行,在这种情况下,@Test(enabled = false)有助于禁用此测试案例. 测试方法是标注了@Test(enabled ...

  8. testng入门教程2用TestNG编写测试及执行测试

    编写TestNG测试基本上包括以下步骤: 测试和编写业务逻辑,在代码中插入TestNG的注解.. 添加一个testng.xml文件或build.xml中在测试信息(例如类名,您想要运行的组,等..) ...

  9. TestNG套件测试

    TestNG套件测试 测试套件的测试是为了测试软件程序的行为或一系列行为的情况下,是一个集合.在TestNG,我们不能定义一套测试源代码,但它代表的套件是一个XML文件执行特征.这也允许灵活的配置要运 ...

随机推荐

  1. bzoj1597 斜率优化dp

    思路:先把没有用的土地去掉,然后按照x轴排序,容易得到dp转移方程 dp[ i ] = min{ dp[ j ] + b[ j + 1 ] * a[ i ] }    0 <= j < i ...

  2. B/S、C/S模式介绍

    1.B/S模式 B/S(Browser/Server,浏览器/服务器)方式的网络结构. ①.客户端统一采用浏览器如:Netscape和IE,通过Web浏览器向Web服务器提出请求,由Web服务器对数据 ...

  3. 有一种感动叫ACM(WJMZBMR在成都赛区开幕式上的讲话)

    各位选手,各位教练,大家好,我是来自清华大学交叉信息学院的陈立杰,今天很荣幸站在这里代表全体参赛选手发言.对于我来说,这是我第一次正式参加ACM的比赛.不过我跟ACM之间的缘分,大概在很早的时候就已经 ...

  4. Android基本概念总结

    Android工程师 源码开发(手机定制软件) 系统开发(驱动 系统软件) 应用开发 (单机 联网 游戏 应用) 一.Android应用程序的组成部分 Activity Activity 应用程序的表 ...

  5. 洛谷——P1916 小书童——蚂蚁大战

    P1916 小书童——蚂蚁大战 题目背景 小A在你的帮助下,开始“刷题”,他在小书童里发现了一款叫“蚂蚁大战”(又称蛋糕保卫战)的游戏.(你懂得) 题目描述 游戏中会出现n只蚂蚁,分别有a1,a2…… ...

  6. Standard - 多线程基本概念面试题待整理

    http://blog.csdn.net/dazhong159/article/details/7948327 http://z-jiankun.iteye.com/blog/1408471 http ...

  7. Oracle关于锁的几种类型和参数

    设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据的一致性和准确性.Oracle数据库封锁方式有三种:共享封锁,独占封锁,共享更新封锁 封锁类型 Oracle RDBMS的封锁类型可分 ...

  8. 【虚树】hdu6161 Big binary tree

    题意:一棵n个结点的完全二叉树,初始i号结点的权值为i.有两种操作:单点修改:询问经过某个结点的路径中,权值和最大的路径的权值和是多少. 修改的时候,暴力修改到根节点的路径上的点的f(x)即可. 跟虚 ...

  9. 【差分约束系统】【最短路】【spfa】CDOJ1646 穷且益坚, 不坠青云之志。

    求一个有n个元素的数列,满足任意连续p个数的和不小于s, 任意连续q个数的和不大于t. 令sum[i]表示前i项的和(0<=i<=n,sum[0]=0) 那么题目的条件可转化为: sum[ ...

  10. 【最大流/费用流】BZOJ1834-[ZJOI2010]network 网络扩容

    [题目大意] 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费 ...