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的测试逻辑代码,具体测试代码如下:

package TestNG;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod; public class FirstTestNGDemo {
public WebDriver driver;
String baseUrl="http://www.sogou.com/"; //设定访问网站的地址 @Test
public void testSearch() {
//打开sogou首页
driver.get(baseUrl+"/");
//在搜索框中输入“自动化测试”
driver.findElement(By.id("query")).sendKeys("自动化测试");
//单击“搜索”按钮
driver.findElement(By.id("stb")).click();
} @BeforeMethod
public void beforeMethod() {
//若无法打开Firefox浏览器,可设定Firefox浏览器的安装路径
//System.setProperty("webdriver.firefox.bin", "C:\\Program Files(x86)\\Mozilla Firefox\\firefox.exe");
//打开Firefox浏览器
driver=new FirefoxDriver();
} @AfterMethod
public void afterMethod() {
//关闭打开的浏览器
driver.quit();
}
}

(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中的配置层级结构如下。

<suite>
<test>
<classes>
<method>
</method>
</classes>
</test>
</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:表示此注解的方法会在分组测试用例的所有测试用例运行结束后执行。

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

public class BeforeAfter {
@Test
public void testCase1(){
System.out.println("测试用例1被执行");
} @Test
public void testCase2(){
System.out.println("测试用例2被执行");
} @BeforeMethod
public void beforeMethod(){
System.out.println("在每个测试方法开始之前执行");
} @AfterMethod
public void afterMethod(){
System.out.println("在每个测试方法运行结束后执行");
} @BeforeClass
public void beforeClass(){
System.out.println("在当前测试类的第一个测试方法开始调用前执行");
} @AfterClass
public void afterClass(){
System.out.println("当前测试类的最后一个测试方法结束运行后执行");
} @BeforeTest
public void beforeTest(){
System.out.println("在测试类中的Test开始运行前执行");
} @AfterTest
public void afterTest(){
System.out.println("在测试类中的Test运行结束后执行");
} @BeforeSuite
public void beforeSuite(){
System.out.println("在当前测试集合(Suite)中的所有测试程序开始运行之前执行");
} @AfterSuite
public void afterSuite(){
System.out.println("在当前测试集合(Suite)中的所有测试程序运行结束之后执行");
}
}

  测试结果如下。

在当前测试集合(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实现,代码如下。

public class DataDrivernTest {
@DataProvider
public Object[][] loginData(){
return new Object[][]{{"user1",""},{"user2",""}};
} @DataProvider(name="logoutData")
public Object[][] logoutinfo(){
return new Object[][]{{},{},{}};
} @Test(dataProvider="loginData")
public void test1(String name, String password) {
System.out.println("Name:"+name+",Password:"+password);
} @Test(dataProvider="logoutData")
public void test2(int info)
{
System.out.println(info);
}
}

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

public class LogRecord {

    @Test
public void OpenBrowser(){
System.out.println("OpenBrowser方法被调用!");
Reporter.log("调用打开浏览器的方法");
} @Test
public void SignIn(){
System.out.println("SignIn方法被调用!");
Reporter.log("调用登录方法");
} @Test
public void LogOut(){
System.out.println("LogOut方法被调用!");
Reporter.log("调用注销方法");
}
}

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

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

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

public class SequenceTest {
@Test(priority=)
public void test3(){
System.out.println("test3方法被调用");
}
@Test(priority=)
public void test4(){
System.out.println("test4方法被调用");
}
@Test(priority=)
public void test1(){
System.out.println("test1方法被调用");
}
@Test(priority=)
public void test2(){
System.out.println("test2方法被调用");
}
}

11.跳过某个测试方法

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

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

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. [转]Unity 延迟执行一段代码的较为优雅的方式

    Unity中,延时执行一段代码或者一个方法或者几个方法的情况非常普遍. 一般会用到Invoke和InvokeRepeating方法.顾名思义,第一个是执行一次,第二个是重复执行. 看下定义: void ...

  2. 如何优雅的处理Nodejs中的异步回调

    前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O ...

  3. [CF724B]Batch Sort(暴力,思维)

    题目链接:http://codeforces.com/contest/724/problem/B 题意:给出n*m的数字阵,每行数都是1-m的全排列,最多可以交换2个数一次,整个矩阵可以交换两列一次. ...

  4. 通过数据库和EasyUI的combobox级联实现省市区三级联动

    1.新建一个web项目 2.因为这里用到了数据库所以我们在lib目录导入Hibernate的jar包.fastjson.jar包及数据库jar包 3.同样导入EasyUI的组件配置,并在新建的html ...

  5. mysql以ROOT权限提权方法

    今天feng问了一个问题,mysql root权限运行,直接root服务器吧,SSH登录 正好上网查一下相关的资料: mysql .x里面引入了一个system函数,这个函数可以执行系统命令,当mys ...

  6. Messages消息处理

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. 8.mybatis动态SQL模糊查询 (多参数查询,使用parameterType)

    多参数查询,使用parameterType.实例: 用户User[id, name, age] 1.mysql建表并插入数据 2.Java实体类 public class User { public ...

  8. hdu 5950 Recursive sequence 矩阵快速幂

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  9. weblogic启动报错

    重启了一次linux服务器后,weblogic启动莫名报错,查看日志发现说部署的项目有个bean类无法加载, 1.然后手动删除 已经部署的项目,先在 domais/servers/AdminServe ...

  10. VB6.0

    1. 安装包来自 http://msdn.itellyou.cn/ 下载的文件为: sc_vb6_ent_cd1.iso sc_vb6_ent_cd2.iso 2.安装时,"请输入产品的 I ...