8

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

  1. 查询外部数据库,加载到提要表中
  2. 查询一个视图,这是我的提要和数据表的增量,更新数据表以匹配提要表

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

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

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

显然,我已经设置了加载到源数据库中的数据集,以便我知道应该添加、删除、更新某些记录等。

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

4

5 回答 5

8

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

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

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

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

于 2008-09-06T15:11:11.647 回答
6

DbUnit将满足您的需求。需要注意的一件事是他们已经切换到使用 SLF4J 作为他们的日志外观而不是 JCL。您可以配置 SLF4J 以将日志记录转发到 JCL,但如果您使用 Maven DbUnit 默认情况下会吸入他们的 Nop 日志提供程序,请注意,因此您必须使用排除项,我最近在博客中谈到了这个冲突。

于 2008-09-06T15:08:26.677 回答
1

我使用 DbUnit,但我也非常努力地不必针对 DB 进行测试。针对数据库的测试应该只存在于测试数据库接口的目的。所以我有 Mock Db Connections,我可以设置数据以用于我的所有其余测试。

于 2008-09-16T19:32:39.250 回答
1

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

于 2008-10-14T07:07:17.213 回答
1

除了已经建议的 DBUnit,您可能还想查看Unitils。它使用 DBUnit,但提供的远不止这些(引自网站):

  • 自动维护数据库,支持增量、可重复和后处理脚本
  • 自动禁用约束并将序列设置为最小值
  • 支持 Oracle、Hsqldb、MySql、DB2、Postgresql、MsSql 和 Derby
  • 简化测试数据库连接设置
  • 使用 DBUnit 简单插入测试数据 * 在事务中运行测试
  • JPA 实体管理器为 hibernate、toplink 和 * Hibernate SessionFactory 创建和会话创建和注入
  • 自动测试 JPA 实体/休眠映射对象与数据库的映射
于 2008-10-31T08:07:09.717 回答