selenium+java 數據驅動


一、數據驅動測試概念

        數據驅動測試是相同的測試腳本使用不同的測試數據執行,測試數據和測試行為完全分離。

二、實施數據驅動測試的步驟:

1、編寫測試腳本,腳本需要支持程序對象、文件或者數據庫讀入測試數據。

2、將測試腳本使用的測試數據存入程序對象、文件或者數據庫等外部介質中。

3、運行腳本,循環調用存儲在外部介質的測試數據。

4、驗證所有的測試結果是否符合期望的結果。

文章轉自:https://www.cnblogs.com/davieyang/p/10071209.html

以四個方式展示自動化測試的數據驅動,CSV、Excel、Mysql、數組

1.CSV

testData.csv

代碼:

public class TestCSV {

    public WebDriver driver;
    String baseUrl = "https://www.sogou.com";
    //使用注解DataProcider將數據集合命名為"csvTestData"
    @DataProvider(name="csvTestData")
    public static Object[][]Words() throws IOException{
        //調用類中的今天方法getTestData
        return getTestData("D:\\test\\testData.csv");
    }
    
    @BeforeMethod
    public void beforeMethod() {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\lenovo\\AppData\\Local\\Google\\Chrome\\chromedriver.exe");
        driver = new ChromeDriver();
    }
    
    @Test(dataProvider = "csvTestData")
    public void testSearch(String searchWord1, String searchWord2, String searchResult) throws InterruptedException{
        driver.get(baseUrl+"/");
        driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);
        driver.findElement(By.id("stb")).click();
        //Assert.assertTrue(driver.getPageSource().contains(searchResult));
        Thread.sleep(5000);
    }
    @AfterMethod
    public void afterMethod(){
        driver.quit();
    }
    
    //讀取csv文件的靜態方法,使用csv文件的絕對文件路徑作為函數參數
    public static Object[][] getTestData(String filename) throws IOException{
        List<Object[]> records = new ArrayList<Object[]>();
        String record;
        //設定UTF-8字符集,使用帶緩沖區的字符輸入流BufferedReader讀取文件內容
        BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(filename), "gbk"));
        //忽略讀取csv文件的標題行
        file.readLine();
        /*
         * 遍歷讀取文件中出去第一行外的其他所有內容
         * 並存儲在records的ArrayList中
         * 每一個records中存儲的對象為一個String數組
         */
        while((record=file.readLine())!=null) {
            String fields[] = record.split(",");
            records.add(fields);
        }
        //關閉文件對象
        file.close();
        //定義函數反值,即Object[][]
        //將存儲測試數據的list轉換為一個Object的二維數組
        Object[][] results = new Object[records.size()][];
        //設置二維數組每行的值,每行是一個Object對象
        for (int i = 0; i<records.size(); i++){
            results[i] = records.get(i);
        }
        return results;
        
    }
}

2.數據庫

需要增加jar包

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.6</version>
</dependency>

創建表語句

create table testdata(
name    nvarchar(10),
role nvarchar(10),
result nvarchar(10)
)

表數據

代碼:

public class TestDB {
    public WebDriver driver;
    String baseUrl = "http://www.sogou.com";
    @DataProvider(name="testdata")
    public static Object[][] words() throws IOException{
        return getTestData("testdata");
    }
    @Test(dataProvider = "testdata")
    public void testSearch(String searchWord1, String searchWord2, String searchResult){
        driver.get(baseUrl + "/");
        driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);
        driver.findElement(By.id("stb")).click();
        //Assert.assertTrue(driver.getPageSource().contains(searchResult));
    }
    @BeforeMethod
    public void beforeMethod(){
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\lenovo\\AppData\\Local\\Google\\Chrome\\chromedriver.exe");
        driver = new ChromeDriver();
    }
    @AfterMethod
    private void afterMethod(){
        driver.quit();
    }
    public static Object[][] getTestData(String tablename) throws IOException{
        //聲明Mysql數據庫的驅動
        String dbDriver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
        String user = "root";
        String password = "123456";
        //聲明存儲測試數據的List對象
        List<Object[]> records = new ArrayList<Object[]>();
        try{
            //設定驅動
            Class.forName(dbDriver);
            Connection conn = DriverManager.getConnection(url,user,password);
            if (!conn.isClosed())
                System.out.println("連接數據庫成功");
            //創建statement對象
            Statement statement = conn.createStatement();
            //拼接sql語句
            String sql = String.format("Select * from %s", tablename);
            //聲明結果集對象rs,用於存儲執行sql語句返回的數據結果集
            ResultSet rs = statement.executeQuery(sql);
            //聲明一個ResultSetMetaData對象
            ResultSetMetaData rsMetaData = rs.getMetaData();
            //調用ResultSetMetaData對象的getColumnCount方法獲取數據行的列數
            int cols = rsMetaData.getColumnCount();
            /**使用next方法遍歷數據結果集中的所有數據行*/
            while (rs.next()){
                //聲明一個字符串型數組,數組大小使用數據行的列個數進行聲明
                String fields[] = new String[cols];
                int col = 0;
                //遍歷所有數據行中的所有數據,並存儲在字符串數組中
                for (int colIdx = 0; colIdx<cols; colIdx++){
                    fields[col] = rs.getString(colIdx+1);
                    col++;
                }
                //將每一行的數據存儲到字符串數組后,存儲到records中
                records.add(fields);
                //輸出數據行中的前三列內容,用於驗證數據庫內容是否正確讀取
                System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
            }
            //關閉數據結果集對象
            rs.close();
            //關閉數據庫連接
            conn.close();
        }catch (ClassNotFoundException e){
            System.out.println("未能找到Mysql的驅動類");
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
        //定義函數返回值,即Object[][]
        //將存儲測試數據的list轉換為一個Object的二維數組
        Object[][] results = new Object[records.size()][];
        //設置二維數組每行的值,每行是一個Object對象
        for (int i = 0; i<records.size(); i++){
            results[i] = records.get(i);
        }
        return results;
    }

}

3.數組

代碼:

 

public class TestArray {
    private static WebDriver driver;
    @DataProvider(name="searchWords")
    public static Object[][] words(){
        return new Object[][]{{"蝙蝠俠","主演","邁克爾"},{"超人","導演","唐納"},{"生化危機","編劇","安德森"}};
    }
    @Test(dataProvider = "searchWords")
    public void test(String searchWord1, String searchWord2, String SearchResult){
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\lenovo\\AppData\\Local\\Google\\Chrome\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://www.sogou.com");
        driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);
        driver.findElement(By.id("stb")).click();
        try{
            Thread.sleep(3000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        //Assert.assertTrue(driver.getPageSource().contains(SearchResult));
        driver.quit();

    }

}

4.excel

所需jar包

    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
    </dependency>
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
    </dependency>

代碼:

public class TestExcel {

    public WebDriver driver;
    String baseUrl = "http://www.sogou.com";
    @DataProvider(name="testData")
    public static Object[][] words() throws IOException{
        return getTestData("D:\\test", "testData.xlsx", "Sheet1");
    }
    @Test(dataProvider = "testData")
    public void testSearchExcel(String searchWord1, String searchWord2, String searchResult){
        driver.get(baseUrl + "/");
        driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);
        driver.findElement(By.id("stb")).click();
        //Assert.assertTrue(driver.getPageSource().contains(searchResult));
    }
    @BeforeMethod
    public void beforeMethod(){
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\lenovo\\AppData\\Local\\Google\\Chrome\\chromedriver.exe");
        driver = new ChromeDriver();
    }
    @AfterMethod
    private void afterMethod(){
        driver.quit();
    }
    public static Object[][] getTestData(String filePath, String fileName, String sheetName) throws IOException{
        File file = new File(filePath + "\\" + fileName);
        //創建FileInputStream對象用於讀取Excel文件
        FileInputStream inputStream = new FileInputStream(file);
        //聲明Workbook對象
        Workbook workbook = null;
        //獲取文件名參數的擴展名,判斷是.xlsx文件還是.xls文件
        String fileExtensionName = fileName.substring(fileName.indexOf("."));
        //如果是.xlsx,則用XSSFWorkbook對象進行實例化,如果是.xls則使用HSSFWorkbook對象進行實例化
        if (fileExtensionName.equals(".xlsx")){
            workbook = new XSSFWorkbook(inputStream);
        }
        else if (fileExtensionName.equals(".xls")) {
            workbook = new HSSFWorkbook(inputStream);
        }
        //通過sheetName參數生成Sheet對象
        Sheet sheet = workbook.getSheet(sheetName);
        //獲取Excel數據文件Sheet1中數據的行數,getLastRowNum方法獲取數據的最后一行行號
        //getFirstRowNum方法獲取數據的第一行行號,相減之后算出數據的行數
        //Excel行和列都是從0開始
        int rowCount = sheet.getLastRowNum()-sheet.getFirstRowNum();
        //創建名為records的list對象來存儲從Excel數據文件讀取的數據
        List<Object[]> records = new ArrayList<Object[]>();
        //使用兩個for循環遍歷Excel數據文件除去第一行外所有數據
        //所以i從1開始,而不是從0開始
        for (int i = 1; i<rowCount+1; i++){
            Row row = sheet.getRow(i);
            //聲明一個數組,用來存儲Excel數據文件每行中的數據,數組的大小用getLastCellNum辦法來進行動態聲明,實現測試數據個數和數組大小相一致
            String fields[] = new String[row.getLastCellNum()];
            for (int j = 0; j<row.getLastCellNum();j++){
                //調用getCell和getStringCellValue方法獲取Excel文件中的單元格數據
                fields[j] = row.getCell(j).getStringCellValue();
            }
            //將fields的數據兌現存儲到records的list中
            records.add(fields);
        }
        //定義函數返回值,即Object[][]
        //將存儲測試數據的list轉換為一個Object的二維數組
        Object[][] results = new Object[records.size()][];
        //設置二維數組每行的值,每行是一個Object對象
        for (int i = 0; i<records.size(); i++){
            results[i] = records.get(i);
        }
        return results;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM