DBunit 是一种扩展于JUnit的数据库驱动测试框架,它使数据库在测试过程之间处于一种已知状态,如果一个测试用例对数据库造成了破坏性影响,它可以帮助避免造成后面的测试失败或者给出错误结果。
基于DbUnit的测试的主要接口是IDataSet。IDataSet代表一个或多个表的数据。
可以将数据库模式的全部内容表示为单个IDataSet实例。这些表本身由Itable实例来表示。
IDataSet的实现有很多,每一个都对应一个不同的数据源或加载机制。最常用的几种IDataSet实现为:
FlatXmlDataSet:数据的简单平面文件XML表示,但是现在这个方法已经失效,由FlatXmlDataSetBuilder代替
QueryDataSet:用SQL查询获得的数据
DatabaseDataSet:数据库表本身内容的一种表示
XlsDataSet:数据的excel表示
一般而言,使用DbUnit进行单元测试的流程如下:
1根据业务,做好测试用的准备数据和预想结果数据,通常准备成xml格式文件。
2在setUp()方法里边备份数据库中的关联表。
3在setUp()方法里边读入准备数据。
4对测试类的对应测试方法进行实装:执行对象方法,把数据库的实际执行结果和预想结果进行比较。
5在tearDown()方法里边,把数据库还原到测试前状态。
import java.io.File;
import java.io.FileOutputStream;
import org.dbunit.JdbcDatabaseTester;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class UserActionTest{
public static JdbcDatabaseTester tester;
public static IDataSet dataSet_Insert;
public static IDataSet dataSet_init;
public static IDataSet dataSet_bak;
@BeforeClass
public static void beforeClass() throws Exception {
loadDB();
System.out.println("BeforeClass");
IDatabaseConnection conn = tester.getConnection();
String[] depTableNames = new String[] { "user_info" };
try {
IDataSet utput = conn.createDataSet(depTableNames);
FileOutputStream fos = new FileOutputStream("user-info-bak.xml");
// 备份数据
FlatXmlDataSet.write(utput, fos);
// 初始化数据
// dataSet_init=new FlatXmlDataSet(new File("user-roles.xml"));
dataSet_init = new FlatXmlDataSetBuilder().build(new File(
"user_info.xml"));
DatabaseOperation.CLEAN_INSERT.execute(conn, dataSet_init);
} finally {
conn.close();
}
}
public static void loadDB() throws Exception {
System.out.println("@BeforeTest");
tester = new JdbcDatabaseTester("com.mysql.jdbc.Driver",
"jdbc:mysql://10.37.149.15:8066/USERDB", "test_user", "test_user");
//System.out.println(new File("user_info.xml").getAbsolutePath());
IDatabaseConnection conn = tester.getConnection();
dataSet_init = new FlatXmlDataSetBuilder().build(new File(
"user_info.xml"));
try {
DatabaseOperation.CLEAN_INSERT.execute(conn, dataSet_init);
} finally {
conn.close();
}
}
@Test
public void testInsert() throws Exception {
dataSet_Insert = new FlatXmlDataSetBuilder().build(new File(
"user_insert.xml"));
IDatabaseConnection conn = tester.getConnection();
try {
DatabaseOperation.INSERT.execute(conn, dataSet_Insert);
assert conn.getRowCount("user_info") == 3;
} finally {
conn.close();
}
}
@Test
public void testUpdate() throws Exception {
IDataSet dataSet_Update = new FlatXmlDataSetBuilder().build(new File(
"user_update.xml"));
IDatabaseConnection conn = tester.getConnection();
// IDataSet expect=new FlatXmlDataSetBuilder().build(new
// File("user_update_expected.xml"));
IDataSet act = tester.getConnection().createDataSet();
try {
DatabaseOperation.UPDATE.execute(conn, dataSet_Update);
System.out.println(act.getTable("user_info").getRowCount());
System.out.println(act.getTable("user_info").getValue(
act.getTable("user_info").getRowCount() - 2, "USER_NAME"));
assert act
.getTable("user_info")
.getValue(act.getTable("user_info").getRowCount() - 2,
"USER_NAME").toString().equals("测试修改刘玉杰的信息");
} finally {
conn.close();
}
}
@Test
public void testDelete() throws Exception {
IDataSet dataSet_Delete = new FlatXmlDataSetBuilder().build(new File(
"user_delete.xml"));
IDatabaseConnection conn = tester.getConnection();
// IDataSet expect=new FlatXmlDataSetBuilder().build(new
// File("user_update_expected.xml"));
IDataSet act = tester.getConnection().createDataSet();
try {
DatabaseOperation.DELETE.execute(conn, dataSet_Delete);
// DatabaseOperation.UPDATE.execute(conn, dataSet_Update);
System.out.println(act.getTable("user_info").getRowCount());
} finally {
conn.close();
}
}
@AfterClass
public static void testClearDB() throws Exception {
IDatabaseConnection conn = tester.getConnection();
try {
// 数据还原
DatabaseOperation.CLEAN_INSERT.execute(conn, dataSet_init);
} finally {
conn.close();
}
}
}