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

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

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

//测试输入手机号
@Test
public void test_baidu_01(){
    BaiduPage baiduPage=new BaiduPage(driver);
    baiduPage.inputData("13212222");
    BaiduFlow baiduFlow=new BaiduFlow(driver);
    baiduFlow.selectTime("最近一月");
}
//测试输入人名
@Test
public void test_baidu_02(){
    BaiduPage baiduPage=new BaiduPage(driver);
    baiduPage.inputData("rebort");
    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={
            {"13212222"},
            {"rebort"},
            {"误杀2"},
            {"aaabbb"},
            {"#@!$%^"},
    };
    return datas;
}

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

参考代码

package com.howentech.testcases;

import com.howentech.businesslogic.BaiduFlow;
import com.howentech.common.BaseTest;
import com.howentech.config.GlobalDatas;
import com.howentech.page.BaiduPage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

/**
 * @param
 * @author rebort
 * @create 2025/07/08
 * @return
 * @description
 **/
public class TestBaidu3 extends BaseTest {
    @BeforeMethod
    public void setup(){
        //用例前置
        //1、打开浏览器
        openBrowser(GlobalDatas.BROWSER_NAME);
        maxBrowser();
        //2、进入百度页面
        toURL(GlobalDatas.INDEX_URL);
    }

    @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("最近一月");
        myAssertEquals(1,2,"一定会失败的断言");
    }

    @Test
    public void test_03(){
        BaiduPage baiduPage=new BaiduPage(driver);
        System.out.println("当前driver所有的handles:"+driver.getWindowHandles());
        System.out.println("当前driver所在的handle:"+driver.getWindowHandle());
        baiduPage.clickNews();
       /* System.out.println("点击新闻链接后driver所有的handles:"+driver.getWindowHandles());
        System.out.println("点击新闻链接后driver所在的handle:"+driver.getWindowHandle());
        switchWindowWithTitle("百度新闻——海量中文资讯平台");
        System.out.println("切换窗口后driver所在的handle:"+driver.getWindowHandle());*/
        driver.findElement(By.xpath("//input[@id='ww']")).sendKeys("aaaa");
    }

    @Test
    public void test_04(){
        driver.get("https://www.mi.com/");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("当前driver所有的handles:"+driver.getWindowHandles());
        System.out.println("当前driver所在的handle:"+driver.getWindowHandle());
        driver.findElement(By.xpath("//a[text()='MIUI']")).click();
        System.out.println("点击新闻链接后driver所有的handles:"+driver.getWindowHandles());
        System.out.println("点击新闻链接后driver所在的handle:"+driver.getWindowHandle());
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        switchWindowWithTitle("MIUI 13 开始·连接万物");
        driver.findElement(By.xpath("//a[text()='Phone']")).click();
    }

    @Test
    public void test_05() throws InterruptedException {
        driver.get("https://ke.qq.com");
        Thread.sleep(2000);
        driver.findElement(By.id("js_login")).click();
        Thread.sleep(2000);
        WebElement iframeElement=driver.findElement(By.xpath("//div[@class='login-qq-iframe-wrap']/iframe"));
        driver.switchTo().frame(iframeElement);
        Thread.sleep(1000);
        driver.findElement(By.id("switcher_plogin")).click();
    }


    @DataProvider
    public Object[][] getInputData(){
        Object[][] datas={
                {"1321111"},
                {"rebort"},
                {"误杀2"},
                {"aaabbb"},
                {"#@!$%^"},
        };
        return datas;
    }


    @AfterMethod
    public void teardown(){
        //用例后置
        //退出浏览器
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        quitBrowser();
    }
}

代码执行效果:

你可能感兴趣的:(UI自动化相关,java,maven,selenium)