0

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

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

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

我经常使用在 SQL 广泛使用之前在生产环境中使用的遗留表。很多decimal(7,2)领域。很多(我的意思是很多)复合键和索引。我有一些情况,这个表有一个由这两个字段组成的复合 PK,这实际上是另一个表的复合 PK 的 FK,加上这个表特定的几个其他字段。我们有decimal(8,0)实际上是 YYYYMMDD 值的字段。后者实际上是复合 PK 的一部分。

我不会修改这个环境。其中一些表格已经在生产中使用了几十年。

HSQLDB 可以很好地处理这一切。它可以模拟所有这些东西。我什至可以创建上述decimal(8,0)-cum-date 字段之一,在其中获取当前日期,在其中添加/减去多天,然后将其转换为decimal(8,0)值。

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

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

用手。

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

我想要一个可以读取/解析这些create table语句的框架,或者从创建的表中提取模式数据,并且可能需要一些额外的配置来告诉它表 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>

并让它在表 A 中创建一条记录,根据需要记下 PK 值,然后在表 B 中创建两条记录,并使用适当的 FK 值,并且表 B 中的第二条记录具有time比前一条晚 5 分钟的字段。除非我想要/需要,否则我不必在一个表或另一个表中明确列出参考字段值。系统可以根据需要自动生成字段,并根据需要将它们转发给 FK。

我希望能够嵌套任意多层次的深度。在我的脑海中,我可以想象:

<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>

在我现有的一个项目中。

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

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

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

4

2 回答 2

1

我不确定它是否会完全消除您对复杂测试数据的痛苦,但我认为DBUnit至少会减轻一点。值得一看和尝试。

于 2012-09-07T15:37:52.330 回答
0

我不知道有什么工具可以完全符合要求,但是,您看过Red Gate 的 SQL 数据生成器吗?Red Gate 制作了非常好的 SQL 工具。

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

因此,模拟对象是不够的;数据必须写入数据库,系统确保 PK 和 FK 都正确地相互引用。

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

于 2012-09-07T15:38:04.730 回答