testNG是一个测试框架,其灵感来自JUnit和NUnit的,但引入了一些新的功能,使其功能更强大,使用更方便。

testNG是一个开源自动化测试框架;testNG表示下一代。 testNG是类似于JUnit(特别是JUnit 4),但它不是一个JUnit扩展。它的灵感来源于JUnit。它的目的是优于JUnit的,尤其是当测试集成的类。 testNG的创造者是Cedric Beust(塞德里克·博伊斯特)

testNG消除了大部分的旧框架的限制,使开发人员能够编写更加灵活和强大的测试。 因为它在很大程度上借鉴了Java注解annotation(JDK5.0引入的)来定义的测试,它也可以告诉你如何使用这个新功能在真实的Java语言生产环境中。

testNG的特点:

  • 注解

  • testNG使用Java和面向对象的功能

  • 支持综合类测试(例如,默认情况下,没有必要创建一个新的测试每个测试方法的类的实例)

  • 独立的编译时间测试代码运行时配置/数据信息

  • 灵活的运行时配置

  • 主要介绍“测试组”。当编译测试,只要问testNG运行所有的“前端”的测试,或“快”,“慢”,“数据库”等

  • 支持依赖测试方法,并行测试,负载测试,局部故障

  • 灵活的插件API

  • 支持多线程测试

  testNG.xml文件记录了一些非常简单的术语。xml是一个以XML记录所有测试的文件口这个文件能够很容易地在一个文件中描述所有测试套件和它们的参数,可以将它签人到代码库中,或通过电子邮件发送给其他组员。也可以很容易地提取测试的子集,或分成几种运行时配置。这个文件并不是运行testNG所必须的。

  一个suite(套件)由一个或多个测试组成。

  一个test(测试)由一个或多个类组成。

  一个class(类)由一个或多个方法组成。

testNG相对于junit的一些优点:

  1. testNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试到集成测试这个是testNG设计的出发点,不仅仅是单元测试,而且可以用于集成测试。设计目标的不同,对比junit的只适合用于单元测试,testNG无疑走的更远。可以用于集成测试,这个特性是我选择testNG的最重要的原因。

  2. 测试的过程的三个典型步骤,注意和junit(4.0)相比,多了一个将测试信息添加到testng.xml文件或者build.xml测试信息尤其是测试数据不再写死在测试代码中,好处就是修改测试数据时不需要修改代码/编译了,从而有助于将测试人员引入单元测试/集成测试。

  3. 基本概念,相比junit的TestCase/TestSuite,TestNG有suite/test/test method三个级别,即将test/test method明确区分开了。

基本使用:

  1、异常处理

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

@Test (expectedExceptions={Exception.class,Exception2.class})

使用这个来支持异常的测试有两个优点:

  • 使我们的意图变得非常清楚,只要看下@test就知道将会发生什么

  • 消除了try、catch、fail空语句给代码带来的干扰,让代码注重于业务逻辑。

像一次抛出多个异常,我们还是没有办法决定具体是那个异常没有抛出,这样就会想到分开测试单个异常。如:

测试类中的每个方法只关注一个非常具体的任务,这符合软件过程原则,单一职责原则。

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

有以下测试文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class testngTest {
 
    @Test
    public void depend(){
 
    }
 
    @Test(dependsOnMethods = "depend")
    public void f(){
        throw new RuntimeException();
    }
 
    @Test
    public void failed(){
        throw new RuntimeException();
    }
}

产生的testng-failed.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite guice-stage="DEVELOPMENT" name="Failed suite [Default suite]">
  <test name="Default test(failed)">
    <classes>
      <class name="com.wt.others.testngTest">
        <methods>
          <include name="failed"/>
          <include name="depend"/>
          <include name="f"/>
        </methods>
      </class<!-- com.wt.others.testngTest -->
    </classes>
  </test<!-- Default test(failed) -->
</suite<!-- Failed suite [Default suite] -->

说明这failed和f方法都失败了,由于f方法依赖了depend的方法,所以depend方法也被列出来。不仅包含失败的方法,也包含它所依赖的方法。

那么修改之后,只需要运行这个文件就能够很容易的调试失败的测试方法。

3、使用参数

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

  • 使用testng.xml设置参数

  参数在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方式传参

  • DataProvider方式传参

 只提供了一个字符串属性:名称,供测试方法作为传递参数的annotation使用两种DataProvider,一种是返回一个二维数组对象,如上面的例子;另外一种DataProvider是返回一个Iterator,DataProvider可以向测试方法传递任意类型任意数目的参数,利用DataProvider提供不同的参数集合对一个测试方法进行多次调用。

4、Annotation

  快速预览,这些可以在官方的文档上找到更详细的资料。

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

5、分组

  testNG的annotation有分组的功能,这些分组的名称和编号完全由我们自己来决定。@Test(groups={"fast","database"})定义了分组之后可以在排除或者运行某个组。testNG容许执行复杂的测试方法分组。不仅可以申明方法属于组,而且可以指定分组包含其他分组。然后TestNG可以被调用,并被要求包含某些分组和排除其他的分组。这将提供怎样划分测试的最大弹性,并且如果想运行两个不同的测试装置不需要重新编译。

6、依赖

  有些时候,需要测试方法按照一个特定的顺序被调用。这非常有用,比如:
     *在运行更多测试方法前确认特定数量的测试方法调用完成并且成功
    *初始化测试并希望这个初始化方法也作为测试方法(被标记为@Before/After的方法将不作为最终报告的一部分)

  为了做到这点,需要使用@Test注解的dependsOnMethods属性或者dependsOnGroups属性。

  这里有两种依赖:
     * 强依赖。在运行你的测试方法前所有依赖方法必须运行并且成功。哪怕有一个依赖方法失败,测试方法都不会被调用,在报告中将被标记为SKIP。
     * 软依赖。测试方法在依赖方法运行后总是会被运行,即使某些依赖方法失败。对于只想确认测试方法是按照特定顺序运行,而测试方法并不真正依赖其他方法是否成功的情况下非常有用。软依赖通过在@Test注解中增加"alwaysRun=true"来实现。

  除了上面基本的使用之外还有,testNG在并发测试、异步测试和多线程测试方面的应用等等。

  关于testng的使用可以参考官方文档:http://testng.org/doc/documentation-main.html

  这是看了《java测试新技术--testng》这本书的一点记录,虽没有全部理解,但是对于很多部分还是了解理解了。知道有这么个东西。

testNG小试牛刀的更多相关文章

  1. Java自动化测试框架-01 - TestNG之入门篇 - 大佬的鸡肋,菜鸟的盛宴(详细教程)

    TestNG是什么? TestNG按照官方的定义: TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便. TestNG是一个开源自动化测试框 ...

  2. Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用(后续)

    在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]里面提到了Microsoft 身份认证,其实这也是一大块需要注意的地方,特作为后续补充这些知识点.上章是使用了Microsof ...

  3. TestNG 入门教程

    原文出处:http://www.cnblogs.com/TankXiao/p/3888070.html 阅读目录 TestNG介绍 在Eclipse中在线安装TestNG 在Eclipse中离线安装T ...

  4. JUnit 4 与 TestNG 对比

    原文出处: 付学良的网志 原文出处2: http://www.importnew.com/16270.html -------------------------------------------- ...

  5. JAVA+Maven+TestNG搭建接口测试框架及实例

    1.配置JDK 见另一篇博客:http://www.cnblogs.com/testlurunxiu/p/5933912.html 2.安装Eclipse以及TestNG Eclipse下载地址:ht ...

  6. Idea+TestNg配置test-output输出

    说明:testNG的工程我是使用eclipse创建的,直接导入到idea中,运行test时不会生产test-output,只能在idea的控制台中查看运行结果,然后到处报告,经过不懈的百度终于找到怎么 ...

  7. testng 失败自动截图

    testng执行case failed ,testng Listener会捕获执行失败,如果要实现失败自动截图,需要重写Listener的onTestFailure方法 那么首先新建一个Listene ...

  8. 两种方式testng dataprovider结合csv做测试驱动

    方式一: 第一.读取csv数据源码 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...

  9. java分享第十九天(TestNg的IReporter接口的使用)

     IReporter接口是干嘛的?就是让用户自定义报告的,很多人想要自定义报告,于是乎找各种插件,比如什么testng-xslt啊,reportng啊,各种配置,最后出来的结果,还不能定制化,但为什么 ...

随机推荐

  1. ASP.NET对HTML元素进行权限控制(一)

    一个HTML页面有很多的元素比如<DIV>,<P>等.这些元素构成了HTML页面.在Web开发中权限控制是每个系统都要用到了.界面每个元素的权限也是需要控制的.比如一个查询用户 ...

  2. scanf gets fgets区别与联系 puts fputs printf区别与联系

    组一:scanf( )函数 gets( )函数    fgets()函数都可用于输入字符串, 组二:printf( )函数 puts( )函数 fputs()函数则用于字符串的输出. 两组内部函数各有 ...

  3. Mysql 数据分组取某字段值所有最大的记录行

    需求: 表中同一个uid(用户)拥有多条游戏等级记录,现需要取所有用户最高等级(level)的那一条数据,且时间(time)越早排越前.这是典型的排名表 +------+-------+------- ...

  4. 敏捷开发之道(四)Scrum概述

    上次的博文敏捷开发之道(二)极限编程XP和敏捷开发之道(三)极限编程XP续中,我们介绍了一下敏捷开发中的XP开发方法,今天咱们来了解另一个比较流行的敏捷开发方法--Scrum. 1.Scrum简介 S ...

  5. 自定义的你的ubuntu鼠标右键

    首先看下效果图: 好,接下来讲下如何实现,“下一个桌面”和”在终端打开“,首先是安装必要软件 sudo apt-get -y install nautilus-open-terminal nautil ...

  6. Careercup - Facebook面试题 - 6204973461274624

    2014-05-02 02:28 题目链接 原题: I/P: N, k O/P: all subset of N with exactly K elements. eg: I/p: N = , K = ...

  7. IIS 分析器错误消息: 未能加载类型“_Default”

    还会出现不能加载程序集,如: using Model;using BLL;  均报错 但是在vs2012  iis express中调试正常, 按照网上方法: 我将vs  web项目下的目录全部cop ...

  8. div+css的前端工程师的价值体现在哪些方面?

    个人认为前端工程师正慢慢演变为产品工程师.wap app, 响应性UI等以html5技术为基础的开发将成为前端工程师的主要工作内容,解决产品跨平台跨设备的实现问题.Javascript, HTML, ...

  9. C/C++ 快速排序 quickSort

    下面的动画展示了快速排序算法的工作原理. 快速排序图示:可以图中在每次的比较选取的key元素为序列最后的元素. #include <stdio.h> #include <stdlib ...

  10. [C/CPP系列知识] 那些程序C语言可以编译通过但C++无法编译成功 Write a C program that won’t compile in C++

    http://www.geeksforgeeks.org/write-c-program-wont-compiler-c/ 1) C++中在函数声明之前调用一个函数会引发错误,但是在C中有可能可以. ...