在测试一个系统的时候,通常需要对同一个模块的用例输入各种不一样的数据,验证实际结果是否达到了我们期望值,此时如果不对测试数据单独出来维护,会使得测试用例与测试数据的耦合度很高,难以维护,当后期我们想要提供一批新的测试数据,那么我们就得在测试用例中把所有的测试数据全都手动修改一遍,操作很繁琐,下面举个实际例子。
我们现在想要测试百度输入框,想测试输入不同数据(手机号、人名、电影名、英文、特殊字符)等,在不使用数据驱动之前的做法是:在每条测试用例中手动输入测试数据,执行相应场景测试,代码如下:
//测试输入手机号
@Test
public void test_baidu_01(){
BaiduPage baiduPage=new BaiduPage(driver);
baiduPage.inputData("13211112222");
BaiduFlow baiduFlow=new BaiduFlow(driver);
baiduFlow.selectTime("最近一月");
}
//测试输入人名
@Test
public void test_baidu_02(){
BaiduPage baiduPage=new BaiduPage(driver);
baiduPage.inputData("筱筱创");
BaiduFlow baiduFlow=new BaiduFlow(driver);
baiduFlow.selectTime("最近一月");
}
//测试输入电影名
@Test
public void test_baidu_03(){
BaiduPage baiduPage=new BaiduPage(driver);
baiduPage.inputData("误杀2");
BaiduFlow baiduFlow=new BaiduFlow(driver);
baiduFlow.selectTime("最近一月");
}
//测试输入英文
@Test
public void test_baidu_04(){
BaiduPage baiduPage=new BaiduPage(driver);
baiduPage.inputData("aaabbb");
BaiduFlow baiduFlow=new BaiduFlow(driver);
baiduFlow.selectTime("最近一月");
}
//测试输入特殊字符
@Test
public void test_baidu_05(){
BaiduPage baiduPage=new BaiduPage(driver);
baiduPage.inputData("#@!$%^");
BaiduFlow baiduFlow=new BaiduFlow(driver);
baiduFlow.selectTime("最近一月");
}
从上面的代码发现了什么问题:(1)我们当前只是想验证输入框输入各种不同的数据,其他的用例操作全都一样,但不得不写长篇大论的代码去完成输入框的各个输入框的场景测试
(2)代码的耦合度非常高,每个用例都重复出现相同的操作逻辑
(3)后期我们想要脚本跑一套新的数据,只能在每个测试方法下逐条修改测试数据,非常繁琐。
为了解决次现象问题,我们引入了testng提供的dataProvider方式,使用方法:(1)编写一个提供数据的方法,用@DataProvider注解标注这个方法,注意:该方法一般只支持返回一维数组或者二维数组数据,其他类型数据是返回不了的。
(2)在测试方法中,使用@Test(dataProvider="提供数据的方法名"),即可完成数据驱动,代码如下:
@Test(dataProvider = "getInputData")
public void test_baidu_06(String data){
BaiduPage baiduPage=new BaiduPage(driver);
baiduPage.inputData(data);
BaiduFlow baiduFlow=new BaiduFlow(driver);
baiduFlow.selectTime("最近一月");
}
@DataProvider
public Object[][] getInputData(){
Object[][] datas={
{"13211112222"},
{"筱筱创"},
{"误杀2"},
{"aaabbb"},
{"#@!$%^"},
};
return datas;
}
对比一下使用数据驱动前后的代码:显然使得测试用例类简洁了许多,后期维护数据也方便了许多。
代码执行效果: