【问题标题】:How do I manage stale database data in unit tests?如何在单元测试中管理陈旧的数据库数据?
【发布时间】:2011-10-08 03:38:09
【问题描述】:

我们目前通过针对数据库运行的测试来实践测试驱动开发。此数据库在开发人员机器上本地运行,但当架构或数据发生更改时,它们都会同步到主数据库。

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

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

我们可以使用什么样的策略来管理这个问题?

我们考虑过复制生产数据库,然后开始针对此编写任何新测试。不过,我可以看到问题会随着时间的推移反复出现,这会给我们的代码库增加混乱。

【问题讨论】:

    标签: tdd


    【解决方案1】:

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

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

    这不是我某一天决定做的事,然后就全部做了。我慢慢地修复了测试,因为我不得不处理它们——通常是因为它们因为你描述的那种问题而坏掉了。 “确保...”库也是逐步开发的——在需要之前什么都没有。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-31
        • 2022-11-28
        • 2020-06-20
        • 1970-01-01
        • 2012-08-28
        • 2011-01-10
        • 2017-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多