准备测试数据的利器DBUNIT介绍

简介:
在开展测试过程中,要考虑的第一环节就是测试数据的准备。毫无疑问的,我们可以采用最基本的JDBC连接Oracle数据库,用insert语句完成数据的插入。例如下面这段代码:
示例代码 插入一条记录
01    public void insertData() throws Exception{
02           String dbUrl = "jdbc:oracle:thin:@10.0.4.194:1521:test";
03           String user = "uid";
04           String passwd = "pwd";
05           Class.forName("oracle.jdbc.driver.OracleDriver");
06           Connection c = DriverManager.getConnection(dbUrl,user,passwd);
07           Statement s = c.createStatement();
08           String sql = "insert into TABLE (id, name) values('001', 'mike')";
09           s.executeUpdate(sql);
10    }
 
 
但是这种方式有着明显的局限性:
1. 不适合大批量的测试数据准备。
2. 测试数据与代码没有分离。
3. 在代码中维护表结构和表之间的关系非常不妥,当表结构发生变动,代码需要做大量重构工作。
4. 没有断言功能,需要自己编写代码检查测试结果。
 
我们使用DbUnit来解决上述问题。DbUnit是用于维护测试环境的自动化工具,它本身是一个开源项目。这里我们介绍DbUnit最常用的功能。
用DbUnit插入测试数据
DbUnit支持多种方式向数据库中插入数据,例如FlatXmlDataSet, DTDDataSet等等。这里采用最常用的FlatXmlDataSet。顾名思义,这种方式就是用xml的方式准备数据,DbUnit载入xml文件并完成插入数据库的操作。
       首先需要准备一份xml的数据文件,格式如下:
示例代码 数据文件dataset.xml
1     <?xml version="1.0" encoding="GB2312"?>
2     <dataset>
3            <TABLE id="001" name="mike" />
4            <TABLE id="002" name="jack" />
5     </dataset>
 
       第2行的dataset标签是xml的根节点,对应于DbUnit中的一个FlatXmlDataSet对象。
       第3行表示要插入的一条记录。其中表名为TABLE,插入的字段为id、name,对应的值分别为“001”、“mike”。
       整个xml文件一共插入两条记录。
注意
       Xml文件中的值必须用双引号,DbUnit会根据实际的表结构进行类型转换。DbUnit无法插入空值,只能跳过该字段。
接下来要做的就是载入这份数据文件。
示例代码 载入xml文件中的数据
1            public IDataSet getDataSet(String path) {
2                   FlatXmlDataSet dataSet = null;
3                   try {
4                          dataSet = new FlatXmlDataSet(new FileInputStream(new File(path)));
5                   } catch (Exception e) {
6                          e.printStackTrace();
7                   }
8                   return dataSet;
9            }
 
第2行声明一个FlatXmlDataSet对象用来装载测试数据。
第4行用FlatXmlDataSet的构造函数读取path指定的文件来初始化dataSet对象。
第8行返回载有数据的对象。
 
最后就是连接数据库,将对象中的数据插到数据库中。代码8.5给出了一份较完整的代码。
示例代码  DbUnit.java –insertData
01    package util;
02   
03    ...
04   
05    public class DbUnit {
06           private IDatabaseTester databaseTester;
07   
08           private IDatabaseConnection connection;
09   
10           private QueryDataSet queryDataSet;
11   
12           private String driver;
13   
14           private String url;
15   
16           private String user;
17   
18           private String password;
19   
20           private Connection jdbcConnection;
21   
22           public DbUnit() {}
23   
24           public DbUnit(String driver, String url, String user, String password) {
25   
26                  try {
27                         Class driverClass = Class.forName(driver);
28                         jdbcConnection = DriverManager.getConnection(url, user, password);
29                  } catch (Exception e) {
30                         e.printStackTrace();
31                  }
32           }
33   
34           public void setSchema(String schema) throws SQLException {
35                  connection = new DatabaseConnection(jdbcConnection, schema);
36           }
37   
38           public void insertData(IDataSet dataSet) {
39                  try {
40                         //DatabaseOperation.DELETE.execute(connection, dataSet);
41                         DatabaseOperation.INSERT.execute(connection, dataSet);
42                  } catch (Exception e) {
43                         e.printStackTrace();
44                  }
45           }
46   
47           public void deleteData(IDataSet dataSet) {
48                  try {
49                         DatabaseOperation.DELETE.execute(connection, dataSet);
50                  } catch (Exception e) {
51                         e.printStackTrace();
52                  }
53           }
54   
55           public void updateData(IDataSet dataSet) {
56                  try {
57                         DatabaseOperation.UPDATE.execute(connection, dataSet);
58                  } catch (Exception e) {
59                         e.printStackTrace();
60                  }
61           }
62    }
63   
64    public QueryDataSet getQueryDataSet() {
65           return queryDataSet;
66    }
67   
68    public IDataSet getDataSet(String path) {
69           FlatXmlDataSet dataSet = null;
70           try {
71                  dataSet = new FlatXmlDataSet(new FileInputStream(new File(path)));
72           } catch (Exception e) {
73                  // TODO Auto-generated catch block
74                  e.printStackTrace();
75           }
76           return dataSet;
77    }
 
第24-32行建立一个jdbc连接到指定的数据库,DbUnit将jdbcConnection对象封装成自身的通用数据库接口对象IDatabaseConnection。
第34-36行,定义setSchema方法完成不同schema之间的切换。
第38-45行,传入数据库连接和数据这个两参数,执行INSERT操作完成最终的插入动作。DatabaseOpeartion中还定义了UPDATE、DELETE等其他常用操作,这些操作都是DatabaseOperation类中的静态成员对象。DbUnit中的具体实现这里就不细讲了,有兴趣的可以参考DbUnit源代码。
 
 

本文转自elbertchen 51CTO博客,原文链接:http://blog.51cto.com/linkyou/282577,如需转载请自行联系原作者
相关文章
|
2月前
|
安全 数据管理 测试技术
告别蛮力:让测试数据生成变得智能而高效
告别蛮力:让测试数据生成变得智能而高效
353 120
|
3月前
|
存储 测试技术 API
数据驱动开发软件测试脚本
今天刚提交了我的新作《带着ChatGPT玩转软件开发》给出版社,在写作期间跟着ChatGPT学到许多新知识。下面分享数据驱动开发软件测试脚本。
117 0
|
6月前
|
人工智能 缓存 自然语言处理
别再手搓测试数据了!AE测试数据智造系统揭秘
本文介绍如何通过构建基于大语言模型的测试数据智造Agent,解决AliExpress跨境电商测试中数据构造复杂、低效的问题,推动测试效率提升与智能化转型。
别再手搓测试数据了!AE测试数据智造系统揭秘
|
11月前
|
分布式计算 Shell MaxCompute
odps测试表及大量数据构建测试
odps测试表及大量数据构建测试
|
12月前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
166 11
|
12月前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
195 10
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
424 6
|
机器学习/深度学习 监控 计算机视觉
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
3315 1
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
306 1
|
存储 测试技术 数据库
数据驱动测试和关键词驱动测试的区别
数据驱动测试 数据驱动测试或 DDT 也被称为参数化测试。
283 1