【发布时间】:2011-09-21 08:46:22
【问题描述】:
这是扫描仪:
我正在开发一个 DAO 对象,它使用休眠条件 API 来形成许多复杂的查询,以在数据库上执行某些任务(例如跨多个字段的关键字搜索)。
我们需要对此进行单元测试,以确保生成的查询对于各种场景都是正确的。测试它的一种方法(可能更可取)是通过在最后检查它并模拟数据库交互来测试是否正确创建了休眠标准。然而,这是不可取的,因为首先它有点作弊(它只是复制代码会做的事情),而且它也不会检查条件本身是否会导致休眠到 barf 或者当它进入数据库时会导致问题。
然后使用的选项是针对测试数据库运行查询。但是,由于历史原因,没有静态测试数据库(例如,代码作为代码的一部分签入的数据库)并且我的项目的职权范围不允许我着手创建一个,我们必须满足于针对使用生产数据定期刷新的共享开发数据库。
当这些刷新发生时,测试背后的数据也可能发生变化,这会使我们的单元测试变得脆弱。我们可以通过在测试中不使用确切的数字来克服它,但这样的测试并不充分。
那么问题来了:在这种情况下人们会怎么做才能让测试变得不那么脆弱?我想到的一个选择是运行一个执行相同查询的本机 SQL(行为上 - 它不必与 hibernate 生成的查询完全相同)以获得预期的数字,然后运行 DAO 版本来查看如果匹配。这样,查询的行为可以始终在初始的原生 SQL 中实现,并且您将始终拥有正确的数字。
对于如何处理这种情况的任何反馈或其他想法,我们将不胜感激。
一个。
更新:
关于 hsqldb/h2/derby 的建议,我很熟悉,但公司还没有准备好走这条路,只在一个测试用例上零碎做是不合适的。
关于我之前的建议,我想详细说明一下 - 考虑一下这种情况:
我想确保我相对复杂的关键字搜索返回 2100 个“John Smith”匹配项。
为了找到预期的数字,我会分析我的数据库并使用 SQL 查询找到数字。将该查询作为测试的一部分,以便您始终知道您正在测试条件的行为有什么缺点?
所以基本上问题是:如果由于某种原因您无法拥有用于测试的静态数据集,您将如何以非脆弱的方式执行集成测试?
【问题讨论】:
标签: java hibernate unit-testing junit dbunit