TestNG参数化之DataProvider

本文介绍了TestNG的参数化测试,重点讲解了@DataProvider注解的使用,包括简单应用、插入参数、延迟数据提供者以及多种数据来源。通过参数化测试,可以方便地管理和维护大量数据,避免内存溢出问题。

前言
测试参数化能让测试大量的数据集变为可能,也大大方便数据的修改和测试脚本的编写,测试参数化让数据和脚本分离开来,方便后续的维护。
这一篇先来说说数据提供者DataProvider

数据提供者@DataProvider
注解@DataProvider在参数化测试中起到重要的作用,该注解下的函数返回数据类型需要时Object[][],看例子如何实现:

1、简单使用

@DataProvider函数,需要定义属性name

    @DataProvider(name = "testcase")
    public Object[][] dataProvider(){
        return new Object[][]{
                {"小李"},
                {"小赵"},
                {"小明"},
                {"小周"}
        };
    }

@Test测试用例,属性dataProvider需要指定对应的数据提供者名称

    @Test(dataProvider = "testcase")
    public void testcase(String name){
        System.out.println(name);
    }

执行结果

create test :com.testproj.Demo.TestDataProvider@38bc8ab5
[TestNG] Running:
  E:\OPPO\JavaProject\TestNGProj\res\testNG.xml
小李
小赵
小明
小周

2、@DataProvider函数插入参数使用
@DataProvider函数可以插入Method和ITestContext类型参数,这两个参数里面可以获取很多有用的信息,看如何使用:

@DataProvider函数

    @DataProvider(name = "methodITestContext")
    public Object[][] dataProvider(Method method, ITestContext context){
        System.out.println("#############"+context.getName());
        System.out.println("*************"+method.getName());

        return new Object[][]{
                {"金"},
                {"木"},
                {"水"},
                {"火"},
                {"土"},
        };

    }

@Test测试执行脚本

    @Test(dataProvider = "methodITestContext")
    public void testcase5(String name){
        System.out.println(name);
    }

执行结果

create test :com.testproj.Demo.TestDataProvider@5bb21b69
[TestNG] Running:
  E:\OPPO\JavaProject\TestNGProj\res\testNG.xml
#############testDemo1
*************testcase5
金
木
水
火
土

3、延迟数据提供者
有时候我们需要大量参数进行读取的话,比如参数提供是从读取数据库获取的话,数据达到百万等级都会有,这样遍历所有信息时,就会导致内存溢出,有个简单方法可以解决这个问题:当我们获取了一个数据,对它执行测试方法,然后就废弃这个数据对象,再测试下一个对象。这个原则是延迟初始化,这个思想就是当你真正需要一个对象时才创建它,而不是提前创建它。
为了实现这种方法,TestNG允许我们从数据提供者返回一个Iterator对象,而不是一个二维对象数组。
Iterator是java.util包中的一个接口,它的方法签名如下:

public interface Iterator<E> {

    boolean hasNext();
    E next();
    default void remove();

 }

它可以通过next调用下一组数据,这样就有机会在最后一刻实例化相应的对象,即刚好在需要在这些参数的测试方法被调用之前。
下面例子是重写后的例子,我们实现了一个Iterator,它将返回4个带有不同ID的对象;

    class AccoutIterator implements Iterator {

        private int index =0;
       static private final int MAX  =4;
        @Override
        public boolean hasNext() {
            return index<MAX;
        }

        @Override
        public Object next() {
            return new Object[]{
                    //这里就是放入要实现的对象或者一组数据
                    "你好!"+(index++)
            };
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("remove");
        }
    }

@DataProvider函数调用

   @DataProvider(name = "iterator")
    public Iterator<Object[]> iteratorDataProvider(){
        return new AccoutIterator();

    }

@Test测试运行函数

    @Test(dataProvider = "iterator")
    public void testcase2(String name){
        System.out.println(name);
    }

运行结果

create test :com.testproj.Demo.TestDataProvider@38bc8ab5
[TestNG] Running:
  E:\OPPO\JavaProject\TestNGProj\res\testNG.xml
你好!0
你好!1
你好!2
你好!3

4、提供数据方式

我们可以从哪些方面获取数据呢
有以下方式,看各位的需求了

这里写图片描述

完成!


联系方式
QQ:1210009218
微信:happyLANG90


<think>好的,我现在需要帮助用户了解TestNG中的参数化使用指南。用户已经提到了他们之前的提问和回答,我需要参考之前的引用内容并结合用户的问题来生成详细的回答。 首先,用户提到了几个引用,其中引用[1]和引用[2]直接涉及TestNG参数化,特别是参数的作用范围和@DataProvider的使用。引用[3]到引用[5]可能相关,但需要看是否有必要包含在回答中。用户现在的问题是询问TestNG参数化的详细用法,所以我需要重点放在参数化的两种主要方法:通过testng.xml和@DataProvider。 用户之前的问题是关于Java输出对象类型,而现在的转向是TestNG参数化,可能需要我调整回答结构,确保清晰易懂。我需要确定用户可能需要的详细步骤,例如如何声明参数,如何使用@DataProvider,以及可能遇到的注意事项。 接下来,我需要考虑用户可能的实际应用场景,比如他们可能在编写自动化测试用例时,需要不同的参数组合来测试同一功能。因此,示例代码和具体步骤会很有帮助。同时,用户可能对参数优先级、数据驱动测试以及动态参数生成感兴趣,所以需要覆盖这些方面。 需要注意的是,用户提供的引用中有提到参数在suite和test标签中的优先级,以及@DataProvider返回二维数组的结构。这些点必须包含在回答中,以确保准确引用。此外,引用[5]提到的监听器可能和参数化关系不大,但如果涉及到测试方法的调用前后处理,可能需要简要提及,但根据用户问题,可能不需要深入。 最后,生成相关问题时要考虑用户可能进一步探索的方向,例如参数覆盖规则、与JUnit的区别、动态参数生成技巧以及常见错误处理。这些问题可以帮助用户更深入地理解TestNG参数化的各个方面。</think>在TestNG中实现参数化测试主要有两种方式,以下是详细使用指南: ### 一、XML参数化(静态参数) #### 1. 配置参数优先级 在`testng.xml`中参数作用域遵循: $$套件级 < 测试级 < 类级 < 方法级$$ 优先级顺序:方法级 > 类级 > 测试级 > 套件级[^1] ```xml <suite name="Suite"> <parameter name="env" value="prod"/> <!-- 套件级参数 --> <test name="Test"> <parameter name="env" value="dev"/> <!-- 测试级覆盖 --> <classes> <class name="TestCases"/> </classes> </test> </suite> ``` #### 2. 测试类接收参数 ```java public class TestCases { @Test @Parameters({"username", "password"}) public void loginTest(String user, String pwd) { System.out.println("用户:" + user + " 密码:" + pwd); } } ``` ### 二、@DataProvider动态参数化 #### 1. 基础数据驱动 ```java @DataProvider(name = "searchData") public Object[][] provideData() { return new Object[][] { {"Java", 10}, {"Python", 20}, {"TestNG", 30} }; } @Test(dataProvider = "searchData") public void searchTest(String keyword, int count) { // 执行搜索逻辑 } ``` #### 2. 类型自动转换特性 TestNG支持自动类型转换: ```java @DataProvider public Object[][] numberData() { return new Object[][] { {"100"}, {200} }; } @Test(dataProvider = "numberData") public void testNumbers(int num) { // 字符串"100"自动转为int Assert.assertTrue(num > 0); } ``` ### 三、混合参数化模式 #### 1. XML参数与DataProvider结合 ```java @Test(dataProvider = "dbData") @Parameters("timeout") public void dbOperation(int timeout, String query) { // timeout来自XML配置 // query来自DataProvider } ``` ### 四、高级技巧 1. **动态生成参数**:通过Excel/CSV读取测试数据 ```java @DataProvider public Object[][] excelData() throws IOException { List<Object[]> data = new ArrayList<>(); // 使用Apache POI读取Excel数据 return data.toArray(new Object[0][]); } ``` 2. **方法参数传递**:通过`Method`参数获取测试方法信息 ```java @DataProvider public Object[][] methodData(Method method) { if(method.getName().equals("testLogin")) { return new Object[][] { {"admin", "123456"} }; } return new Object[][] { {"guest", "guest"} }; } ``` ### 五、最佳实践 1. 使用`@Optional`设置默认值 ```java @Test @Parameters("retryCount") public void retryTest(@Optional("3") int retry) { // 当未配置参数时默认使用3次重试 } ``` 2. 数据驱动测试报告优化 ```java @Test(dataProvider = "data") public void test(ITestContext context, String param) { context.setAttribute("param", param); // 在报告中显示具体参数 } ``` [^1]: 参数优先级规则参考TestNG官方文档的参数作用域定义 [^2]: 数据驱动实现基于《Selenium与TestNG的自动化测试实战指南》第二章 --相关问题-- 1. 如何在TestNG中实现多线程参数化测试? 2. DataProvider能否返回Iterator类型的数据源? 3. TestNG参数化与JUnit参数化的核心区别是什么? 4. 如何处理参数化测试中出现的空值情况?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值