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 'type' 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不能一起用,因为都会去占用参数的位置