TestNG

TestNG是什么

Test NG是一种单元测试的框架,他借鉴了Junit和Nunit框架的优秀思想,引入了更易用和更强大的功能。TestNG消除了一些老式框架的限制,让程序员通过注解、分组、序列、参数化等多种方式组织和执行自动化测试脚本。

testNG的有点

  • 支持html格式的测试报告
  • 支持并发测试
  • 参数测试更简单
  • 支持输出日志
  • 支持更多功能的注解

编写Test’NG测试用力的步骤

  • 使用eclipse或者idea生成TestNG测试框架
  • 再生产成的测试框架中编写测试代码逻辑
  • 根据测试代码的逻辑插入testNG 的注解标签
  • 配置Testng.xml文件,设定测试类,测试方法,测试分组的执行信息

TestNG的常用注解

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

  • Test Suite由一个或者多个Test组成
  • Test由一个或者多个class组成
  • 一个Class由一个或者多个测试方法组成
<suite>
    <test>  
        <classes>
            <method></method>
        </classes>
    </test> 
</suite>

运行不同的层级的测试用例的时,可通过不同的注解实现测试前的初始化工作,测试用例执行工作和测试后的清理工作。
常用的注解如下

-@ BeforeSuite:当前的测试集合中的任一测试用例开始运行之前执行
- @AfterSuite:当前的测试集合中所有的测试用例执行结束后执行
- @BeforeTest:Test中任一测试用例开始执行之前执行
- @AfterTest:Test所有的测试用例运行结束后执行
- @BeforeGroups:分组测试用例中的任一测试用例执行前执行
- @AfterGroups:分组测试用例全部运行结束后执行
- @BeforeClass:当前测试类的任一测试用例开始执行前执行
- @AfterClass:当前的测试类的测试用例全部运行结束后执行
- @BeforeMethod:每个测试方法开始运行前执行
- @AfterMethod:每个测试方法运行结束后执行
- @Test:一个测试方法,即一个测试用例

测试集合Suite

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

编写TestNG01测试类

import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterTest;
import org.testng.annotations.AfterClass;

public class TestNG01 {
    @BeforeClass
    public void beforeClass() {
        System.out.println("我是TestNG01--------该类执行前执行我");
    }
    @BeforeTest
    public void beforeTest() {
        System.out.println("我是TestNG01--------测试用例执行前执行我哦");
    }
    @Test
    public void test01(){
        System.out.println("我是TestNG01--------c测试用例01");
    }
    @Test
    public void test02(){
        System.out.println("我是TestNG01--------c测试用例02");
    }
    @AfterTest
    public void afterTest() {
        System.out.println("我是TestNG01--------测试用例执行完后执行我哦");
    }
    @AfterClass
    public void afterClass() {
        System.out.println("我是TestNG01--------该类的所有测试用例执行完后执行我哦");
    }
}

编写TestNG02测试类

import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterTest;
import org.testng.annotations.AfterClass;

public class TestNG02 {
    @BeforeClass
    public void beforeClass() {
        System.out.println("我是TestNG02--------该类执行前执行我");
    }
    @BeforeTest
    public void beforeTest() {
        System.out.println("我是TestNG02--------测试用例执行前执行我哦");
    }
    @Test
    public void test01(){
        System.out.println("我是TestNG02--------c测试用例01");
    }
    @Test
    public void test02(){
        System.out.println("我是TestNG02--------c测试用例02");
    }
    @AfterTest
    public void afterTest() {
        System.out.println("我是TestNG02--------测试用例执行完后执行我哦");
    }
    @AfterClass
    public void afterClass() {
        System.out.println("我是TestNG02--------该类的所有测试用例执行完后执行我哦");
    }
}

配置testng.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite"  parallel="tests" thread-count="1">
    <test name="Tests01">
        <classes>
            <class name="TestNG01" />
            <class name="TestNG02" />
        </classes>
    </test>
</suite>

执行的结果

我是TestNG01--------测试用例执行前执行我哦
我是TestNG02--------测试用例执行前执行我哦
我是TestNG01--------该类执行前执行我
我是TestNG01--------c测试用例01
我是TestNG01--------c测试用例02
我是TestNG01--------该类的所有测试用例执行完后执行我哦
我是TestNG02--------该类执行前执行我
我是TestNG02--------c测试用例01
我是TestNG02--------c测试用例02
我是TestNG02--------该类的所有测试用例执行完后执行我哦
我是TestNG01--------测试用例执行完后执行我哦
我是TestNG02--------测试用例执行完后执行我哦

===============================================
Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================


Process finished with exit code 0

测试用例分组

TestNG使用groups关键字进行分组,用来执行多个Test的测试用例

执行某一组的方法
创建TestNG03测试类


import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterTest;
import org.testng.annotations.AfterClass;

public class TestNG03 {

    @Test(groups = {"地球方法"})
    public void test01(){
        System.out.println("我是TestNG03-------地球方法01-");
    }
    @Test(groups = {"月球方法"})
    public void test02(){
        System.out.println("我是TestNG03--------c月球方法02");
    }
    @Test(groups = {"地球方法"})
    public void test03(){
        System.out.println("我是TestNG03--------地球方法03");
    }
    @Test(groups = {"月球方法"})
    public void test04(){
        System.out.println("我是TestNG03--------月球方法04");
    }
    @Test(groups = {"月球方法"})
    public void test05(){
        System.out.println("我是TestNG03--------月球方法05");
    }

}

配置testng.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="grouping">
        <groups>
            <run>
                <include name="月球方法"/>
            </run>
        </groups>
        <classes>
            <class name="TestNG03" />
        </classes>
    </test>
</suite>

测试结果

[TestNG] Running:
  D:\wylsoft\selenium_demo\first_maven_project\testng.xml
我是TestNG03--------c月球方法02
我是TestNG03--------月球方法04
我是TestNG03--------月球方法05

如果想执行2个分组中的所有的测试用例,修改testng.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="grouping">
        <groups>
            <define name="所有分组">
                <include name="月球方法"/>
                <include name="地球方法"/>
            </define>
            <run>
                <include name="所有分组"/>
            </run>
        </groups>
        <classes>
            <class name="TestNG03" />
        </classes>
    </test>
</suite>

依赖测试

某些复杂的场景需要按照某个特定的顺序执行测试用例,以保证某个测试用例执行之后才可以执行其他的测试用例,此测试场景被称为依赖测试。通过依赖测试可以在不同的测试方法间共享数据和程序状态。TestNG支持依赖测试,使用dependsOnMethods参数来实现。

import org.testng.annotations.Test;
public class TestDependOn {
    @Test (dependsOnMethods = {"test02"})
    public void test01(){
        System.out.println("TestDependOn-------测试用例01--我是老二");
    }
    @Test
    public void test02(){
        System.out.println("TestDependOn-------测试用例02--我是老大");
    }
    @Test(dependsOnMethods = {"test01"})
    public void test03(){
        System.out.println("TestDependOn-------测试用例03--我是老三");
    }
    @Test(dependsOnMethods = {"test03"})
    public void test04(){
        System.out.println("TestDependOn-------测试用例04--我是老幺");
    }
}

特定的顺序执行测试用例

使用priority可以实现按照特定的顺序执行测试用例

import org.testng.annotations.Test;
public class TestDependOn {
    @Test (priority = 2)
    public void test01(){
        System.out.println("TestDependOn-------测试用例01--我是老二");
    }
    @Test(priority = 1)
    public void test02(){
        System.out.println("TestDependOn-------测试用例02--我是老大");
    }
    @Test(priority = 4)
    public void test03(){
        System.out.println("TestDependOn-------测试用例03--我是老四");
    }
    @Test(priority = 3)
    public void test04(){
        System.out.println("TestDependOn-------测试用例04--我是老三");
    }
}

断言

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

  • assertTrue:判断是否为true
  • assertFalse:判断是否为false
  • assertSame:判断引用地址是否相同
  • assertNotSame:判断引用地址是否不相同
  • assertNull:判断是否为null
  • assertNotNull:判断是否不为null
  • assertEquals:判断是否相当,Object对象需要实现hashCode和equals方法
  • assertNotEquals:判断是否不相等
  • assertEqualsNoOrder:判断忽略顺序是否相等
import org.apache.commons.io.FileUtils;
import org.junit.Assert;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;



public class TestBaiDu {
    WebDriver driver;
    WebElement element;


    @BeforeTest
    public void beforeTest() {
        System.setProperty("webdriver.firefox.bin", "D:\\wylsoft\\Firefox\\firefox.exe");
        System.setProperty("webdriver.gecko.driver", "D:\\wylsoft\\selenium3.5\\geckodriver.exe");
        driver = new FirefoxDriver();
        driver.get("http://www.baidu.com");
        driver.manage().window().maximize();
    }

    @Test
    public void selectsh() throws InterruptedException {
        driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("满岛光");
        element=driver.findElement(By.xpath("//*[@id=\"su\"]"));
        Assert.assertTrue(element.isDisplayed());//判断百度一下是否存在
        element.click();
    }

    @AfterTest
    public void afterTest() {
       // driver.close();//关闭浏览器
        System.out.println("测试完成啦");
    }
}

跳过某个测试方法

使用enabled = false来跳过某个测试方法

import org.testng.annotations.Test;
public class TestDependOn {
    @Test (priority = 2)
    public void test01(){
        System.out.println("TestDependOn-------测试用例01--我是老二");
    }
    @Test(priority = 1,enabled = false)
    public void test02(){
        System.out.println("TestDependOn-------测试用例02--我是老大");
    }
    @Test(priority = 4)
    public void test03(){
        System.out.println("TestDependOn-------测试用例03--我是老四");
    }
    @Test(priority = 3)
    public void test04(){
        System.out.println("TestDependOn-------测试用例04--我是老三");
    }
}
TestDependOn-------测试用例01--我是老二
TestDependOn-------测试用例04--我是老三
TestDependOn-------测试用例03--我是老四

===============================================
Default Suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================

TestNG测试报告为什么显示 Skips: 0。报告里面的skip参数表示在进行依赖测试时如有前置的测试方法未被执行成功,则后续未执行的依赖测试方法个数会被标记未skip的显示数量

测试报告中的自定义日志

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值