数据驱动(4)

4.1使用MySQL数据库实现数据驱动测试

测试逻辑:

(1)打开百度首页

(2)在搜索框中输入两个搜索关键词

(3)单击搜索按钮

(4)断言搜索结果页是否包含数据库测试表中每行数据的第三列数据内容

测试环境准备:

(1)从https://dev.mysql.com/downloads/file/?id=484819  下载MySQLmysql-connector-java-8.0.15.zip   

 (2)安装MySQL数据库

(3)从https://dev.mysql.com/downloads/connector/j/ 下载链接驱动JAR文件

(4)将下载的jar文件解决压将其中的mysql-connector-java-8.0.15.jar添加至eclipse中的Build Path中

(5)创建一个数据库

(6)创建testdata表

(7)表字段及数据如图

(8)由于MySQL8.0是最新的MySQL数据库与之前版本的MySQL数据库还是有一些差别的在建立JDBC链接时写法有一些改动如下:

Class.forName("com.mysql.cj.jdbc.Driver");    //8.0的用法
Class.forName("com.mysql.jdbc.Driver");   // 之前版本用法
//8.0版本用法
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_demo?useSSL=false&serverTimezone=UTC","root","password");  
//之前版本的用法
  conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_demo","root","password"); 

测试代码:

package cn.datadriven;

import org.testng.annotations.Test;

import com.mysql.cj.protocol.Resultset;

import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
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.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;

public class TestDataDrivenByMysqlDatabase {
    WebDriver driver;
    String baidu = "http://www.baidu.com";
    //使用注解@Dataprovide,将数据集合命名为“testData”
    @DataProvider(name = "testData")
    public static Object[][]words() throws IOException{
        //调用静态方法getTestData,获取数据库中的数据
        return getTestData("testdata");
    }
  @Test(dataProvider = "testData")
  public void testSearch(String searchWord1,String searchWord2, String searchResult) {
      //使用数据库表中每行前两列数据作为搜索词
      driver.findElement(By.id("kw")).sendKeys(searchWord1+" "+searchWord2);
      driver.findElement(By.id("su")).click();
      //显示等待判断页面是否加载完成,页面底部帮助出现
      (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
          @Override
          public Boolean apply(WebDriver d){
              return d.findElement(By.xpath("//*[@id='help']/a[1]")).getText().contains("帮助");
          }
    });
      //断言判断搜索结果页是否包含每行第三列数据
      Assert.assertTrue(driver.getPageSource().contains(searchResult));
  }
  @BeforeMethod
  public void beforeMethod() {
      System.setProperty("webdriver.chrome.driver", "D:\\WebDriver\\chromedriver_win32\\chromedriver.exe");
      driver = new ChromeDriver();
      driver.manage().window().maximize();
      driver.get(baidu);
  }
  @AfterMethod
  public void afterMethod() {
      driver.quit();
  }
  public static Object[][] getTestData(String tablename) throws IOException{
        //声明MySql数据驱动
        String driver = "com.mysql.cj.jdbc.Driver";
        //声明本地数据库的IP地址和数据库名称
        String url = "jdbc:mysql://localhost:3306/gloryroad?useSSL=false&serverTimezone=UTC";
        //声明登录用户名
        String user = "root";
        //声明登录密码
        String password = "root";
        //声明存储测试数据的List对象
        List<Object[]>records = new ArrayList<Object[]>();
        try {
            //设定驱动
            Class.forName(driver);
            //声明数据库链接对象
            Connection conn = DriverManager.getConnection(url,user,password);
            //如果数据库可用则打印成功链接信息
            if(!conn.isClosed())
                System.out.println("连接数据库成功");
            //创建Statement对象
            Statement statement = conn.createStatement();
            //使用函数参数拼接要执行的数据库语句,来获取数据表的所有数据行
            String sql ="select * from "+tablename;
            //声明ResultSet对象,存取执行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(SQLException e){
            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;
    }
}

测试结果:

posted @ 2019-03-20 15:19  心生意动  阅读(156)  评论(0编辑  收藏  举报