一、數據驅動測試概念
數據驅動測試是相同的測試腳本使用不同的測試數據執行,測試數據和測試行為完全分離。
二、實施數據驅動測試的步驟:
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; } }
