跳转至

DBunit框架支持

DBunit框架支持

本文档描述了 SeaboxSQL 数据库对于DBunit框架的支持情况和配置说明,面向所有使用SeaboxSQL数据库的用户,主要是数据库管理员和应用程序开发人员。

有关 DBunit 的更多信息,请参阅以下资源:

DbUnit – About DbUnit (sourceforge.net)

  • 注意:

$SD_HOME:SeaboxSQL数据库的安装路径。

概述

DbUnit 是一个基于 Junit 扩展的数据库测试框架。它提供了大量对于数据库相关操作进行抽象和封装的类。它通过使用用户自定义的数据集以及相关操作使数据库处于一种可知的状态,从而使得测试自动化、可重复和相对独立。

本章内容主要是对 DbUnit 的使用方法进行简单描述。

DBunit 使用说明

配置信息说明

以下为 DbUnit 使用的示例。DbUnit 的 jar 包可以从官方网站下载。使用时将 DbUnit 包和 JDBC 包导入到项目的 Libraries中并定义相关配置项即可。

项目工程截图

初始化测试表

create table dbtest(id int primary key,name text,resume clob);
insert into dbtest values(1,'Mike','姓名:张三 英文名:Mike'),(2,'Jack','姓名:李四 英文名:Jack');

准备测试所需数据文件

用作数据插入的seaboxdb1.xml

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<DBTEST id="003" name="Martin" resume=" 姓名:王五 英文名:Martin"/>
<DBTEST id="004" name="Kevin" resume=" 姓名:赵六 英文名:Kevin"/>
</dataset>

用作数据更新的seaboxdb2.xml

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<DBTEST id="001" name="Mary" resume=" 姓名:张三 英文名:Mary"/>
<DBTEST id="002" name="Lily" resume=" 姓名:李四 英文名:Lily"/>
</dataset>

测试用例说明

java测试所需方法(DBunit.java):

package main.java;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.dbunit.DatabaseUnitException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;

public class DBUnit {
	
	private IDatabaseConnection connection;
	private QueryDataSet queryDataSet;
	private Connection jdbcConnection;
	
	public DBUnit() {
	}

	public DBUnit(String driver, String url, String user, String password) {
		try {
			Class.forName(driver);
			jdbcConnection = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void close() throws SQLException {
		if (connection != null) {
			connection.close();
		}
	}
	
	public void setSchema(String schema) throws SQLException, DatabaseUnitException {
		connection = new DatabaseConnection(jdbcConnection, schema);
	}
	
	public void insertData(IDataSet dataSet) {
		try {
			DatabaseOperation.INSERT.execute(connection, dataSet);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void clean_insertData(IDataSet dataSet) {
		try {
			DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void deleteData(IDataSet dataSet) {
		try {
			DatabaseOperation.DELETE.execute(connection, dataSet);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void updateData(IDataSet dataSet) {
		try {
			DatabaseOperation.UPDATE.execute(connection, dataSet);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public QueryDataSet getQueryDataSet() {
		queryDataSet = new QueryDataSet(connection);
		return queryDataSet;
	}
	
	public IDataSet getDataSet(String path) {
		//FlatXmlDataSet dataSet = null;
		IDataSet dataSet = null;
		try {
			dataSet = new FlatXmlDataSetBuilder().build((new File(path)));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dataSet;
	}
}

java测试用例(DBunitTest.java):

package test.java;

import static org.junit.Assert.*;


import java.io.FileWriter;
import java.io.IOException;
import java.sql.SQLException;
import org.dbunit.DatabaseUnitException;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.Column;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import main.java.DBUnit;

public class DBUnitTest {
	
	private String driver = "com.seaboxsql.Driver";
	private String url = "jdbc:seaboxsql://192.168.2.168:7300/seaboxsql";
	private String user = "mppadmin";
	private String password = "mppadmin";
	private static final String DATA_BACKUP_FILE = "back_dbtest.xml";
	private DBUnit dbUnit;

	@Before
	public void setUp() throws SQLException, DatabaseUnitException, IOException {
		dbUnit = new DBUnit(driver, url, user, password);
		dbUnit.setSchema("PUBLIC");
		QueryDataSet dataSet = dbUnit.getQueryDataSet();
		dataSet.addTable("dbtest");
		FlatXmlDataSet.write(dataSet, new FileWriter(DATA_BACKUP_FILE));
		System.out.println("---------------before原数据查询---------------");
		Query();
	}
	
	@After
	public void tearDown() throws SQLException, DatabaseUnitException {
		Query();
		System.out.println("---------------after数据恢复---------------");
		IDataSet dataSet = dbUnit.getDataSet(DATA_BACKUP_FILE);
		dbUnit.clean_insertData(dataSet);
		dbUnit.close();
	}
	
	@Test
	public void TestInsert() throws SQLException, DatabaseUnitException {
		System.out.println("----------Insert----------");
		IDataSet dataSet = dbUnit.getDataSet("seaboxdb1.xml");
		dbUnit.insertData(dataSet);
	}
	
	@Test
	public void TestUpdate() throws SQLException, DatabaseUnitException {
		System.out.println("----------Update----------");
		IDataSet dataSet = dbUnit.getDataSet("seaboxdb2.xml");
		dbUnit.updateData(dataSet);
	}
	
	public void Query() throws SQLException, DatabaseUnitException {
		QueryDataSet dataSet = dbUnit.getQueryDataSet();
		dataSet.addTable("dbtest");
		ITable it = dataSet.getTable("dbtest");
		Column[] columns = dataSet.getTable("dbtest").getTableMetaData().getColumns();
		for (int i = 0; i < it.getRowCount(); i++) {
			for (int j = 0; j < columns.length; j++) {
			System.out.print(it.getValue(i, columns[j].getColumnName()) + " ");
			}
			System.out.println();
		}
	}
}
运行结果说明

运行结果显示,DBunit测试将原表数据保存在back_dbtest.xml中,测试后将又将数据恢复到原数据库中,使测试前后表数据一致。

  • 控制台输出任务

控制台输出任务

  • 数据库后台执行sql

数据库后台执行sql

  • 数据库表数据查询

数据库表数据查询