Ethon

为什么要有方法,因为懒惰是一种美德。

   :: 首页  :: 新随笔  ::  ::  :: 管理

数据驱动测试是自动化测试的主流设计模式之一,相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为进行了完全的分离,这样的测试脚本设计模式称为数据驱动。
实施数据驱动测试的步骤:
1.编写测试脚本,脚本需要支持程序对象、文件或者数据库读入测试数据;
2.将测试脚本使用的数据测试数据存入程序对象、文件或者数据库等外部介质中;
3.运行脚本,循环调用存在外部介质的测试数据;
4.验证所有的测试结果是否符合期望的结果。

下面分别使用4种方式实现数据驱动测试
1.使用TestNG进行数据驱动测试
2.使用CSV文件进行数据驱动测试
3.使用Excel文件进行数据驱动测试
4.使用Mysql数据库实现数据的驱动测试

【一、使用TestNG进行数据驱动测试】

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

/**
 * @DataProvider注解的使用
 * 使用DataProvider提供数据有两种形式: 
 * 第一种:一种是在测试代码和测试数据放在同一个类中; 
 * 第二种:把所有的数据提供都单独写在一个类里面,当测试数据比较多时,这种方法利于维护。
 */
public class DataProviderTest {
    
    private static WebDriver driver;
    
    // @DataProvide 作为数据提供者,提供几组数组,则引用他的test方法就会执行几次
    // @DataProvide 注解定义当前方法中的返回值对象作为测试脚本的测试数据集,并将测试数据集命名为searchWords
    @DataProvider(name="searchWords")
    public static Object[][] words(){
        return new Object[][]{{"蝙蝠侠","主演","迈克尔"},{"超人","导演","唐纳"},{"生化危机","编剧","安德森"}};
    }
    
    //方法中的3个参数分别使用searchWords测试数据集中的每个一维数组中的数据进行赋值,此测试方法会被调用3次
    @Test(dataProvider="searchWords")
    public void test(String searchWords1, String searchWords2, String SearchResult){
        driver.get("http://www.baidu.com");
        driver.findElement(By.id("kw")).sendKeys(searchWords1 +" "+ searchWords2);
        driver.findElement(By.id("su")).click();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(searchWords1 +">>>>" +searchWords2+">>>>"+SearchResult);
        //判断搜索结果中是否包含测试数据中期望的关键词
        Assert.assertTrue(driver.getPageSource().contains(SearchResult));
        driver.quit();
    }
    
    @BeforeMethod
    public void beforeMethod(){
        System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
        driver = new ChromeDriver();
    }
}

 

【二、使用CSV文件进行数据驱动测试】

 

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

/**
 * 测试数据与测试脚本分离的方式
 */
public class DataProviderCSVTest {
    
    public static WebDriver driver;
    
    @BeforeMethod
    public void beforeMethod(){
        System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
        driver = new ChromeDriver();
    }
    
    
    @DataProvider(name="testData")
    public static Object[][] words() throws IOException{
        return getTestData("F://testData.csv");
    }
    
    
    @Test(dataProvider="testData")
    public void test(String searchWord1,String searchWord2,String searchResult){
        driver.get("http://www.baidu.com");
        driver.findElement(By.id("kw")).sendKeys(searchWord1+""+searchWord2);
        driver.findElement(By.id("su")).click();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Assert.assertTrue(driver.getPageSource().contains(searchResult));
        driver.quit();
    }
    
    //读取CSV文件的方法
    public static Object[][]getTestData(String fileName) throws IOException {
        //定义一个集合,存csv文件中的数据
        List<Object[]> records = new ArrayList<Object[]>();
        String record;
        BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8"));
        //file.readLine(); //跳过表头, 如果不需要表头的话,不要写这句
        while((record=file.readLine())!=null){
            String fields[] = record.split(",");
            records.add(fields);
            
        }
        file.close();
        
        //定义方法的返回值,将list转换为Object二维数据
        Object[][] results = new Object[records.size()][];
        //设置二维数每行的值,每行是一个Object对象
        for(int i=0;i<records.size();i++){
            results[i] = records.get(i);
        }
        
        return results;
    }
}

 

 

【三、使用Excel文件进行数据驱动测试】

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;


/**
 * 使用Excel文件进行数据驱动测试
 * 需引入POI jar包
 * @author Administrator
 *
 */
public class DataProviderExcelTest {
    
    public static WebDriver driver;
    String url = "http://www.baidu.com";
    
    @DataProvider(name="testData")
    public static Object[][] words() throws IOException{
        return getTestData("f://","testData.xlsx","Sheet1");
    }

    @BeforeMethod
    public void beforeMethod(){
        System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
        driver = new ChromeDriver();
    }
    
    @AfterMethod
    public void AfterMethod(){
        driver.quit();
    }
    
    @Test(dataProvider="testData")
    public void test(String searchWord1,String searchWord2,String searchResult){
        driver.get(url);
        driver.findElement(By.id("kw")).sendKeys(searchWord1+" "+searchWord2);
        driver.findElement(By.id("su")).click();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Assert.assertTrue(driver.getPageSource().contains(searchResult));
    }
    
    //从excel中获取测试数据的方法
    public static Object[][] getTestData(String filePath,String fileName,String sheetName) throws IOException{
        //声明一个file文件对象
        File file = new File(filePath+"\\"+fileName);
        //读取文件
        FileInputStream in = new FileInputStream(file);
        //声明Workbook对象
        Workbook workbook = null;
        //获取文件的扩展名
        String fileExtensionName = fileName.substring(fileName.indexOf("."));
        if(fileExtensionName.equals(".xlsx")){
            //.xlsx类型文件
            workbook = new XSSFWorkbook(in);
        }else {
            //.xls类型的文件
            workbook = new HSSFWorkbook(in);
        }
        //通过sheetName,生成Sheet对象
        Sheet sheet = workbook.getSheet(sheetName);
        //读取sheet1中数据的行数,最后一行减去第一行
        int rowCount = sheet.getLastRowNum() - sheet.getFirstRowNum();
        
        //将excel中的数据存在list中
        List<Object[]> records = new ArrayList<Object[]>();
        //遍历每行数据,去除第一行表头数据,excel的行号与列号都是从0开始
        for(int i=1;i<=rowCount;i++){
            //获取行对象
            Row row = sheet.getRow(i);
            //声明一个数组存放读取的行数据,数组大小用getlastCellNum确定
            String fields[] = new String[row.getLastCellNum()];
            //遍历每列数据
            for(int j=0;j<row.getLastCellNum();j++){
                //调用getCell与getStringCellValue方法获取excel中单元格中的数据
                fields[j] = row.getCell(j).getStringCellValue();    
            }
            records.add(fields);
        }
        
        // 定义方法的返回值,将list转换为Object二维数据
        Object[][] results = new Object[records.size()][];
        // 设置二维数每行的值,每行是一个Object对象
        for (int i = 0; i < records.size(); i++) {
            results[i] = (Object[]) records.get(i);
        }
        
        return results;
    }
}

 【四、使用Mysql数据库实现数据的驱动测试】

 

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;


/**
 * 使用Mysql数据库实现数据的驱动测试
 */

public class DataProviderMysqlTest {

    public WebDriver driver;
    String url = "http://www.baidu.com";
    
    @DataProvider(name="testData")
    public Object[][] words() throws IOException{
        return getTestData("search");
    }
    
    @BeforeMethod  
    public void beforeMethod(){
        System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
        driver = new ChromeDriver();
    }
    
    @AfterMethod
    public void afterMethod(){
        driver.quit();
    }
    
    @Test(dataProvider="testData")
    public void test(String searchWord1,String searchWord2,String searchResult){
        driver.get(url);
        driver.findElement(By.id("kw")).sendKeys(searchWord1+" "+searchWord2);
        driver.findElement(By.id("su")).click();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Assert.assertTrue(driver.getPageSource().contains(searchResult));
    }
    
    //获取Mysql数据库中的测试数据
    public static Object[][] getTestData(String tableName) throws IOException{
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/bbs";
        String username = "root";
        String password = "123";
        
        List<Object[]> records = new ArrayList<Object[]>();
        try {
            //加载数据库驱动
            Class.forName(driver);
            //获取数据库连接
            Connection connection = DriverManager.getConnection(url,username,password);
            //创建statement对象
            Statement statement = connection.createStatement();
            //准备sql语句
            String sql = "select argument1,argument2,result from " + tableName ;
            //用statement对象执行sql语句
            ResultSet rs = statement.executeQuery(sql);
            //获取ResultSetMetaData对象
            ResultSetMetaData reMetaData = rs.getMetaData();
            //调用getColumnCount()获取所有字段的数目(列数)
            int columnCount = reMetaData.getColumnCount();
            while(rs.next()){
                String fields[] = new String[columnCount];
                int column = 0;
                //遍历所有行数据的所有列数据,并存字符数组中
                for(int columnIndex = 0; columnIndex < columnCount; columnIndex ++){
                    fields[column] = rs.getString(columnIndex +1);
                    column ++;
                }
                records.add(fields);
                System.out.println(rs.getString(1)+"  "+rs.getString(2)+"   "+rs.getString(3));
                
            }
            rs.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 定义方法的返回值,将list转换为Object二维数据
        Object[][] results = new Object[records.size()][];
        // 设置二维数每行的值,每行是一个Object对象
        for (int i = 0; i < records.size(); i++) {
            results[i] = (Object[]) records.get(i);
        }
        return results;
    }
}

 

个人微信公众号:专注测试开发、自动化测试。

 

posted on 2019-05-02 10:28  Ethon  阅读(1685)  评论(0编辑  收藏  举报