【TestNg】(3) dataprovider参数化数据驱动

TestNG可以通过两种方式向测试方法传递参数

一、利用testng.xml定义parameter

在testng.xml文件中配置parameter标签,定义参数名和属性值。

在Java代码中给测试方法通过@parameters注解传递进来,方法形参进行接收。

局限性:

  • 通过parameters注入的参数必须定义在testng.xml中

  • 属性名会发生覆盖,传不了多次的参数,因为如果定义多个后面的会覆盖前面的

举例说明:

  • testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="小圆圈">
    <test name="模块/接口1">
        <classes>
            <class name= "com.xyq.testng.ParameterDemo">
                <parameter name = "type" value="edge" />
                <parameter name = "version" value="10" />
            </class>

            <class name= "com.xyq.testng.ParameterDemo2">
                <parameter name = "type" value="firefox" />
                <parameter name = "version" value="56" />
                <parameter name = "type" value="firefoxNew" />
                <parameter name = "version" value="56New" />
                <!-- 名字相同会发生覆盖,使用value="firefoxNew,value="56New -->
            </class>
        </classes>
    </test>
    <parameter name = "type" value="chrome" />
    <parameter name = "version" value="81" />
    <⚠️⚠️⚠️!-- 如果标签中没有属性 内容 直接用/结束 -->
    <!--parameter 如果写在类外面,那么所有的类都可以用它;
    如果写在类中,对应的类可用,且优先找自己类的parameter,如果自己有,就不用外面的chrome-->
</suite>
  • 测试方法
public class ParameterDemo2 {
    //Parameter和test平级
    @Test
    @Parameters({"type","version"})
    //Parameters此处的属性顺序和下面方法参数的顺序有关系,和xml文件中parameter的顺序无关
    //但是Parameters({"type","version"})中属性名字需要和xml中名字一致,和下面方法的参数名不要求一样,最好一样
    public void test(String type,String version){
        System.out.println("type = " + type + ", version = " + version);
    }

}

⚠️在该类中运行报错:"Parameter &apos;type&apos; is required by @Test on method test but has not been marked @Optional or defined"——需要在xml右键运行

二、利用DataProviders

@DataProvider注解标记数据提供方法,返回Object类型一维/二维数组。在测试方法@test注解中增加dataProvider属性引用数据提供源方法。

DataProvider 方法可以返回以下类型之一:

1、数据(对象)数组 ( Object[][] )的数组,其中第一维的大小是调用测试方法的次数第二维大小包含必须与测试的参数类型兼容的对象数组方法(参数的个数)。

多个参数,并且 要执行多次 —— 需要二维数组

适用:比较简单的参数和次数需要场景

@Test(dataProvider = "sijia")//指定数据驱动方法名
public void login(String username,String password){...

@DataProvider(name = "sijia")
public Object[][] datas(){
    Object[][] datas = {
            {"zs","123456"},
            {"ls","123"},
            {"wu","456"}
    };
    return datas;
}

2、类的对象数组的 ( Object[] )一维数组,纬度是对象的个数

多个参数,并且 要执行多次 —— 如果一定要需要一维数组的话,需要摒弃一个维度,次数不能摒弃,需要摒弃【多个参数】这样的纬度,——那把多个参数,用对象封装,对象把很多属性/方法封装在一起了——参数越来越多的时候,只需要给对象中塞属性就好了

DTO 数据传输对象,当需要传输数据的时候,就把它放到对象里面

适用:用的比较频繁的场景,参数比较多

@Test(dataProvider = "data_ha")      //下面没给属性name值,@Test(dataProvider = "data_ha")
public void login(User user){...     //指定数据驱动方法名——用下面的方法名
  
@DataProvider     
public Object[] data_ha(){
    User u1 = new User("zs1","123456");
    User u2 = new User("zs2","123456");
  
    Object[] datas = {u1,u2};
    return datas;
}

⚠️两种方式dataProvider和parameters不能一起用,因为都会去占用参数的位置

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨撕酒家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值