单元测试框架之——TestNG

1、什么是TestNG
TestNG(Next Generation)单元测试框架比JUnit单元测试框架更强大,它提供了更多的扩展功能,可以通过注解、分组、序列和参数化组织和执行自动化测试脚本,因此它适合运行更复杂的自动化测试用例。
TestNG的优点:
(1)漂亮的HTML格式测试报告
(2)支持并发测试
(3)参数化测试更简单
(4)支持输出日志
(5)支持跟过功能的注解

2、编写TestNG测试用例的步骤
(1)使用eclipse生成TestNG的测试程序框架
(2)在生成的程序框架中编写测试代码逻辑
(3)根据测试代码逻辑,插入TestNG注解标签
(4)配置Testng.xml文件,设定测试类、测试方法、测试分组的执行信息
(5)执行TestNG的测试程序

3、安装TestNG
见另一篇博客“Eclipse安装TestNG插件”,https://blog.csdn.net/fengke1813/article/details/80264880

4、在TestNG中运行第一个WebDriver测试用例
单击选中的新建文件,按下Ctr+N组合键,选择“TestNG”文件下的“TestNG class”,点击“next”,在弹出的对话框中选择输入工程、包名和类名。注意选择工程时,具体到工程文件的下一层\src文件,因为系统默认是找到src下的class文件运行,可以到设置里面改路径。
生成测试框架代码以后,将selenium的jar包导入到工程中,在代码中填充Webdriver的测试逻辑代码:

package cn.gloryroad;

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() {
      //打开搜狗首页
      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/Mozilla Firefox");
      //打开Firefox浏览器
      driver = new FirefoxDriver();
  }

  @AfterMethod
  public void afterMethod() {
      //关闭浏览器
      driver.quit();
  }

}

以“TestNG Test”命令运行后的结果:
这里写图片描述

TestNG也会输出HTML格式的测试报告,访问工程目录下的“test-output”目录,打开“emailable-report.html”文件:
这里写图片描述
TestNG也会在“test-output”目录中生成index.html文件的报告,提供更加详细的测试用例执行信息:
这里写图片描述

4、TestNG的常用注解
(1)TestNG的常见测试用的组织结构:
Test Suit由一个或者多个Test组成;
Test由一个或者多个测试Class组成;
一个测试Class由一个或者多个测试方法组成;
(2)常用注解
@BeforeSuit:表示此注解的方法会在当前测试集合(Suit)中的任一测试用例开始运行之前执行;
@AfterSuit:表示此注解的方法会在当前测试集合(Suit)中的任一测试程序结束之后执行;
@BeforeTest:表示此注解的方法会在Test中任一测试用例开始运行之前执行;
@AfterTest:表示此注解会的方法在Test中任一测试用例运行结束之后执行;
@BeforeGroup:表示此注解的方法会在分组测试用例的任一测试用例开始运行前执行;
@AfterGroup:表示此注解的方法会在分组测试用例的所有测试用例运行结束后执行;
@BeforeClass:表示此注解的方法会在当前测试类的任一测试用例开始运行前执行;
@AfterClass:表示此注解的方法会在当前测试类的所有测试用例结束后执行;
@BeforeMethod:表示此注解的方法会在每个测试方法开始运行前执行;
@AfterMethod:表示此注解的方法会在每个测试方法结束后执行;
@Test:表示此注解的方法被认定为是一个测试方法,即一个测试用例。

5、测试集合
在自动化测试的执行过程中,通常会产生批量运行多个测试用例的需求,此需求被称为运行测试集合(Suit)。TestNG的测试用例可以是独立的,也可以按照特定的顺序来执行。
通过TestNG.xml的配置,可实现运行多个测试用例的不同组合。
操作步骤:
(1)右击工程名,选择“new”->“file”命令,在弹出的对话框的“file.name”输入框中输入“testng.xml”,点击“finish”创建TestNG的XML配置文件。
(2)双击testng.xml的文件,选择sourse标签栏进行编辑。

<suite name = "TestNGSuite">
     <test name = "test1">
         <classes>

              <class name = "cn.gloryroad.FirstTestNGDemo"/>
              <class name = "cn.gloryroad.TestBaidu"/>

         </classes>
     </test>
</suite>   

(3)执行testng.xml文件名,在测试结果中可验证两个测试类的测试方法均被执行。
这里写图片描述

6、测试用例的分组
使用group关键字进行分组,用来执行多个Test的测试用例。
操作步骤:
(1)新建一个名为Grouping的测试类,编写如下代码:

package cn.gloryroad;

import org.testng.annotations.Test;

public class Grouping {
  @Test(groups = {"人"})
  public void student() {
      System.out.println("学生方法被调用");
  }
  @Test(groups = {"人"})
  public void teacher(){
      System.out.println("老师方法被调用");
  }
  @Test(groups = {"动物"})
  public void cat(){
      System.out.println("小猫方法被调用");
  }
  @Test(groups = {"动物"})
  public void dog(){
      System.out.println("小狗方法被调用");
  }
  @Test(groups = {"人","动物"})
  public void feeder(){
      System.out.println("饲养员方法被调用");
  }
}

(3)testng.xml的内容配置如下:

<suite name = "TestNGSuite">
     <test name = "Grouping">
     <groups>
        <run>
           <include name = "动物"/>
        </run>
     </groups>

     <classes>
     <class name = "cn.gloryroad.Grouping"/>
     </classes>

     </test>

</suite>    

(4)运行testng.xml文件,结果如下:
这里写图片描述
(5)如果想同时执行两个分组中的所有测试用例,修改testng.xml文件为:

<suite name = "TestNGSuite">
     <test name = "Grouping">
     <groups>

        <define name = "All">
           <include name = "人"/>
           <include name = "动物"/>
        </define>

        <run>
           <include name = "All"/>
        </run>

     </groups>

     <classes>
     <class name = "cn.gloryroad.Grouping"/>
     </classes>

     </test>

</suite>    

7、依赖测试
对于具有依赖性的测试用例,需要保证某个测试用例执行完之后才执行其他测试用例,此测试场景运行需求称为依赖测试。通过测试,可在不同测试方法间共享数据和程序状态。使用dependsOnMethods参数来实现。

package cn.gloryroad;

import org.testng.annotations.Test;

public class DependentTest {
  @Test(dependsOnMethods = {"OpenBrowser"})
  public void SignIn() {
      System.out.println("SignIn方法被调用");
  }
  @Test
  public void OpenBrowser(){
      System.out.println("OpenBrowser方法被调用");
  }
  @Test(dependsOnMethods = {"SignIn"})
  public void LogOut(){
      System.out.println("LogOut方法被调用");
  }
}

运行结果:
这里写图片描述

8、特定顺序执行测试用例
对于非依赖性的测试用例也可以实现按指定顺序执行,使用priority来实现。
测试代码:

package cn.gloryroad;

import org.testng.annotations.Test;

public class SequenceTest {
  @Test(priority = 2)
  public void test3() {
      System.out.println("test3");
  }
  @Test(priority = 3)
  public void test4() {
      System.out.println("test3");
  }
  @Test(priority = 0)
  public void test1() {
      System.out.println("test3");
  }
  @Test(priority = 1)
  public void test2() {
      System.out.println("test3");
  }
}

测试结果:
这里写图片描述

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

package cn.gloryroad;

import org.testng.annotations.Test;

public class SequenceTest {
  @Test(priority = 2)
  public void test3() {
      System.out.println("test3");
  }
  @Test(priority = 3)
  public void test4() {
      System.out.println("test3");
  }
  @Test(priority = 0)
  public void test1() {
      System.out.println("test3");
  }
  @Test(priority = 1,enabled = false)
  public void test2() {
      System.out.println("test3");
  }
}

这里写图片描述

10、测试报告中的自定义日志
日志功能可通过自定义的方式记录测试脚本的运行信息。一般使用两种模式进行记录,及高层级和低层级。低层级模式日志会记录所有测试步骤信息,高层级模式日志只记录测试脚本中的主要时间信息。可根据需求选择日志信息的记录层级。

package cn.gloryroad;

import org.testng.Reporter;
import org.testng.annotations.Test;

public class TestngReporter {
  @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("调用注销的方法");
  }
}

可在index.html测试报告中查看运行的Report Log信息。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/fengke1813/article/details/80264802