您的位置:首页 > 编程语言 > Java开发

【java 菜鸟自动化实践之四】将数据库查询数据,转为TestNG适用的对象二维数组数据

2018-02-23 12:35 399 查看
数据库数据:



数据库操作:import java.sql.*;
import org.apache.log4j.Logger;

public class MysqlConn {
private static Logger log = Logger.getLogger(MysqlConn.class);
private static MysqlConn op;
private Connection conn;
private String driver;
private String url;
private String userName;
private String userPassword;

private MysqlConn() {
}

private MysqlConn(String driver, String url, String userName, String userPassword) throws Exception {
this.driver = driver;
this.url = url;
this.userName = userName;
this.userPassword = userPassword;
try {
// 加载mysql驱动器
Class.forName(driver);
// 建立数据库连接
conn = DriverManager.getConnection(url, userName, userPassword);
} catch (ClassNotFoundException e) {
System.out.println("加载驱动器失败");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("注册驱动器失败");
e.printStackTrace();
}
}

// 获取数据库连接
public void getConnection() throws Exception {
if (conn != null) {
Class.forName(this.driver);
conn = DriverManager.getConnection(this.url, this.userName, this.userPassword);
}
}

// 静态方法,返回mysqlconn实例
public static MysqlConn instance() {
if (op == null) {
op = new MysqlConn();
}
return op;
}

// 静态方法,返回mysqlconn实例
public static MysqlConn instance(String driver, String url, String userName, String userPassword) throws Exception {
if (op == null) {
op = new MysqlConn(driver, url, userName, userPassword);
}
return op;
}

// 访问数据库,执行插入、删除、更新操作
public String execute_Update(String sql) throws Exception {
getConnection();// 初始化数据库连接
Statement stmt = this.conn.createStatement();// 创建Statement对象
if (stmt.executeUpdate(sql) != 1) {
return "failure";
}
return "success";
}

// 访问数据库,执行查询操作
public ResultSet queryx(String sql) throws Exception {
getConnection();
Statement stmt = this.conn.createStatement();
return stmt.executeQuery(sql);
}

// 关闭数据库链接
public void closeDB() {
try {
conn.close();
} catch (SQLException ex) {
log.error(ex.getMessage());
}
}
} TestNG代码:import java.util.HashMap;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import MysqlConn;

public class run_Interface_testng extends Thread {

private static MysqlConn t_conn;

@DataProvider(name = "Data")
public Object[][] Authentication() throws Exception {
// 获取数据库数据源用例数据,并返回Object[][]
Object[][] results = get_sql_data.Get_DB_TestCase_data(t_conn,Loading_IT_sql);
return results;
}

@Test(dataProvider = "Data")
public void run_testcase(HashMap<String, String> data) throws Exception {
log.info("当前执行的用例是:第" + (data.get("Num")) + "行:" + "test_module:【"
+ data.get("Test_module") + "】--" + "testcase_name:【"
+ data.get("Testcase_name") + "】--" + "Testcase_desc:【"
+ data.get("Testcase_desc") + "】--" + "is_run_module:【"
+ data.get("is_run_module") + "】--" + "Request_url:【"
+ data.get("Request_url") + "】--" + "Method:【"
+ data.get("Method") + "】--" + "Headers:【"
+ data.get("Headers") + "】--" + "Accept_content_type:【"
+ data.get("Accept_content_type") + "】--" + "Body:【"
+ data.get("Body") + "】--" + "Checking_response_data:【"
+ data.get("Checking_response_data") + "】--"
+ "Checking_DB_data:【" + data.get("Checking_DB_data") + "】"
+ "\n");

}

@BeforeMethod
public void beforeMethod() {
}

@AfterMethod
public void afterMethod() {
}

@BeforeClass
public void beforeClass() {

}

@AfterClass
public void afterClass() {
}

@BeforeTest
public void beforeTest() throws Exception {
System.out.println("Start running");
Loading_IT_sql = "SELECT * from interface_testcase;";
String T_mysql_driver = com.mysql.jdbc.Driver
String T_mysql_url = jdbc:mysql://localhost:3306/auto_testcase?useUnicode=true&characterEncoding=UTF-8
String T_mysql_DB_user = root
String T_mysql_DB_password = 123456
t_conn = MysqlConn.instance(T_mysql_driver, T_mysql_url, T_mysql_DB_user, T_mysql_DB_password);
}

@AfterTest
public void afterTest() {
System.out.println("End running \n");
t_conn.closeDB();
}

@BeforeSuite
public void beforeSuite() {
}
}
/**
*
* 获取数据库数据存入二维数组
*
* @return Object[][]
* @author xzee
*/
public class Read_sql_data {
private static Logger log = Logger.getLogger(Read_sql_data.class);

@SuppressWarnings({ "unchecked", "rawtypes"})
public Object[][] Get_DB_TestCase_data(MysqlConn t_conn,String sql) throws Exception {
ArrayList<String> arrkey = new ArrayList<String>();
ResultSet rs = t_conn.queryx(sql);
ResultSetMetaData data = rs.getMetaData();
// 总列数
int columns=data.getColumnCount();
// 获得首行的列名,作为hashmap的key值
for (int c = 1; c <= columns; c++) {
String columnName = data.getColumnName(c);
arrkey.add(columnName);
}
int rowTotalNum = 1;
while (rs.next()) {
//获取总行数
rowTotalNum = rs.getRow() + 1;
}
HashMap<String, String>[][] map = new HashMap[rowTotalNum - 1][1];
// 对数组中所有元素hashmap进行初始化
if (rowTotalNum > 1) {
for (int i = 0; i < rowTotalNum - 1; i++) {
map[i][0] = new HashMap();
}
// 特别重要,否则取到的全是0。因为执行上面的while(rs.next())后,ResultSet对象的下标已指到0,所以rs需要重新赋值。
// API:当生成ResultSet对象的Statement对象关闭、重新执行或用来从多个结果的序列获取下一个结果时,ResultSet对象将自动关闭。
rs = t_conn.queryx(sql);
// 输出二维数组
// 遍历所有的单元格的值添加到hashmap中
for (int r = 1; rs.next(); r++) {
for (int c = 1; c <= columns; c++) {
String rowValue = rs.getString(c);
map[r - 1][0].put(arrkey.get(c - 1), rowValue);
}
}
} else {
log.error("数据库中没有数据!");
}
return map;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: