从XML在数据库中创建测试数据

从XML在数据库中创建测试数据,xml,junit,test-data,Xml,Junit,Test Data,我正在寻找一个允许我使用XML设置单元测试数据的框架 我做过很多开发,其中一个web前端与一个或多个后端数据库服务器上的多个表连接。出于单元测试的目的,我将数据插入内存中的HSQLDB表中,并针对该表运行DB ops。它速度很快,并且提供了一个相当好的单元测试环境 Hibernate也可以很好地使用它。我只是告诉它,我在单元测试中使用HSQLDB方言,在生产中使用DB2方言,它处理它们之间的差异 通常,我使用的是在SQL广泛使用之前在生产中使用的遗留表。大量的十进制(7,2)字段。很多(我指的是

我正在寻找一个允许我使用XML设置单元测试数据的框架

我做过很多开发,其中一个web前端与一个或多个后端数据库服务器上的多个表连接。出于单元测试的目的,我将数据插入内存中的HSQLDB表中,并针对该表运行DB ops。它速度很快,并且提供了一个相当好的单元测试环境

Hibernate也可以很好地使用它。我只是告诉它,我在单元测试中使用HSQLDB方言,在生产中使用DB2方言,它处理它们之间的差异

通常,我使用的是在SQL广泛使用之前在生产中使用的遗留表。大量的
十进制(7,2)
字段。很多(我指的是很多)复合键和索引。我遇到过这样的情况,这个表有一个由这两个字段组成的复合PK,这两个字段实际上是另一个表的复合PK的FK,再加上一些特定于这个表的其他字段。我们有
十进制(8,0)
字段,它们实际上是YYYYMMDD值。后者实际上是复合PK的一部分

我无法修改此环境。其中一些表格已投入生产使用数十年

HSQLDB可以很好地处理所有这些问题。它可以模拟所有这些东西。我甚至可以创建一个上述的
十进制(8,0)
-cum日期字段,在其中我获取当前日期,向其添加/减去多个日期,并将其转换为
十进制(8,0)

我通过创建多个SQL文件来实现这一点。一个包含一个表的
createtable
语句,另一个包含一组将数据插入该表的
insert
语句。JUnit执行这些设置上下文,然后针对上下文运行实际的单元测试。任何使用JUnit和Spring的人都可能熟悉这种设置

问题是,我最终不得不在一个文件中硬分配PK值,然后与其他文件中的记录保持引用完整性

用手

保持这一点令人头痛。仅仅因为我想添加另一个测试用例或修改现有的测试用例,我已经记不清维护多个文件的引用所花费的时间了

我想要一个框架,它可以读取/解析那些
createtable
语句,或者从创建的表中提取模式数据,还可以进行一些额外的配置,告诉它表B中的这些字段实际上是表a中复合PK的FK

然后,如果我想创建一个XML文件,它有如下内容:

<table_A field1="value" field2="value" pkField1="value" pkField2="value">
  <table_B field1="value" field2="value" pkField3="value" />
  <table_B field1="value" field2="value" pkField3="otherValue" timeField="+5 minutes"/>
</table_A>
在我现有的一个项目中

我希望能够在一个文件中指定整个数据集,而不是在九个文件中。很容易看到哪些数据与哪些其他数据相连接。所有这些都被插入到相应的表中,这些表可能并不都在同一个数据源上

我们曾经用模拟对象做过很多事情,在单元测试阶段用它们代替数据库操作。当代码进入动手测试阶段并且必须与数据库交互时,我们遇到了问题。因此,模拟对象是不够的;数据必须写入数据库,系统应确保PKs和FK相互正确引用


简言之,问题是:有人知道一个框架可以实现上述所有功能吗?包括做日期/时间数学的能力?转换成其他格式?

我不确定它是否能完全消除复杂测试数据带来的痛苦,但我认为它至少能缓解一点。它值得一看,值得一试。

我不知道有哪种工具能完全符合要求,但是,你看过吗?红门是非常好的SQL工具

我认为您在单元测试中遇到的模拟对象问题:

因此,模拟对象是不够的;必须将数据写入 数据库,系统确保PKs和FKs所有参考 我们应该互相尊重


可以改进。如果基于对象关系对业务对象进行了适当的验证,那么单元测试将非常有用。

如果我所需要做的只是从XML创建数据,并且永远不会弄乱数据,那么这将非常有效。如果我想修改数据,稍后,我将不得不修订控制生成的SQL(因为这是单元测试实际需要的)和原始源XML,任何维护它的人也必须拥有这些工具。这看起来可能是一个很好的答案。仍然在搞乱它,试图弄清楚它是否能够完成相对日期/时间和转换。
<table_a ...>
  <table_b ... />
  <table_b ... />
  <table_b ... />
  <table_c ... />
  <table_c ... />
  <table_d ...>
    <table_e ...>
      <table_f ...>
        <table_g ... />
        <table_g ... />
        <table_h ...>
          <table_i ... />
          <table_i ... />
        </table_h>
      </table_f>
    </table_e>
  </table_d>
</table_a>