这里的扫描器:如何在没有静态测试数据库的情况下使DAO类的单元测试更加脆弱?
我正在使用hibernate标准API来形成一些复杂的查询来执行数据库上的某些任务(例如跨多个字段的关键字搜索)的DAO对象。
我们需要对此进行单元测试,以确保生成的查询对于各种情况都是正确的。测试它的一种方法 - 可能更可取 - 可能是通过在最后检查并正确模拟数据库交互来测试hibernate标准是否正确创建。然而,这并不可取,因为它首先是有点作弊的(它只是重复代码的工作),而且它不检查标准本身是否会导致hibernate陷入困境,或者当它进入数据库时会导致问题。
然后使用该选项对测试数据库运行查询。但是,由于历史原因,没有静态测试数据库(例如代码中的代码被检入),而且我的项目的职责不允许我着手创建一个,我们必须满足测试的要求共享开发数据库,定期更新生产数据。
当这些刷新发生时,测试背后的数据也会发生变化,这会使我们的单元测试变得很脆弱。我们可以通过在测试中不使用确切的数字来克服它,但是这种方式测试不够。
现在的问题是:人们在这种情况下做些什么来减少测试的脆弱性?我想到的一个选择是运行一个原生SQL,它执行相同的查询(行为上 - 不必与hibernate生成的查询完全相同)以获取期望的数字,然后运行DAO版本以查看如果匹配。这样,查询的行为总是可以在初始本地SQL中实现,并且您将始终拥有正确的数字。
对这个或其他想法如何管理这种情况的任何反馈将不胜感激。
A.
UPDATE:
至于HSQLDB/H2 /德比的建议,我熟悉他们,但公司还没有准备好,只是还没有走这条路线,零碎做只有一个测试用例不适合。
至于我先前的建议,我想更详细地说明一点 - 考虑这样的场景:
我想确保我的相对复杂的关键字搜索返回的2100次比赛为“约翰·史密斯”。
为了找到预期的数字,我会分析我的数据库,并使用SQL查询找出数字。将该查询作为测试的一部分有什么缺点,以便您始终知道您正在测试标准的行为?
所以基本上是这样一个问题:如果由于某种原因,你不能有一个静态数据进行测试设置,你将如何执行你不脆的方式集成测试?
非常感谢。是的,对于在正确的级别进行测试,您的观点是绝对正确的,而且我们不在这里测试hibernate或它的标准API。我试图说明,只是测试以某种方式创建标准将是徒劳的,正如您所说的,我们需要测试从标准到结构到数据库的整个链。这正是我所想的,你的评论对此很有帮助!干杯。 –