• 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;
        }
    }
  • 相关阅读:
    List里如何剔除相同的对象?
    Collections工具类中的sort方法如何比较元素?
    TreeMap和TreeSet在排序时如何比较元素?
    Map的实现类中,哪些是有序的,哪些是无序的,如何保证其有序性?
    LinkedHashMap、LinkedHashSet、LinkedList哪个最适合当作Stack使用?
    ArrayList与LinkedList哪个插入性能高?
    HashSet和HashMap有什么区别?
    HashSet实现原理是什么?有什么特点?
    TreeSet的原理是什么?使用需要注意什么?
    Java中已经数组类型,为什么还要提供集合?
  • 原文地址:https://www.cnblogs.com/wuyn/p/10234797.html
Copyright © 2020-2023  润新知