如何在单元测试中管理过时的数据库数据?

时间:2011-07-19 01:20:42

标签: tdd

我们目前正在使用针对数据库运行的测试来练习测试驱动开发。此数据库在开发人员计算机上本地运行,但在架构或数据更改时,它们都会同步到主数据库。

这已持续了几年,现在我们发现随着新功能添加到产品中,数据变得非常陈旧。

通过GUI将数据添加到测试数据库已变得“不可能”,因为简单的更改可能会破坏数百个测试 - 我们在编写不那么脆弱的测试方面做得更好,但是马现在已经疯狂了。

我们可以使用哪种策略来管理此问题?

我们考虑过复制一个生产数据库,然后开始编写任何新的测试。我可以看到问题在一段时间内反复出现,这会增加我们代码库的混乱。

2 个答案:

答案 0 :(得分:1)

我个人不认为需要外部资源的测试(例如数据库,jms队列,其他服务等)是单元测试。我将它们称为“集成测试”。

话虽如此,有时需要围绕一个OR层构建一套单元测试。当数据库包含表示不同方案的数据时,您可能希望测试代码的行为方式,其中一些方案可能在开发数据库中不易获得。我发现最有用的是让我的单元测试构建一个内存数据库(例如使用H2)并使用不同测试所需的不同数据集加载它。使用Hibernate这很容易,您可以根据关系映射文件创建模式。然后,您只需在其中插入测试用例所需的数据。这很好,因为:

  1. 数据在内存中创建,因此不会影响使用数据库的其他任何人。
  2. 不期望任何外部资源可用(例如,如果数据库不可用,您的单元测试会失败,因为正在运行它的开发人员休假一天吗?可能不会!)
  3. 我可以在一个数据库中测试可能不会同时共存的不同数据场景。

答案 1 :(得分:0)

我不确定这对你是否有用......当我遇到这个时,我开发了一个“确保......”的库。 检查数据库中特定对象状态的方法,如果不是,则强制它处于该状态。每个测试都负责设置“确保”所需的一切都在那里。

此外,每个测试都没有检查一些全局方面,因为它们需要很长时间而且不会被测试修改 - 它们通常是在自动套件运行开始时设置的,并且通常不用于单独的测试运行。如果单个测试因为看起来可能属于此设置的问题而中断,我只需手动运行。

这不是我有一天决定做的事,而是做了一切。我慢慢地修复了测试,因为我不得不对它们进行处理 - 通常是因为它们因为你所描述的那种问题而破坏了。 “确保...”库也是逐步开发的 - 在需要之前没有任何内容。

希望这有帮助!