TestNG整理

来源:互联网 发布:c语言产生1-100随机数 编辑:程序博客网 时间:2024/05/29 00:32

1 基本概念

TestNG:即Testing, Next Generation,下一代测试技术,是根据JUnit和NUnit思想,采用jdk的annotation技术来强化测试功能并借助XML 文件强化测试组织结构而构建的测试框架。最新版本5.12,Eclipse插件最新版本:testng-eclipse-5.12.0.6

TestNG的应用范围:

Ø单元测试

Ø集成测试

Ø系统测试

使用TestNG的主要步骤:

Ø编写测试业务逻辑,在代码中插入TestNG annotations

Ø在配置文件testng.xml或build.xml中配置测试信息

Ø运行TestNG

TestNG运行方式:

1、命令行方式

java org.testng.TestNG testng1.xml [testng2.xml testng3.xml ...]

2、Ant/Maven集成方式clip_image002

3、Eclipse集成方式

TestNG提供Eclipse插件,在run configure中进行配置

4、IntelliJ‘s IDEA 及 NetBeans

TestNG的主要特点:

1.Annotation

2.依赖性测试

3.支持并发测试

4.支持错误重运行测试

5.参数化测试

6.支持测试分组

7.通过testng.xml来管理测试

8.详实的报告,可按照自己需要进行二次开发定制

9.可以运行Junit测试

10.不仅仅适用于单元测试

TestNG利用annotation来标注测试类,使用annotation的优点:

方法名称不受任何模式或者格式的束缚;

测试类不需要从任何其他类继承;

如下是TestNG使用的annotation清单:

• @BeforeSuite, @BeforeTest, @BeforeClass,@BeforeMethod, @BeforeGroups

@BeforeSuite:        被注释的方法将在所有测试运行前运行

@BeforeTest:        被注释的方法将在测试运行前运行

@BeforeClass:        被注释的方法将在当前类的第一个测试方法调用前运行。

@BeforeMethod:        被注释的方法将在每一个测试方法调用前运行。

@BeforeGroups:        被配置的方法将在列表中的gourp前运行。这个方法保证在第一个属于这些组的测试方法调用前立即执行。


• @AfterSuite, @AfterTest, @AfterClass, @AfterMethod, @AfterGroups

@AfterSuite:        被注释的方法将在所有测试运行后运行
@AfterTest:        被注释的方法将在测试运行后运行
@AfterGroups:        被配置的方法将在列表中的gourp后运行。这个方法保证在最后一个属于这些组的测试方法调用后立即执行。
@AfterClass:        被注释的方法将在当前类的所有测试方法调用后运行。
@AfterMethod:        被注释的方法将在每一个测试方法调用后运行。


@DataProvider    标记一个方法用于为测试方法提供数据。
      被注释的方法必须返回Object[][], 其中每个Object[]可以指派为这个测试方法的参数列表。
     从这个DataProvider接收数据@Test方法需要使用一个和当前注释相同名称的dataProvider名称
     name         这个DataProvider的名称


• @ExpectedExceptions

• @Factory 标记方法作为一个返回对象的工厂,这些对象将被TestNG用于作为测试类。这个方法必须返回Object[]

• @Test

标记一个类或方法作为测试的一部分
    alwaysRun     如果设置为true,这个测试方法将总是运行,甚至当它依赖的方法失败时。
    dataProvider     这个测试方法的data provider的名称
    dataProviderClass     用于查找data provider的类。
     如果不指定,将在当前测试方法所在的类或者它的基类上查找data provider。
     如果这个属性被指定, 则data provider方法需要是指定类的static方法。
    dependsOnGroups     当前方法依赖的组列表
    dependsOnMethods     当前方法依赖的方法列表
    description     当前方法的描述
    enabled     当前类的方法/方法是否被激活
    expectedExceptions     测试方法期望抛出的异常列表。如果没有异常或者抛出的不是列表中的任何一个,当前方法都将标记为失败.
    groups     当前类/方法所属的组列表
    invocationCount     当前方法被调用的次数
    successPercentage     当前方法期望的成功率
    sequential     如果设置为true,当前测试类上的所有方法保证按照顺序运行。甚至测试们在parallel="true"的情况下.
     这个属性只能用于类级别,如果用于方法级别将被忽略。
    timeOut     当前方法容许花费的最大时间,单位毫秒。
    threadPoolSize     当前方法的线程池大小。方法将被多线程调用,次数由invocationCount参数指定
    注意:如果invocationCount没有指定则这个属性将被忽略

• @Parameters  描述如何传递参数给@Test方法
    value    用于填充这个方法的参数的变量列表




属性:
    alwaysRun    对于每个bufore方法(beforeSuite, beforeTest, beforeTestClass 和 beforeTestMethod, 但是不包括 beforeGroups): 
     如果设置为true,被配置的方法将总是运行而不管它属于哪个组。
     对于after方法(afterSuite, afterClass, ...): 如果设置为true,被配置的方法甚至在一个或多个先调用的方法失败或被忽略时也将运行。
    dependsOnGroups        这个方法依赖的组列表
    dependsOnMethods    这个方法依赖的方法列表
    enabled            这个类的方法是否激活
    groups            这个类或方法所属的分组列表
    inheritGroups        如果设置为true,这个方法被属于在类级别被@Test annotation指定的组


注:
    上面是TestNG中用到的annotation列表,从中我们可以看到TestNG提供的一些特性
1. before方法和after方法    带来了足够丰富的测试生命周期控制
2. dependsOnGroups/dependsOnMethods 提供了依赖检查机制,并可以严格控制执行顺序
3. DataProvider 使得对同一个方法的测试覆盖变的非常轻松,非常适合进行边界测试,只要给出多种测试数据就可以针对一个测试方法进行覆盖
4. expectedExceptions 使得异常测试变的非常轻松
5. invocationCount/threadPoolSize 终于可以简单的直接进行多线程测试了,这个绝对是junit的超级弱项,回想junit中那个万恶的System.exist(0)...
6. timeOut 终于不用死等然后手工强行关闭测试,TestNG想的太周到了

testNG.xml实例:

clip_image004

v Suite:由一个XML文件表示,可以包含一个或者多个Test,suite可以通过标签来运行其他testng的xml文件;

v Test:表示一个测试,可以包含一个或者多个TestNG类;

v TestNG类:就是一个简单的Java类,至少包含一个TestNG annotation;

v Method:一个普通的Java方法,其前由@Test标记

v Groups:TestNG可以将不同的Method分类到不同的Groups中,也可以将Class分类到不同的Groups中

v testNG.xml:该文件是TestNG运行时需要的配置文件,描述了要运行哪些测试,主要是对测试进行控制使用

2 基本使用

2.1 处理异常

TestNG可以简单方便的检测异常的发生,通过@ExpectedExceptions标注预期捕获的异常,当确实发生预期的异常,TestNG认为测试通过。也可以指定标注多个异常,例如:

clip_image006

2.2 失败处理

当testNG运行的case有失败的时候,会在test-output目录下生成一个testng-failed.xml文件,这对于批量执行测试定位问题很有帮助,testng可以单独执行这些失败的测试;例如:

clip_image008

2.3 使用参数

TestNG传参数的两种方式(xml文件,@DataProvider)

l 使用testng.xml设置参数

clip_image010

Ø 参数在xml文件中可以在suite级别定义,也可以在test级别定义;

Ø TestNG会尝试先在包含当前类的test标签中寻找参数,如果没找到则在上层的suite标签中查找。即在test标签中相同的参数对当前类当前方法的优先级比较高。

Ø TestNG支持这种传参方式的类型如下:

■ String

■ int/Integer

■ boolean/Boolean

■ byte/Byte

■ char/Character

■ double/Double

■ float/Float

■ long/Long

■ short/Short

Ø 对于非上述类型TestNG无法通过这种方式进行传参,可以通过@DataProvider方式传参

l @DataProvider方式传参

clip_image012

Ø 只提供了一个字符串属性:名称,供测试方法作为传递参数的annotation使用

Ø 两种DataProvider,一种是返回一个二维数组对象,如上面的例子;另外一种DataProvider是返回一个Iterator

Ø DataProvider可以向测试方法传递任意类型任意数目的参数

Ø 利用DataProvider提供不同的参数集合对一个测试方法进行多次调用

l @DataProvider和testNG.xml两种方式的比较

 

优点

不足

testng.xml

参数值在xml文件中指定,易于修改,修改后无需编译代码

传递参数的类型有限,只能传递基本的数据类型,复杂的Java对象无法传递

@DataProvider

可以向测试方法传递任何类型,任意数量的Java对象

需要编码实现某些逻辑,以返回正确的对象

2.4 依赖测试

l Groups依赖

TestNG对此用@Test的两个属性标签(dependsOnGroups,dependsOnMethods)进行支持,例如:

clip_image014

执行测试的顺序依次为:lanchuServer->deploy->test1

l 方法依赖

是指由@BeforeMethod、@BeforeTest、@Beforeclase、@BeforeSuite @BeforeGroups等标识指定的内容。

2.5 并发测试

TestNG内建了对并发的支持,可以快速执行测试,并验证代码的线程安全性

clip_image016

Ø 其可能的执行结果为

• 线程号为: 11

• 线程号为: 15

• 线程号为: 12

• 线程号为: 14

• 线程号为: 13

Ø 当将threadPoolSize改为3后,其可能的执行结果如下:

• 线程号为: 13

• 线程号为: 12

• 线程号为: 11

• 线程号为: 12

• 线程号为: 11

v 并发执行:针对suite来定义并发线程数等,可以提高执行测试的速度。

<suite name="“TestConcurrentRunning"" verbose="1" <="" p="">

parallel="methods" thread-count="2">

...

v Parellel = “methods”,每个测试方法在自己的一个线程中执行

v Parrellel=“tests”,在某个标签内的所有的测试方法在一个线程中执行;在测试线程不安全的代码,通常这样执行


原文请见 http://testng.org/doc/documentation-main.html 

              http://joinyo.iteye.com/blog/1820431

             http://blog.csdn.net/xiaoping8411/article/details/6155781

0 0
原创粉丝点击