Java语言编写的WebDriver测试程序通常使用单元测试框架运行。TestNG单元测试框架比JUnit单元测试框架更强大,它提供了更多的扩展功能。目前很大一部分自动化测试工程师已经开始转向使用TestNG单元测试框架来运行更复杂的自动化测试用例。

1.TestNG概述

TestNG是一种单元测试框架,由Cedric Beust创建,它借鉴了JUnit和NUnit框架的优秀设计思想,引入更易用和更强大的功能。TestNG是一种开源自动化测试框架,NG就是下一代的意思(Next Generation)。TestNG的使用和JUnit有些类似,但是它的设计实现比JUnit框架更好,提供了更灵活和更强大的功能。TestNG消除了一些老式框架的限制,让程序员通过注解、分组、序列和参数化等多种方式组织和执行自动化测试脚本。

TestNG具有以下优点:

(1)漂亮的HTML格式测试报告。

(2)支持并发测试。

(3)参数化测试更简单。

(4)支持输出日志。

(5)支持更多的功能的注解。

编写TestNG测试用例的步骤如下。

(1)使用Eclipse生成TestNG的测试程序框架。

(2)在生成的程序框架中编写测试代码逻辑。

(3)根据测试代码逻辑,插入TestNG注解标签。

(4)配置Testng.xml文件,设定测试类、测试方法、测试分组的执行信息。

(5)执行TestNG的测试程序。

2.安装TestNG

  • Eclipse中点击Help->Install new software
  • 点击Add,在name中输入testNg,在Location中输入http://beust.com/eclipse
  • 选中Testng版本,点击Next,按照提示安装,安装的过程中会有一次警告,直接点是即可,安装完之后重启Eclipse

3.在TestNG中运行第一个WebDriver测试用例

(1)在项目中的src文件夹下,新建一个Package,在其中新建类FirstTestNGDemo。

(2)编写WebDriver的测试逻辑代码,具体测试代码如下:

  1. package TestNG;
  2.  
  3. import org.openqa.selenium.By;
  4. import org.openqa.selenium.WebDriver;
  5. import org.openqa.selenium.firefox.FirefoxDriver;
  6. import org.testng.annotations.Test;
  7. import org.testng.annotations.BeforeMethod;
  8. import org.testng.annotations.AfterMethod;
  9.  
  10. public class FirstTestNGDemo {
  11. public WebDriver driver;
  12. String baseUrl="http://www.sogou.com/"; //设定访问网站的地址
  13.  
  14. @Test
  15. public void testSearch() {
  16. //打开sogou首页
  17. driver.get(baseUrl+"/");
  18. //在搜索框中输入“自动化测试”
  19. driver.findElement(By.id("query")).sendKeys("自动化测试");
  20. //单击“搜索”按钮
  21. driver.findElement(By.id("stb")).click();
  22. }
  23.  
  24. @BeforeMethod
  25. public void beforeMethod() {
  26. //若无法打开Firefox浏览器,可设定Firefox浏览器的安装路径
  27. //System.setProperty("webdriver.firefox.bin", "C:\\Program Files(x86)\\Mozilla Firefox\\firefox.exe");
  28. //打开Firefox浏览器
  29. driver=new FirefoxDriver();
  30. }
  31.  
  32. @AfterMethod
  33. public void afterMethod() {
  34. //关闭打开的浏览器
  35. driver.quit();
  36. }
  37. }

(3)在Eclipse代码编辑区域,单击鼠标右键,在弹出的快捷菜单中选择“Debug As”->“TestNG Test”,开始执行TestNG测试用例。

(4)测试用例执行后,在Console标签栏中显示测试用例的执行结果。

(5)查看Results of running class FirstTestNGDemo标签栏,可以看到测试用例的图形化运行结果。

(6)TestNG也会输出HTML格式的测试报告,访问工程目录下的“test-output”目录,打开目录中的“emailable-report.html”文件。

(7)打开“test-output”目录中的index.html文件,此报告提供更加详细的测试用例执行信息。

 4.TestNg常用注解

      TestNG的常见测试用例组织结构如下:

  • Test Suite由一个或者多个Test组成。
  • Test由一个或者多个测试Class组成。
  • 一个测试Class由一个或者多个测试方法组成。

  在testing.xml中的配置层级结构如下。

  1. <suite>
  2. <test>
  3. <classes>
  4. <method>
  5. </method>
  6. </classes>
  7. </test>
  8. </suite>

(1)@Test

   表示该方法是一个测试方法。需要引用import org.testng.annotations.Test包。

  代码示例如下。

(2)@BeforeMethod & @AfterMethod

  @BeforeMethod表示该方法在每个测试方法运行之前,会自动的被调用运行,做初始化等操作。

  @AfterMethod表示该方法在每一个测试方法运行之后会自动的被调用运行,做资源回收等操作。

代码示例如下。

(3)@BeforeClass / @AfterClass

  这两个注脚的方法,就是在每个类运行之前与之后会自动的被调用。

比如,在自动化脚本运行时,一个类里面的所有测试方法设计的是在同一个浏览器里面运行,那么就是说在这个类对象产生之前,就要把浏览器给启动起来,这时候@BeforeClass可以启动浏览器,@AfterClass就可以关闭浏览器。

(4)@BeforeSuite / @AfterSuite / @BeforeTest / @AfterTest

BeforeSuite:表示此注解的方法会在当前测试集合(Suite)中的任一测试用例开始运行之前执行。

AfterSuite:表示此注解的方法会在当前测试集合(Suite)中的所有测试程序运行结束之后执行。

BeforeTest:表示此注解的方法会在Test中任一测试用例开始运行前执行。

AfterTest:表示此注解的方法会在Test中所有测试用例运行结束后执行。

BeforeGroups:表示此注解的方法会在分组测试用例的任一测试用例开始运行前执行。

AfterGroups:表示此注解的方法会在分组测试用例的所有测试用例运行结束后执行。

  举例输入以下测试代码,理解上述注解的用法。

  1. public class BeforeAfter {
  2. @Test
  3. public void testCase1(){
  4. System.out.println("测试用例1被执行");
  5. }
  6.  
  7. @Test
  8. public void testCase2(){
  9. System.out.println("测试用例2被执行");
  10. }
  11.  
  12. @BeforeMethod
  13. public void beforeMethod(){
  14. System.out.println("在每个测试方法开始之前执行");
  15. }
  16.  
  17. @AfterMethod
  18. public void afterMethod(){
  19. System.out.println("在每个测试方法运行结束后执行");
  20. }
  21.  
  22. @BeforeClass
  23. public void beforeClass(){
  24. System.out.println("在当前测试类的第一个测试方法开始调用前执行");
  25. }
  26.  
  27. @AfterClass
  28. public void afterClass(){
  29. System.out.println("当前测试类的最后一个测试方法结束运行后执行");
  30. }
  31.  
  32. @BeforeTest
  33. public void beforeTest(){
  34. System.out.println("在测试类中的Test开始运行前执行");
  35. }
  36.  
  37. @AfterTest
  38. public void afterTest(){
  39. System.out.println("在测试类中的Test运行结束后执行");
  40. }
  41.  
  42. @BeforeSuite
  43. public void beforeSuite(){
  44. System.out.println("在当前测试集合(Suite)中的所有测试程序开始运行之前执行");
  45. }
  46.  
  47. @AfterSuite
  48. public void afterSuite(){
  49. System.out.println("在当前测试集合(Suite)中的所有测试程序运行结束之后执行");
  50. }
  51. }

  测试结果如下。

在当前测试集合(Suite)中的所有测试程序开始运行之前执行
在测试类中的Test开始运行前执行
在当前测试类的第一个测试方法开始调用前执行
在每个测试方法开始之前执行
测试用例1被执行
在每个测试方法运行结束后执行
在每个测试方法开始之前执行
测试用例2被执行
在每个测试方法运行结束后执行
当前测试类的最后一个测试方法结束运行后执行
在测试类中的Test运行结束后执行
PASSED: testCase1
PASSED: testCase2

  每个含有注解的类方法如果被调用,均会打印出其对应的注解含义,从执行的结果可以分辨出不同的注解方法会在何时被调用,从此实力可以更好地理解注解的执行含义。

5.断言类的使用

(1)测试中断言的作用

断言也就是检查点,重在判断我们通过页面得出来的值与期望值是否相等,如果相等,则代表断言成功,程序会继续往下执行,如果不相等,则代表断言失败,程序就会在断言失败处中止。

TestNG允许在测试执行过程中对测试程序变量的中间状态进行断言(Assert)判断,从而辅助判断测试用例的执行是成功还是失败。

(2)断言的API

  • Assert.assertEquals:判断是否相等,Object类型的对象需要实现hashCode及equals方法
  • Assert.assertNotEquals(actual1, actual2):判断是否不相等
  • Assert.assertFalse(condition):判断是否为false
  • Assert.assertTrue(condition):判断是否为true
  • Assert.assertNull(object, message):判断是否为null
  • Assert.assertNotNull(object):判断是否部位null
  • Assert.assertSame(actual, expected):判断引用地址是否相同
  • Assert.assertNotSame(actual, expected, message):判断引用地址是否不相同
  • Assert.assertEqualsNoOrder:判断忽略顺序是否相等

练习一下:测试百度搜索功能中的正常搜索,打开百度网页,输入关键字“疯狂动物城”,点击搜索,在结果中打开含有疯狂动物城的第一个页面。

6.TestNg的数据驱动

(1)什么是数据驱动

  数据驱动测试是自动化测试的主流设计模式之一。

  相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为进行了完全的分离,这样的测试脚本设计模式称为数据驱动。例如,测试网站的登录功能,自动化测试工程师想验证不同的用户名和密码在网站登录时的系统影响结果,就可以使用数据驱动模式来进行自动化测试。于是,testng为我们提供了这样一个注脚,让我们只需要提供出数据,就可以控制脚本运行的次数及相应的参数。

(2)TestNg数据驱动的实现

  用注解@DataProvider实现,代码如下。

  1. public class DataDrivernTest {
  2. @DataProvider
  3. public Object[][] loginData(){
  4. return new Object[][]{{"user1",""},{"user2",""}};
  5. }
  6.  
  7. @DataProvider(name="logoutData")
  8. public Object[][] logoutinfo(){
  9. return new Object[][]{{},{},{}};
  10. }
  11.  
  12. @Test(dataProvider="loginData")
  13. public void test1(String name, String password)
  14.  
  15. {
  16. System.out.println("Name:"+name+",Password:"+password);
  17. }
  18.  
  19. @Test(dataProvider="logoutData")
  20. public void test2(int info)
  21. {
  22. System.out.println(info);
  23. }
  24. }

  @DataProvider注脚的方法的返回值是Object对象的二维数组。

  @DataProvider可以指定名称如@DataProvider(name="testData"),这样在测试方法中使用@Test(dataProvider='testData')。如果没有跟name="testData",则测试方法中的dataProvider的值就应该为@DataProvider注脚的方法名。

(3)使用TestNG和CSV文件进行数据驱动

(4)使用TestNG、Apache POI和Excel文件进行数据驱动测试

(5)使用MySQL数据库实现数据驱动测试

7.TestNg用XML运行

  在自动化测试的执行过程中,通常会产生批量运行多个测试用例的需求,此需求称为运行测试集合(Test Suite)。TestNG的测试用例可以是相互独立的,也可以按照特定的顺序来执行。

  通过TestNG.xml的配置,可实现运行多个测试用例的不同组合。

(1)以class为基本点

  

(2)以method为基本点

(3)以package为基本点

  

8.TestNg如何用命令行运行

(1)在Eclipse中的自动build的选项给勾选上,这样就会自动的build

操作提示:在菜单Project中,单击Build Automatically。

(2)在workspace下面找到该工程的bin文件夹,并打开

(3)把bin文件夹下面的内容压缩成zip包(注:不包含bin文件夹),auto.zip

(4)把zip文件改成jar后缀,修改后缀名即可,auto.jar

操作提示:在文件夹窗口中,按下alt键,选择“工具”菜单->“文件夹选项”,点击“查看”选项卡,去掉“隐藏已知文件的扩展名”的勾选。

(5)把selenium-server-standalone-2.25.0.jar,auto.jar,TestBaidu.xml放在同一个文件夹下,如放在C:\automation

(6)编写一个bat文件:

@echo off
set LIB=C:\automation

set CLASSPATH=%LIB%\selenium-server-standalone-2.25.0.jar;%LIB%\auto.jar

java org.testng.TestNG %LIB%\TestBaidu.xml

pause

(7)双击运行bat文件即可。

9.测试报告中的自定义日志

  TestNG提供了日志功能,在测试过程中可通过自定义的方式记录测试脚本的运行信息,例如,记录测试程序的执行步骤信息及测试出错时的异常信息等。日志信息一般使用两种模式进行记录,即高层级和低层级。低层级模式日志会记录所有的测试步骤信息,高层级模式日志只记录测试脚本中的主要事件信息。读者可根据测试需求选择日志信息的记录层级。

  1. public class LogRecord {
  2.  
  3. @Test
  4. public void OpenBrowser(){
  5. System.out.println("OpenBrowser方法被调用!");
  6. Reporter.log("调用打开浏览器的方法");
  7. }
  8.  
  9. @Test
  10. public void SignIn(){
  11. System.out.println("SignIn方法被调用!");
  12. Reporter.log("调用登录方法");
  13. }
  14.  
  15. @Test
  16. public void LogOut(){
  17. System.out.println("LogOut方法被调用!");
  18. Reporter.log("调用注销方法");
  19. }
  20. }

在TestNG测试报告中,可查看测试运行中的Report Log信息,如下图所示。

10.特定顺序执行测试用例

  使用参数priority可实现按照特定顺序执行测试用例。

  1. public class SequenceTest {
  2. @Test(priority=)
  3. public void test3(){
  4. System.out.println("test3方法被调用");
  5. }
  6. @Test(priority=)
  7. public void test4(){
  8. System.out.println("test4方法被调用");
  9. }
  10. @Test(priority=)
  11. public void test1(){
  12. System.out.println("test1方法被调用");
  13. }
  14. @Test(priority=)
  15. public void test2(){
  16. System.out.println("test2方法被调用");
  17. }
  18. }

11.跳过某个测试方法

  使用参数enabled=false来跳过某测试方法。

  1. @Test(priority=,enabled=false)
  2. public void test2(){
  3. System.out.println("test2方法被调用");
  4. }

5.6 TestNg的使用的更多相关文章

  1. TestNG 入门教程

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

  2. JUnit 4 与 TestNG 对比

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

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

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

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

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

  5. testng 失败自动截图

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

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

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

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

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

  8. java分享第十八天-02( java结合testng,利用XML做数据源的数据驱动)

    testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本.在这以XML为例:备注:@DataProvider的返回值类 ...

  9. java分享第十四天(TestNG Assert详解)

     TestNG Assert 详解org.testng.Assert 用来校验接口测试的结果,那么它提供哪些方法呢? 中心为Assert测试类,一级节点为方法例如assertEquals,二级结点为参 ...

  10. TestNG Assert 详解

    org.testng.Assert 用来校验接口测试的结果,那么它提供哪些方法呢? 中心为Assert测试类,一级节点为方法例如assertEquals,二级结点为参数类型及参数个数,double 3 ...

随机推荐

  1. JS常用的腳本庫--包括在線編輯器

    原文链接 一.基本库 1.jQuery a.简介 JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, F ...

  2. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  3. CentOS 7一些常用配置

    一.更改启动模式 背景:个人开发环境,安装了GNOME桌面,默认启动是图形化模式. 修改为命令行模式. systemctl set-default multi-user.target 二.命令行模式下 ...

  4. Shifting List Item Values From One List To Another In Oracle Forms

    Suppose you have two T-List items in form and you want  to shift element values from one list to ano ...

  5. C# 创建一个日志文件

    private static string m_fileName = "C:\\ErrorMsg.txt"; public static void CreateErrorLog(s ...

  6. DB层面上的设计 分库分表 读写分离 集群化 负载均衡

    第1章  引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的 互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的 ...

  7. ubuntu使用mailx利用SMTP发送邮件

    转载:http://www.blogjava.net/jasmine214--love/archive/2010/10/09/334102.htmlLinux下mail利用外部邮箱发送邮件的方法: 1 ...

  8. ACDC

    acdc dcdc电源模块中大功率一般都是开关电源模式的,所以一般输入都是一个较宽的电源范围,体积也相对于变压器要小一些,效率高一些,但是纹波会偏大一些,如何选择就要看电路的需求来选择相应的方案

  9. C#操作Excel数据增删改查(转)

    C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...

  10. Java异常与运行时异常,以及与线程的关系

    具体可以看这篇文章:http://www.cnblogs.com/charlesblc/p/6171103.html 都写在里面了,为了避免更新不一致,这里就不再写一遍了.只给个链接. 注意Java和 ...