当前位置: 首页 > 工具软件 > DbUnit > 使用案例 >

Dbunit简介

澹台华采
2023-12-01

一、是什么?

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

	}

}

 类似资料: