基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(3)使用dataProvider实现数据驱动用例执行

在测试一个系统的时候,通常需要对同一个模块的用例输入各种不一样的数据,验证实际结果是否达到了我们期望值,此时如果不对测试数据单独出来维护,会使得测试用例与测试数据的耦合度很高,难以维护,当后期我们想要提供一批新的测试数据,那么我们就得在测试用例中把所有的测试数据全都手动修改一遍,操作很繁琐,下面举个实际例子。

 

我们现在想要测试百度输入框,想测试输入不同数据(手机号、人名、电影名、英文、特殊字符)等,在不使用数据驱动之前的做法是:在每条测试用例中手动输入测试数据,执行相应场景测试,代码如下:

//测试输入手机号
@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;
}

对比一下使用数据驱动前后的代码:显然使得测试用例类简洁了许多,后期维护数据也方便了许多。

代码执行效果:

基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(3)使用dataProvider实现数据驱动用例执行

 

上一篇:Java中使用synchronizedg关键字解决抢票超卖问题


下一篇:selenium自动化测试01