【问题标题】:Creating test data, in databases, from XML [closed]从 XML 在数据库中创建测试数据 [关闭]
【发布时间】:2012-09-01 12:27:21
【问题描述】:

我正在寻找一个允许我使用 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 中的这些字段实际上是一个 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 值到位,并在 5 分钟后在表 B 中创建具有time 字段的第二条记录比上一个。除非我想要/需要,否则我不必在一个表或另一个表中明确列出参考字段值。系统可以根据需要自动生成字段,并根据需要将它们转发给 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 都正确地相互引用。

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

【问题讨论】:

    标签: xml junit test-data


    【解决方案1】:

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

    【讨论】:

    • 这看起来可能是一个很好的答案。仍在搞砸它,试图弄清楚它是否可以进行相对日期/时间和转换。
    【解决方案2】:

    我不知道有什么工具可以完全符合要求,但是,你看过Red Gate's SQL Data Generator 吗? Red Gate 是非常好的 SQL 工具。

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

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

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

    【讨论】:

    • 如果我需要做的只是从 XML 创建数据,并且永远不会弄乱它,那么这会很顺利。如果我想修改数据,稍后,我将不得不对生成的 SQL 进行修订控制(因为这是单元测试实际需要的)原始源 XML,以及其他任何人维护它也必须拥有这些工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2023-01-28
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2018-09-03
    • 2012-08-04
    相关资源
    最近更新 更多