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

数据库数据:

数据库操作:

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


猜你喜欢

转载自blog.csdn.net/zouxiongqqq/article/details/79352654