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; } }