DBUnit使用案例
admin
2023-06-09 05:01:26
0

1 . 概念

DbUnit是为数据库驱动的项目提供的一个对JUnit 的扩展,除了提供一些常用功能,它可以将你的数据库置于一个测试轮回之间的状态。

2 . Maven集成DBUnit

2.1 导包

           
         
              org.dbunit
              dbunit
              2.5.0
         
         
         
              ch.qos.logback
              logback-access
              1.1.3
         
         
              ch.qos.logback
              logback-classic
              1.1.3
         
         
         
              mysql
              mysql-connector-java
              5.1.37
         

2.2 创建数据文件夹

DBUnit使用案例

1)创建dbunit文件夹。存放dbunit所有数据信息

2)在dbunit文件夹下创建backup文件夹。存放数据库备份数据文件

3)创建test文件夹。存放所有测试数据文件

2.3 代码整理

2.3.1 DBUnitBase基类

DBUnit说明:

1)设置数据库连接信息

2)设置数据库数据备份路径

3)设置测试数据文件路径

4)数据备份方法和数据恢复方法

package com.zzwx.test.dbunit.base;
 
import java.io.File;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
 
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.DatabaseDataSet;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
 
/**
 * @author Roger
 * @desc DBUnit基类
 */
publicabstractclass DBUnitBase {
 
     /**
      * JDBC数据库连接
      */
     protected Connection conn = null;
 
     /**
      * DBUnit数据库连接
      */
     protected IDatabaseConnection connection = null;
 
     /**
      * 备份数据目录
      */
     protected String backupDataPath = "src/test/resources/dbunit/backup/";
 
     /**
      * 测试数据文件目录
      */
     protected String testDataPath = "src/test/resources/dbunit/test/";
 
     /**
      * 数据备份文件
      */
     protected File file = null;
 
     /**
      * 所有备份文件
      */
     protected List files = null;
 
     /**
      * 获取数据库连接
      * 
      * @returnjava.sql.Connection
      * @throws Exception
      */
     protected Connection getConnection() throws Exception {
         Class.forName("com.mysql.jdbc.Driver");
         // 连接DB
         Connectionconn = DriverManager
                   .getConnection(
                            "jdbc:mysql://localhost:3306/zzwx?useUnicode=true&characterEncoding=UTF-8",
                            "root", "123456");
         returnconn;
     }
 
     /**
      * 通过表名备份数据
      * 
      * @param tableName
      *           表名
      * @param backupFileName
      *           备份文件名
      * @throws Exception
      */
     protectedvoid backupData(String tableName, String backupFileName)
              throws Exception {
         try {
              conn =getConnection();
              connection = new DatabaseConnection(conn);
              if (null != tableName && !"".equals(tableName)) {
                   // 通过表名备份单张表单数据
                   QueryDataSetbackupDataSet = new QueryDataSet(connection);
                   backupDataSet.addTable(tableName);
                   // 设置备份文件路径
                   file = new File(backupDataPath + backupFileName);
                   FlatXmlDataSet.write(backupDataSet, new FileWriter(file),
                            "UTF-8");
              }else {
                   // 备份数据库所有数据
                   IDataSetbackupDataSet = new DatabaseDataSet(connection, true);
                   // 设置备份文件路径
                   file = new File(backupDataPath + backupFileName);
                   FlatXmlDataSet.write(backupDataSet, new FileWriter(file),
                            "UTF-8");
              }
         }catch (Exception e) {
              e.printStackTrace();
         }finally {
              closeCon();
         }
     }
 
     /**
      * 通过xml文件恢复数据
      * 
      * @param fileName
      *           路径+文件名
      */
     @SuppressWarnings("deprecation")
     publicvoid recoverData(File file) {
         try {
              conn =getConnection();
              connection = new DatabaseConnection(conn);
              IDataSetdataSet = new FlatXmlDataSet(file);
              DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
         }catch (Exception e) {
              e.printStackTrace();
         }finally {
              closeCon();
         }
     }
 
     /**
      * 关闭连接
      */
     protectedvoid closeCon() {
         try {
              if (connection != null) {
                   connection.close();
              }
              if (conn != null) {
                   conn.close();
              }
         }catch (SQLException e) {
              e.printStackTrace();
         }
     }
 
}

2.3.2 DBUnitAll

DBUnitAll说明:

1)继承DBUnitBase基类

2)添加测试数据,并将测试前数据备份到src/test/resources/dbunit/backup/all_data_back.xml

3)备份数据库所有数据方法、恢复数据库数据方法

4)使用该类时,setUpBackupAll(fileName)recoverAllData()方法需要成对调用。不然数据库数据不会恢复到测试之前的数据。

package com.zzwx.test.dbunit;
 
import java.io.FileInputStream;
import java.sql.Connection;
 
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
 
import com.zzwx.test.dbunit.base.DBUnitBase;
 
/**
 * @author Roger
 * @desc备份所有数据库所有数据在一个备份文件中
 */
publicclass DBUnitAll extends DBUnitBase {
 
     /**
      * 添加测试数据,并备份数据库所有数据在 src/test/resources/dbunit/backup/all_data_back.xml
      * 
      * @param fileName
      *           测试数据文件
      */
     @SuppressWarnings("deprecation")
     publicvoid setUpBackupAll(String fileName) {
         // JDBC数据库连接
         Connectionconn = null;
         // DBUnit数据库连接
         IDatabaseConnectionconnection = null;
         try {
              conn =getConnection();
              // 获得DB连接
              connection = new DatabaseConnection(conn);
              // 备份数据库测试之前的数据
              backupAll();
              // 准备数据的读入
              IDataSetdataSet = new FlatXmlDataSet(new FileInputStream(
                       testDataPath + fileName));
              connection.createDataSet(new String[] {});
              DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
         }catch (Exception e) {
              e.printStackTrace();
         }finally {
              closeCon();
         }
     }
 
     /**
      * 备份数据库所有数据
      */
     publicvoid backupAll() {
         try {
              super.backupData(null, "all_data_back.xml");
         }catch (Exception e) {
              e.printStackTrace();
         }
     }
 
     /**
      * 还原数据库到测试之前
      */
     publicvoid recoverAllData() {
          super.recoverData(file);
     }
}

2.3.3 DBUnitEach

DBUnitEach说明

1) 继承DBUnitBase基类

2) 添加测试数据,并备份需要备份数据表的数据,通过表名备份数据,每张表对于一个备份数据文件

setUpBackupEach()recoverBackupEach()需要成对出现。不然数据库数据不会恢复到测试之前的数据。

package com.zzwx.test.dbunit;
 
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.ArrayList;
 
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
 
import com.zzwx.test.dbunit.base.DBUnitBase;
 
/**
 * @author Roger
 * @desc添加测试数据并备份需要备份的表,每张表对应一个xml备份文件
 */
publicclass DBUnitEach extends DBUnitBase {
 
     /**
      * 添加测试数据并备份数据
      * 
      * @param fileName
      *           文件名
      * @param tableNames
      *           需要备份的表名集合
      */
     @SuppressWarnings("deprecation")
     publicvoid setUpBackupEach(String fileName, String... tableNames) {
         // JDBC数据库连接
         Connectionconn = null;
         // DBUnit数据库连接
         IDatabaseConnectionconnection = null;
         try {
              conn =getConnection();
              // 获得DB连接
              connection = new DatabaseConnection(conn);
              // 备份数据库测试之前的数据
              backupDataEach(tableNames);
              // 准备数据的读入
              IDataSetdataSet = new FlatXmlDataSet(new FileInputStream(
                       testDataPath + fileName));
              connection.createDataSet(new String[] {});
              DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
         }catch (Exception e) {
              e.printStackTrace();
         }finally {
              closeCon();
         }
     }
 
     /**
      * 通过表名备份数据(每张表一个备份文件)
      * 
      * @param tableNames
      *           表名集合
      * @throws Exception
      */
     publicvoid backupDataEach(String... tableNames) throws Exception {
         try {
              if (tableNames != null && tableNames.length > 0) {
                   files = new ArrayList();
                   for (String tableName : tableNames) {
                       super.backupData(tableName, tableName + "_back.xml");
                       files.add(file);
                   }
              }
         }catch (Exception e) {
              e.printStackTrace();
         }finally {
              closeCon();
         }
     }
 
     /**
      * 还原备份的数据
      */
     publicvoid recoverBackupEach() {
         if (null != files && files.size() > 0) {
              for (File file : files) {
                   super.recoverData(file);
              }
         }
     }
}

2.3.4 DBUnitEachAll

DBUnitEachAll说明:

1) 继承DBUnitBase基类

2) 添加测试数据,并备份所有要备份数据表的所有数据到一个备份文件中each_all_data_back.xml

3) setUpBackupEachAll()recoverBackupEachAll()方法成对出现。不然数据库数据不会恢复到测试之前的数据。

package com.zzwx.test.dbunit;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.sql.Connection;
 
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.operation.DatabaseOperation;
 
import com.zzwx.test.dbunit.base.DBUnitBase;
 
/**
 * @author Roger
 * @desc添加测试数据并备份测试前数据库所有数据到一个备份文件中
 */
publicclass DBUnitEachAll extends DBUnitBase {
 
     /**
      * 添加测试数据并备份数据
      * 
      * @param fileName
      *           文件名
      * @param tableNames
      *           表名集合
      */
     @SuppressWarnings("deprecation")
     publicvoid setUpBackupEachAll(String fileName, String... tableNames) {
         // JDBC数据库连接
         Connectionconn = null;
         // DBUnit数据库连接
         IDatabaseConnectionconnection = null;
         try {
              conn =getConnection();
              // 获得DB连接
              connection = new DatabaseConnection(conn);
              // 备份数据库测试之前的数据
              backupDataEachAll(tableNames);
              // 准备数据的读入
              IDataSetdataSet = new FlatXmlDataSet(new FileInputStream(
                       testDataPath + fileName));
              connection.createDataSet(new String[] {});
              DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
         }catch (Exception e) {
              e.printStackTrace();
         }finally {
              closeCon();
         }
     }
 
     /**
      * 通过表名将数据库中的数据备份到一个xml备份文件中
      * 
      * @param tableNames
      *           表名集合
      * @throws Exception
      */
     publicvoid backupDataEachAll(String... tableNames) throws Exception {
         try {
              conn =getConnection();
              // 获得DB连接
              connection = new DatabaseConnection(conn);
              
              QueryDataSetbackupDataSet = new QueryDataSet(connection);
 
              if (null != tableNames && tableNames.length > 0) {
                   for (String tableName : tableNames) {
                       backupDataSet.addTable(tableName);
                   }
              }
              // 设置备份文件路径
              file = new File(backupDataPath + "each_all_data_back.xml");
              FlatXmlDataSet.write(backupDataSet, new FileWriter(file), "UTF-8");
         }catch (Exception e) {
              e.printStackTrace();
         }finally {
              closeCon();
         }
     }
 
     /**
      * 还原备份的数据
      */
     publicvoid recoverBackupEachAll(){
         if(null != file){
              super.recoverData(file);
         }
     }
 
}


相关内容

热门资讯

小米YU7 GT、小米17 M... 5月21日,小米连续发布全新小米YU7家族,新增小米YU7 GT、YU7 标准版两大车型。同场发布的...
持续深耕AI4S创新创业生态 ... 首期科学智能百团百项“科创训练营”近日在沪举办,来自近30个AI4S(AI for Science)...
特朗普:美伊协议“尚未完全谈妥... 新华社华盛顿5月24日电(记者颜亮 徐剑梅)美国总统特朗普24日说,美国和伊朗的协议“尚未完全谈妥”...
大幅升级改造!神舟二十三号飞船... 神舟二十三号飞船出征在即,作为新批次飞船的第二艘飞船,它有哪些改进?承担什么样的任务? 人机界面升...
原创 这... 在自然界,有一些动物通过模仿有毒的、有害的其它动物,来提高生存能力,也有一些动物通过模仿周围的环境来...
Windows竟然藏了一个工具... 快科技5月24日消息,据Neowin报道,Windows系统中有一个鲜为人知的“Windows To...
每天使用手机超过5小时,会发生... 刷手机这事 估计没人能逃得过 上班路上刷几条热搜 吃饭时配一段短视频 睡前躺在床上翻朋友圈、看抖音 ...
硅谷正在流行“氛围办公”:不敲... 这个春天开始,硅谷的办公室里,敲打键盘的哒哒声正在被嘀嘀咕咕的人声取代。 有风险投资人调侃,现在去硅...
抵达!神舟二十三号载人飞船与空... 据中国载人航天工程办公室消息,神舟二十三号载人飞船入轨后,于北京时间2026年5月25日2时45分,...
神舟二十三号载人飞船发射取得圆... 5月24日,搭载神舟二十三号载人飞船的长征二号F遥二十三运载火箭在酒泉卫星发射中心点火发射。神舟二十...