1. TestNG API

本章节将讨论如何使用TestNG API来创建自己的TestNG对象。TestNG的API基本由接口组成,这样做是为了容易模拟TestNG返回的对象。

1.1 org.testng.TestNG、ITestResult、ITestListener、ITestNGMethod

TestNG类是TestNG的的主入口,它让我们指定测试类,指定包含的分组或排除的分组,指定要执行的XML文件等。

public static void mian(String[] args){
TestNG tng = new TestNG();
tng.setTestClasses(new Class[]{ MyTest.class});
TestListenerAdapter listener = new TestListenerAdapter();
tng.addListener(listener);
tng.run();
log("PASSED:" + listener.getPassedTests().size());
}

这里TestListenerAdapter类提供了ITestListener接口的一个简单实现。这里使用TestListenerAdapter的另一项功能:记录所有通过的测试案例数量。

通过TestListenerAdapter可以方便的获取结果的程序清单,如果需要为这个类添加功能,又保留测试结果程序清单,则可以调用被覆盖方法的super()方法,如下所示:

public class MyTestListener extends TestListenerAdapter{
public void onTestSuccess(ITestResult result){
super.onTestSuccess(result);
//do you own processing
}
}

TestListenerAdapter 保存了测试结果:

public List<ITestResult> getPassedTests()
public List<ITestResult> getFailedTests()
public List<ITestResult> getSkippedTests()

ITestResult 接口能让我们获取某个测试状态、测试方法、参数,以及开始时间和结束时间:

public void onTestSuccess(ITestResult iTestResult) {
long time =
(iTestResult.getEndMillis() - iTestResult.getStartMillis());
log("Success, method:" + iTestResult.getMethod()
+" #parameters:"+iTestResult.getParameters().length
+ " time:" + time);
}

ITestResult# getResult 返回一个ITestNGMethod,这个是TestNG对测试方法的一个视图。从这个对象我们可以获得TestNG对象当前调用的原始java.lang.reflact.Method, 并获得其他信息,如:

  • 分组/方法信息(这个方法所属的分组,它依赖的分组和方法)。
  • 调用的次数,线程池的大小以及超时设置。
  • 这个方法是否是一个配置方法(@Before/@After), 它是哪一种配置方法:
ITestNGMethod method = iTestResult.getMethod();
log(" Method:"+method.getMethodName()
+" invocationCount:" +method.getInvocationCount()
+" #groups:"+method.getGroups().length
+" timeOut:"+method.getTimeOut());

1.2 XML API

TestNG提供了一个简单的接口,让我们访问自己的testng.xml, 甚至可以从头创建它。与XML API相关的这些类在org.testng.xml中,每个XML标签都有一个对应的类:

标签

类名

<suite> XmlSuite
<test> XmlTest
<package> XmlPackage
<class> XmlClass
<method-selector> XmlMethodSelector

xml 文件如下:

<suite name="testng" verbose="1" thread-count="2">
<parameter name="first-name" value="cedric" />
<test name="Regression 1">
<group>
<run>
<exclude name="excludeThisGroup"/>
</run>
</group>
<classes>
<class name="test.parameter.test1" />
<class name="test.parameter.test2" />
</classes>
</test>
</suite>

XmlSuite的值:

方法 返回结果
getName() testng
getVerbose() true
getThreadCount() 2
getParameters() Map<String, String>:{“first-name”=>”cedric”}
geTests() List<XmlTest>

XmlTest的值:

方法 返回结果
getName() Regression1
getIncludeGroups() {}
getExcludeGroups() List<String>:{“excludeThisGroup”}
getXmlClasses List<XmlClasses>:{
“test.parameter.test1”,
”test.parameter.test2”
}
geTests() List<XmlTest>

1.3
生成xml文件

XmlSuite suite = new XmlSuite();
suite.setName("TestNG");
suite.setVerbose(1);
suite.setThreadCount(2);
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("first-name", "credic");
suite.setParameters(parameters); XmlTest test = new XmlTest(suite);
test.setName("regression1");
test.setExcludedGroups(Arrays.asList(new String[]{"excludedGroup"})); XmlClass[] classes = new XmlClass[]{
new XmlClass("test.parameters.test1"),
new XmlClass("test.parameters.test1"),
};
test.setXmlClasses(Arrays.asList(classes); TestNG tng = new TestNG();
//指定xml路径方式
tng.setTestSuites(Arrays.asList(new String[]{
"testng.xml","test-15/testng.xml"}))
//使用当前生成的文件
tng.setXmlSuites(Arrays.asList(new XmlSuite[]{ suite }));
tng.run();

2. 方法选择器:

Testng通过方法选择器(IMethodSelector)来决定在执行测试时,包含或排除哪些方法。

TestNG的默认方法选择器:XmlMethodSelector,它会根据testng.xml中的内容来实现决定逻辑,它的优先级为10.

  • 如果希望你自己的选择器先调用,则可以把优先级设为0~9.
  • 如果先考虑testng.xml, 则把优先级设置为大于10.
  • 如果希望自己的方法选择器替换所有默认的方法,将优先级设置为负数。在这种情况下只有带负数优先级的方法选择器会生效。
  • 方法选择器直接是OR的关系:即一个方法选择器对某个测试方法返回true,则这个测试方法就会包含在这次执行中,否则,具有下一个优先级的方法选择器会被调用(0排在10前面)。如果没有方法选择器则返回true,这个测试方法不会执行。

3 annotation转换器(annotationTransformer)

用户实现annotation转换器,是为了覆盖TestNG在运行时看到的annotation。

public void InvocationTransform implements IAnnotationTransformer{
public void transform(ITest test, class cls, Constructor con, Method method){
if("two".equals(method.getName()){
test.setInvocationCount(2);
}else if("three".equals(method.getName()){
test.setInvocationCount(3);
}
}
}

其他用法:

  • timeout:修改测试方法的超时设置;
  • enabled:修改 @Test annotation上的enabled标识。
  • invocationCount:用于多线程环境或负载测试。
  • threadPoolSize:annotation可以查询本地信息(处理器个数,可用堆大小或计算机负载),然后增加或减少线程池的大小。
  • successPercentage:和invocationCount一起使用,允许一定的失败比例。
  • dataprovider:在运行时修改数据提供者的名称。用于数据提供者本身执行动态判断。
  • description:用于HTML报告生成。
  • group:可以进行基于环境的变量分组调整。
  • dependsOnGroups/dependsOnMethod/alwaysRun:这些属性会直接影响执行顺序,请尽量避免使用annotation转换器来修改他们。

4. 报告api

4.1 默认报告:

默认报告生成在./test-output目录下

4.2 报告api

  • 利用org.testng.Reporter类,向默认报告添加定制信息。
  • ITestListener 是一个实现了org.testng.ITestListener接口的类,其中的onStart()和onFinish() 分别在testSuite开始和结束时被调用。onTest*开头的方法在测试方法被执行时调用。
  • IReporter 实现了org.testng.IReporter接口

TestNG扩展的更多相关文章

  1. 收藏清单: python测试框架最全资源汇总

    xUnit frameworks 单元测试框架 frameworks 框架 unittest - python自带的单元测试库,开箱即用 unittest2 - 加强版的单元测试框架,适用于Pytho ...

  2. 转 python测试框架最全资源汇总

    转自: http://www.testclass.net/list/python_list_1/ xUnit frameworks(单元测试框架) frameworks 框架 unittest - p ...

  3. python测试框架&&数据生成&&工具最全资源汇总

    xUnit frameworks 单元测试框架frameworks 框架unittest - python自带的单元测试库,开箱即用unittest2 - 加强版的单元测试框架,适用于Python 2 ...

  4. APP接口自动化测试JAVA+TestNG(二)之TestNG简介与基础实例

    前言 继上篇环境篇后,本篇主要对TestNG进行介绍,给出最最基础的两个实例,通过本文后,学会并掌握TestNG测试用例的编写与运行,以及生成美化后的报告.下一篇为HTTP接口实战(国家气象局接口自动 ...

  5. TestNG

    一.TestNG 是什么 ? 脱胎于业界标杆的Junit,并超于Junit,主要原因是由于当时的JUnit3版本不支持annotation,使用不够灵活. TestNG不再需要test前缀的命名方式. ...

  6. selenium第一课(selenium+java+testNG+maven)

    selenium介绍和环境搭建 一.简单介绍 1.selenium:Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包 ...

  7. (转)testng对失败时截图处理

    写这篇微博之前,自动化测试代码中有对于失败测试截图的功能,但是却散落在各个catch语句块中.不便于以后的扩展和维护,AOP思想里说明是面向切面编程,把公共的组件提取出来,可以单独修改维护. 但是直到 ...

  8. testng参数化(提供测试数据)【转】

    testng提供测试数据的两个注释:@DataProvide和@Parameter   一.通过testng.xml中设置参数 (实际上testng.xml只是一个名字,可以起任何一个名字,只要是.x ...

  9. TestNG 三 测试方法

    一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递正确的参数. 设置方式有两种方法:使用testng.xml或 ...

随机推荐

  1. 汇编学习笔记(14)BIOS对键盘输入的处理

    字符的处理 键盘输入的字符一般由int9中断例程从60h端口中读取,并存放在键盘缓冲区中,由int16h例程从键盘缓冲区中读取相应字符,CPU对键盘输入a.shift_a的处理过程如下 1.一开始没有 ...

  2. unity3d Hair real time rendering 真实头发实时渲染

    先放上效果 惊现塞拉酱 算法是Weta Digital根据siggraph2003的论文加以改进,改进之前使用的是Kajiya and Kay’s 模型,它能量不守恒,也就是说不是基于物理的,不准确 ...

  3. C++获取本机IP地址

    对网络库简单的封装了一下,以后自己使用的时候方便了很多 #include <WinSock2.h> #pragma comment(lib,"ws2_32") //链接 ...

  4. JavaScript高级程序设计3.pdf

    do-while语句是一种后测试循环语句do {statement} while (expression),至少会循环一次 while语句是一种前测试循环语句while (expression) st ...

  5. 来更新一篇blog吧

    最近做了一下hackerrank的20/20的比赛.平时都只能过2题,这周顺利地通过了四道题目竟然.当妄图冲击衬衫的时候,发现剩下三个题一点招数都没有,之后就跑去看了一下node.js了... 这次比 ...

  6. 移动开发框架,第【一】弹:QuoJs 官方文档(汉化版)

    作者:一只猿 原文地址: http://www.92ez.com 转载请注明出处,谢谢 帮助说明 如果您认为QuoJS只是一个触摸事件管理器,那你就错了,它是一个功能丰富的类库,无需第三方JavaSc ...

  7. Windows 服务卸载之后 重新安装提示 “指定的服务已标记为删除”

    背景:        将一个项目做成一个windows服务,在调试的时候,需要卸载.安装该服务,但提示下面的错误:“指定的服务已标记为删除”,进入服务管理界面,启动自己注册的服务,无法手动更改成启用模 ...

  8. SQL Server 2012 sa 用户登录 18456 错误

    近期想研究下SQL SERVER2012 Enterprise版本号的数据库,听说功能非常强大. 我是在win7上安装的,安装的过程非常顺利,我在用"Windows 身份验证"时, ...

  9. I/O体系结构和设备驱动程序

    http://blog.csdn.net/kafeiflynn/article/category/789844

  10. MyEclipse8.6安装svn(非link方式)

    此方法经试验可行,暂时可以作为最佳解决方案. 本文所使用的MyEclipse版本为:8.6.1 svn的eclipse插件版本为:1.6.17,下载地址:http://subclipse.tigris ...