测试从数据库返回的数据集

时间:2011-01-11 23:58:14

标签: java database unit-testing junit

如果我正在测试数据库行集,那么测试的标准是什么?

我应该测试是否存在名称为A等的行(数据库中有什么)?这是一个坏主意吗?这种测试很脆弱,因为数据可以改变,但查询可以是正确的。

考虑到这一点,检查我在数据集中返回的列名称会更好吗?像这样(http://stackoverflow.com/questions/696782/retrieve-column-names-from-java-sql-resultset)./ / p>

由于

3 个答案:

答案 0 :(得分:0)

测试数据库中的内容是没有意义的,除非它是数据静态参考数据表(并且你经常可以使这些只读,所以再次毫无意义)。

测试列名?为什么这些会改变?希望开发人员不要对生产服务器进行更改?

您可能想要的是,作为完整部署数据库的CI构建过程的一部分(将所有增量更改脚本[你有那些吗?])应用到测试服务器。

答案 1 :(得分:0)

除了数据库和代码工作之外,您不需要测试任何有关数据库的信息。

然后,使用您在测试环境中创建的数据库,将使用数据库的代码连接到它,并测试它是否按预期执行。

请记住,在测试中,很少需要检查某些事情是如何完成的,而是你应该测试圆顶事实确实已经完成。

例如,如果你使用hibernate来持久化你的实体,你可能会有一个名为canRoundTripAFooBar的测试,它会保存一个foobar,再次加载它,并比较每个字段以确保你加载的那个和你保存的那个是相同的(除了那些不应该相同的位,如Ids或其他东西)

答案 2 :(得分:0)

不要测试数据库中的内容。只是提供一些系统如何实现价值的例子。

如果值真的存在于数据库中 - 例如,另一个服务使用该数据 - 则根据该值描述系统提供的内容。例如:

  • 我的系统可以为他的四口之家和另一个国家的配偶保存用户。
  • 我的系统可以处理日语地址。
  • 我的系统可以提供历史价格数据。

如果你真的需要,你可以将大块数据 - 而不是单个行 - 与它们匹配的域概念相关联。删除一些重复 - 例如将它放在自定义测试查询中 - 将有助于保持这种不那么脆弱。

如果你能想到你的系统所提供的东西的例子,那么你可以覆盖它提供的所有数据。

使测试仍然不那么脆弱的另一种方法是使用您所服务的系统的持久层或持久层(例如,Hibernate)将数据转换回域对象,这对于这些示例更有意义

这也可以帮助您检查您提供的数据是否真正有价值,而不仅仅是那里。如果它是您自己的系统,您可以提供价值,您可以做到这一点,并保持完全自由,用于存储数据的格式。你也可以这样做:

  • 我的系统不允许我存储没有父母的孩子。
  • 我的系统不允许一行中超过150个字符的地址。

并检查数据库异常 - 还允许您验证约束。