我正在寻找一个允许我使用XML来设置单元测试数据的框架。
我做了很多开发,其中Web前端连接一个或多个后端数据库服务器上的多个表。出于单元测试的目的,我将数据插入内存中的HSQLDB表并运行DB操作。它速度快,并提供了一个相当不错的单元测试环境。
Hibernate也适用于它。我只是告诉它我正在使用HSQLDB方言进行单元测试和生产中的DB2方言,它处理它们之间的差异。
很多时候,我正在使用在广泛使用SQL之前正在使用的旧表。很多decimal(7,2)
个字段。复合键和索引很多(我的意思是LOTS)。我有这样的情况,这个表有一个由这两个字段组成的复合PK,它实际上是另一个表的复合PK的FK,还有一些特定于该表的其他字段。我们有decimal(8,0)
个字段,实际上是YYYYMMDD值。后者实际上是复合PK的一部分。
我没有修改这个环境。其中一些表已经在生产中使用了几十年。
HSQLDB与这一切相当合理。它可以模拟所有这些东西。我甚至可以创建上述decimal(8,0)
- 暨日期字段之一,其中我获取当前日期,向/从中添加/减去多天并将其转换为decimal(8,0)
值。
我是通过创建多个SQL文件来完成的。一个包含一个表的create table
语句,另一个包含一堆将insert
语句插入该表的语句。 JUnit执行这些操作来设置上下文,然后针对上下文运行实际的单元测试。任何使用JUnit和Spring的人都可能熟悉这种设置。
问题是我最终不得不在一个文件中硬分配PK值,然后使用其他文件中的记录保持参照完整性。
手工。
维持这一点令人头疼。我已经失去了在多个文件中维护引用所花费的时间,因为我想添加另一个测试用例或修改现有的测试用例。
我想要一个可以读取/解析那些create table
语句的框架,或者从创建的表中提取模式数据,并且可能需要一些额外的配置来告诉它表B中的这些字段实际上是FK关闭表A中的复合PK。
然后,如果我想创建一个类似于:
的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>
在我现有的一个项目中。
我希望能够在一个文件中指定整个数据集,而不是九个。很容易看出哪些数据与其他数据相关联。所有这些都插入到适当的表中,这些表可能并非都在同一个DataSource上。
我们曾经使用模拟对象做很多事情,在单元测试阶段替换数据库操作。当代码进入动手测试阶段并且必须与数据库交互时,我们遇到了问题。因此,模拟对象是不够的;数据必须写入数据库,系统确保PK和FK都能正确引用。
问题,简而言之:有没有人知道一个能够实现上述所有目标的框架?包括做日期/时间数学的能力?并转换为其他格式?
答案 0 :(得分:1)
我不确定它会通过复杂的测试数据完全消除您的痛苦,但我认为DBUnit至少会让它稍微缓解一下。值得一看并尝试。
答案 1 :(得分:0)
我不知道哪种工具完全符合要求,但是,你看过Red Gate's SQL Data Generator吗? Red Gate是非常好的SQL工具。
我认为你在单元测试中使用模拟对象的问题:
Ergo,模拟对象是不够的;必须写入数据 数据库,系统确保PK和FK都参考 彼此正确。
可以改进。如果业务对象具有适当的验证,基于对象关系,则单元测试将更有用。