0


开源测试框架——数据驱动测试

开源测试框架——数据驱动测试

什么是数据驱动测试

相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为进行了完全的分离。这样的测试脚本设计模式称为数据驱动

使用数据驱动测试的步骤

  • 编写测试脚本,脚本需要支持程序对象、文件或数据库读入测试数据
  • 将测试脚本使用的测试数据存入程序对象、文件或者数据库等外部介质中
  • 运行脚本,循环调用存储在外部介质的测试数据。
  • 验证所有的测试结果是否符合期望结果

实现数据驱动的四种方式

  1. 数组
  2. txt/csv(IO读取数据,转换为Object[][])
  3. excel(apache poi读取Excel数据, 转换为Object[][])
  4. 数据库(JDBC 读取数据库数据,转换为Object[][]) )

使用TestNG进行数据驱动

测试流程

  • 打开百度首页
  • 输入关键词“淘宝”
  • 单击搜索按钮
  • 验证搜索结果也是否包含“淘宝”,如果存在执行成功,不存在,则执行失败。

首先,写出txt excel等的实现方法:

txt:

packageworkSpace;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.List;importorg.apache.poi.hssf.dev.EFBiffViewer;importorg.testng.annotations.DataProvider;importorg.testng.annotations.Test;/**
 * 
 * @author Administrator
 *鎶妕xt鏁版嵁璇诲彇鍑烘潵锛岃浆鎹负浜岀淮鏁扮粍
 */publicclassTxtDataProvider{publicObject[][]getDataByTxt(String fileName)throwsException{File file =newFile(fileName);Object[][] data=null;FileInputStream inputStream=newFileInputStream(file);InputStreamReader isReader=newInputStreamReader(inputStream);BufferedReader bReader=newBufferedReader(isReader);Stringrecord= bReader.readLine();System.out.println(record);//璇诲彇涓�琛岋紝鍒嗛殧涓哄瓧绗︽暟缁勶紝鎶婂瓧绗︽暟缁勪繚瀛樺湪ListList<String[]> dataList=newArrayList<String[]>();//浠庣浜岃璇诲彇while((record=bReader.readLine())!=null){String[] fields=record.split(",");
            dataList.add(fields);}
        bReader.close();
        isReader.close();
        inputStream.close();//        鎶奓ist鏁版嵁杞崲涓篛bject[][]
        data=newObject[dataList.size()][];for(int i=0;i<dataList.size();i++){
            data[i]=dataList.get(i);}return data;}}

excel:

packageworkSpace;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importorg.apache.poi.hssf.record.LabelSSTRecord;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;importorg.apache.poi.ss.usermodel.Row;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.usermodel.Workbook;//import org.apache.poi.xssf.usermodel.XSSFWorkbook;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;importorg.testng.annotations.DataProvider;importorg.testng.annotations.Test;publicclassExcelDataProvider{publicObject[][]getExcelData(String fileName,String sheetName)throwsException{FileInputStream inputStream =newFileInputStream(newFile(fileName));String type = fileName.substring(fileName.indexOf("."));System.out.println(type);Workbook wbook =null;if(type.equals(".xlsx")){
            wbook =newXSSFWorkbook(inputStream);}elseif(type.equals(".xls")){
            wbook =newHSSFWorkbook(inputStream);}else{System.out.println("鏂囦欢绫诲瀷閿欒");returnnull;}Sheet sheet = wbook.getSheet(sheetName);int rowcount = sheet.getLastRowNum();//        System.out.println(rowcount);List<String[]> dataList =newArrayList<String[]>();// 閫愯璇诲彇锛岃浆鎹负涓�缁存暟缁�for(int i =1; i <= rowcount; i++){Row row = sheet.getRow(i);String[] fields =newString[row.getLastCellNum()];// 鎶婃瘡涓�琛屽崟鍏冩牸鐨勬暟鎹紝瀛樺偍鍒版暟缁勪腑//            System.out.println(row.getLastCellNum());for(int j =0; j < row.getLastCellNum(); j++){// 鑾峰彇鍗曞厓鏍肩殑鏁版嵁String temp = row.getCell(j).getStringCellValue();
                fields[j]= temp;//                System.out.println(temp);}

            dataList.add(fields);}// 鎶妉ist鏁版嵁杞崲涓轰簩缁存暟缁�Object[][] data =newObject[dataList.size()][];for(int i =0; i < dataList.size(); i++){
            data[i]= dataList.get(i);}return data;}}
packageworkSpace;importjava.time.Duration;importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.firefox.FirefoxDriver;importorg.testng.annotations.AfterClass;importorg.testng.annotations.BeforeClass;publicclassBaseTest{publicstaticWebDriver driver;@BeforeClasspublicvoidinitBrowser()throwsInterruptedException{System.setProperty("webdriver.gecko.driver","F:\\kaiyuanceshi\\geckodriver30.exe");System.setProperty("webdriver.firefox.bin","C:\\Program Files\\Mozilla Firefox\\firefox.exe");
        
        driver=newFirefoxDriver();//        Thread.sleep(3000);
        driver.manage().window().maximize();//        隐式等待三秒钟
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));}@AfterClasspublicvoidquitBrowser()throwsInterruptedException{Thread.sleep(3000);
        driver.quit();}}
packageworkSpace;importstaticorg.testng.Assert.assertTrue;importorg.openqa.selenium.By;importorg.testng.annotations.DataProvider;importorg.testng.annotations.Test;publicclassTaoBaoTestextendsBaseTest{@DataProvider(name="data1")publicObject[][]dataTaoBao(){returnnewObject[][]{{"奥运会","巴西"},{"selenium","测试"},{"淘宝","购物"}};}@Test(dataProvider="data1")publicvoidtestDataDriver(String search,String expect)throwsInterruptedException{
        driver.get("https://www.baidu.com/");
        driver.findElement(By.id("kw")).sendKeys(search);
        driver.findElement(By.id("su")).click();Thread.sleep(1500);assertTrue(driver.getPageSource().contains(expect));}}

在这里插入图片描述

  • 测试脚本会三次打开浏览器,分别输入三组词语进行搜索。
  • 使用@DataProvider(name =“searchWords”)定义当前方法中的返回对象作为测试脚本的测试数据集,命名为“searchWords”
  • @Test(dataProvider=“data1”)表示当前方法中的参数,使用data1提供的数据集作为输入参数。 search作为输入的关键词, expect用来判断预期结果与实际结果是否一致

使用TestNG和txt文件进行数据驱动(I/O)

测试流程

  • 打开百度首页
  • 从txt文件中读取每行的第一个单词作为输入关键词
  • 单击搜索按钮
  • 验证搜索结果是否包含txt文件每行第二个单词,如果存在执行成功;不存在,则执行失败。

首先创建一个data文件夹在里面创建一个Baidu.txt文件,内容写如下

search,expect
奥运会,巴西
selenium,测试
淘宝,购物
packageworkSpace;importstaticorg.testng.Assert.assertTrue;importorg.openqa.selenium.By;importorg.testng.annotations.DataProvider;importorg.testng.annotations.Test;importcom.lhz.www.TxtDataProvider;publicclassTaoBaoTestextendsBaseTest{//    @DataProvider(name="data1")//    public Object[][] dataTaoBao(){//        return new Object[][] {//            {"奥运会","巴西"},//            {"selenium","测试"},//            {"淘宝","购物"}//        };//    }@DataProvider(name ="txt")publicObject[][]getDataByTxt()throwsException{returnnewTxtDataProvider().getDataByTxt("data/Baidu.txt");}@Test(dataProvider="txt")publicvoidtestDataDriver(String search,String expect)throwsInterruptedException{
        driver.get("https://www.baidu.com/");
        driver.findElement(By.id("kw")).sendKeys(search);
        driver.findElement(By.id("su")).click();Thread.sleep(3000);assertTrue(driver.getPageSource().contains(expect));}}

使用TestNG、Apache POI 和Excel文件进行数据驱动

首先创建一个data文件夹在里面创建一个Baidu.xlsx文件,内容写如下
在这里插入图片描述

packageworkSpace;importstaticorg.testng.Assert.assertTrue;importorg.openqa.selenium.By;importorg.testng.annotations.DataProvider;importorg.testng.annotations.Test;importcom.lhz.www.ExcelDataProvider;importcom.lhz.www.TxtDataProvider;publicclassTaoBaoTestextendsBaseTest{//    @DataProvider(name="data1")//    public Object[][] dataTaoBao(){//        return new Object[][] {//            {"奥运会","巴西"},//            {"selenium","测试"},//            {"淘宝","购物"}//        };//    }//    @DataProvider(name = "txt")//    public Object[][] getDataByTxt() throws Exception {//        return  new TxtDataProvider().getDataByTxt("data/Baidu.txt");//    }@DataProvider(name ="excel")publicObject[][]getDataByExcel()throwsException{returnnewExcelDataProvider().getExcelData("data/Baidu.xlsx","Sheet1");}@Test(dataProvider="excel")publicvoidtestDataDriver(String search,String expect)throwsInterruptedException{
        driver.get("https://www.baidu.com/");
        driver.findElement(By.id("kw")).sendKeys(search);
        driver.findElement(By.id("su")).click();Thread.sleep(3000);assertTrue(driver.getPageSource().contains(expect));}}

总结

这几个例子较为简单,也较为经典。
这三种数据驱动方式的代码变化不算太大,正所谓一通百通。


本文转载自: https://blog.csdn.net/huayu8086/article/details/124294976
版权归原作者 huayu8086 所有, 如有侵权,请联系我们删除。

“开源测试框架——数据驱动测试”的评论:

还没有评论