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

05-04
<think>好的,我现在需要帮助用户了解TestNG框架的相关信息和使用方法。首先,我要回顾用户的问题,确保我准确理解他们的需求。用户提到“TestNG framework usage and documentation”,所以主要需要介绍TestNG的基本概念、核心功能以及使用方法,可能还需要包括配置和示例代码。 接下来,我需要回忆TestNG的主要特点。TestNG是一个测试框架,灵感来自JUnit和NUnit,但引入了更多功能,比如分组测试、参数化测试、依赖测试等。这些功能使得测试更灵活和强大。我需要分点解释这些功能,并给出具体例子,比如如何使用@Test注解,如何分组,如何参数化测试用例。 然后,用户可能需要了解如何配置TestNG。常见的配置方式包括Maven依赖和Gradle依赖,所以需要提供这两种构建工具的依赖代码块。同时,可能需要解释配置文件testng.xml的作用,以及如何通过XML文件来组织测试套件。 示例代码部分很重要,用户可能需要看到实际的测试类结构。应该提供一个简单的测试类示例,展示基本的@Test注解使用,以及可能用到的断言方法。此外,参数化测试也是一个亮点,可以用@DataProvider来演示如何提供不同的测试数据。 另外,用户可能对测试报告和运行方式感兴趣。TestNG生成的HTML报告默认位置在哪里,如何通过IDE或命令行运行测试,这些信息也需要涵盖。 还要注意用户提供的引用内容,虽然引用1提到测试在同一个进程中运行以利用缓存,引用2关于日志框架,引用3是TestNG的输出示例。虽然这些引用可能和用户当前问题关联不大,但如果有相关内容需要结合,可以适当提及,比如在配置测试运行时如何避免分叉进程以提升性能,但可能用户更关注TestNG本身的使用,所以这部分可能不需要深入。 最后,生成相关问题时要围绕TestNG的功能扩展,比如与JUnit的区别、并行测试、监听器、集成CI工具等,确保问题能够引导用户进一步探索。 现在需要组织这些信息,确保结构清晰,分步骤介绍,并包含代码示例和配置示例。同时,使用正确的中文表达,避免技术术语错误,并检查LaTeX格式是否符合要求,虽然用户的问题中没有涉及数学公式,但如果有测试方法中的参数或数据,可能需要使用行内公式,但这里可能不太需要,所以主要关注代码块和常规格式。</think>### TestNG框架使用指南 TestNG是基于Java的测试框架,提供比JUnit更丰富的功能,支持参数化测试、依赖管理、分组测试等特性。以下是核心功能和使用方法: #### 一、基础配置 1. **Maven依赖**: ```xml <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.7.1</version> <scope>test</scope> </dependency> ``` 2. **Gradle依赖**: ```groovy testImplementation 'org.testng:testng:7.7.1' ``` #### 二、核心功能实现 1. **基础测试类**: ```java import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; public class BasicTest { @Test public void testStringLength() { String str = "TestNG"; assertEquals(str.length(), 6); } } ``` 2. **分组测试**: ```java @Test(groups = {"regression", "smoke"}) public void loginTest() { // 登录功能测试 } @Test(groups = "regression") public void paymentTest() { // 支付功能测试 } ``` 3. **参数化测试**: ```java @DataProvider(name = "userData") public Object[][] provideData() { return new Object[][]{ {"admin", "admin123"}, {"user", "user123"} }; } @Test(dataProvider = "userData") public void testLogin(String username, String password) { System.out.println("Testing with: " + username + "/" + password); } ``` #### 三、测试套件配置 通过XML文件定义测试执行顺序和范围: ```xml <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="RegressionSuite"> <test name="WebTests"> <classes> <class name="com.example.LoginTest"/> <class name="com.example.PaymentTest"/> </classes> </test> </suite> ``` #### 四、运行与报告 1. **IDE运行**:右键点击测试类或XML文件选择"Run as TestNG Test" 2. **命令行执行**: ```bash java -cp "path/to/testng.jar" org.testng.TestNG testng.xml ``` 3. **HTML报告**:默认生成在`test-output/index.html`,包含用例通过率、执行时间等详细信息 #### 五、高级特性 1. **依赖管理**: ```java @Test(dependsOnMethods = "initEnvironment") public void dataLoadTest() { // 需要先执行initEnvironment方法 } ``` 2. **超时控制**: ```java @Test(timeOut = 5000) // 单位:毫秒 public void apiResponseTest() { // 测试接口响应时间 } ``` [^1]: 测试执行时保持进程一致性可提升上下文缓存效率,这对TestNG的套件执行性能有直接影响
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值