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

  1. 查询外部数据库,加载到进纸表中
  2. 查询视图,这是我的feed和数据表的三角洲,更新数据表以匹配供稿表

我的单元测试策略是这样的:

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

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

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

看起来这个方法有点麻烦,应该有更简单的方法吧?有什么建议么?

有帮助吗?

解决方案

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

如果你想测试视图,你可以使用类似的工具 数据库单元 使用您手动计算增量的各种数据填充您的 Feed 和数据表。然后,对于每个测试,您将验证视图是否返回匹配的集合。

如果您想测试代码如何响应视图检测到的差异,我会尝试抽象数据库访问。我想象一个 java 方法,您可以向其传递结果集(或 POJO/DTO 的列表)并返回要添加的参数对象数组(再次,或 POJO 的)列表。其他方法将解析差异列表以查找要删除和更新的项目。然后,您可以创建一个模拟结果集或 pojo,将它们传递给您的代码并验证返回的参数是否正确。一切都无需接触数据库。

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

其他提示

数据库单元 会满足您的需求。需要注意的一件事是,他们已改用 SLF4J 作为日志记录外观,而不是 JCL。您可以配置 SLF4J 将日志记录转发到 JCL,但如果您使用 Maven,请注意 DbUnit 默认情况下会吸收其 Nop 日志提供程序,因此您必须使用排除项,我 写博客 关于最近的这场冲突。

我使用 DbUnit,但我也非常努力地工作,以避免针对数据库进行测试。针对数据库的测试应该仅出于测试数据库接口的目的而存在。因此,我有模拟数据库连接,我可以设置数据以在所有其余测试中使用。

除了已经建议的 DBUnit 之外,您可能还想研究一下 单位. 。它使用 DBUnit,但提供的还不止这些(引自该网站):

  • 自动维护数据库,并支持增量,可重复和后处理脚本
  • 自动禁用约束并将序列设置为最小值
  • 支持 Oracle、Hsqldb、MySql、DB2、Postgresql、MsSql 和 Derby
  • 简化测试数据库连接设置
  • 使用 DBUnit 简单插入测试数据 * 在事务中运行测试
  • JPA Entity Manager创建和冬眠,TopLink和 * Hibernate SessionFactory创建和会话的注入
  • 使用数据库自​​动测试JPA实体 /休眠映射对象的映射

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top