代码之家  ›  专栏  ›  技术社区  ›  shsteimer

数据库代码的JUnit

  •  8
  • shsteimer  · 技术社区  · 16 年前

    我一直在尝试实现单元测试,目前有一些代码可以执行以下操作:

    1. 查询外部数据库,正在加载 进料台
    2. 查询视图, 这是我的数据和数据的增量 表,更新数据表以匹配 进料台

    我的单元测试策略是:

    我有一个可以自由操作的测试数据库。

    1. 在setup()中,将一些数据加载到我的测试数据库中
    2. 运行我的代码,使用我的测试数据库作为源
    3. 检查数据表,检查计数和某些记录的存在/不存在
    4. 清除测试数据库,加载不同的数据集
    5. 再次运行代码
    6. 再次检查数据表

    显然,我将数据集加载到源数据库中,这样我就知道应该添加、删除、更新某些记录等。

    这似乎有点麻烦,应该有一个更简单的方法吗?有什么建议吗?

    5 回复  |  直到 8 年前
        1
  •  8
  •   David Carlson    16 年前

    您的目的是测试生成增量的视图,还是测试代码是否正确地添加、删除和更新视图?

    如果要测试视图,可以使用类似 DBUnit 用手工计算的增量的各种数据填充提要和数据表。然后,对于每个测试,您将验证视图是否返回匹配集。

    如果要测试代码对视图检测到的差异的响应方式,我将尝试抽象掉数据库访问。我设想一种Java方法,通过它可以传递结果集(或POJO/DTO的列表),并返回要添加的参数对象数组(再次或波霍)的列表。其他方法将分析要删除和更新的项的diff列表。然后您可以创建一个模拟结果集或POJO,将它们传递给您的代码,并验证返回的参数是否正确。所有这些都不需要接触数据库。

    我认为关键是把你的过程分成几个部分,并尽可能独立地测试每个部分。

        2
  •  6
  •   Brian Matthews    16 年前

    DbUnit 将满足您的需求。需要注意的一点是,他们已经转向使用slf4j作为日志外观,而不是使用jcl。您可以将slf4j配置为将日志转发到jcl,但如果默认情况下使用maven dbunit sucks,则会收到警告,因此您必须使用排除,即 blogged 关于最近的冲突。

        3
  •  1
  •   Aaron    16 年前

    我使用dbunit,但我也非常努力,不必对db进行测试。 针对数据库的测试应该只存在于测试数据库接口的目的。 所以我有模拟数据库连接,我可以设置数据,以便在其余的测试中使用。

        4
  •  1
  •   Jeroen Heijmans    16 年前

    除了已经建议的DBUnit之外,您可能还需要研究 Unitils . 它使用dbunit,但提供了更多(从站点引用):

    • 自动维护数据库,支持增量, 可重复和后处理脚本
    • 自动禁用约束并将序列设置为最小值
    • 支持Oracle、hsqldb、mysql、db2、postgresql、mssql、derby
    • 简化测试数据库连接设置
    • 使用dbunit*在事务中简单插入测试数据*运行测试
    • 为Hibernate、TopLink和* 休眠会话工厂创建和 阶段
    • 自动测试JPA实体/休眠映射的映射 数据库中的对象
        5
  •  1
  •   toogley    8 年前

    如果您使用maven,一个选项是使用 sql-maven-plugin . 它允许您在maven构建周期中运行数据库初始化/填充脚本。