【发布时间】:2010-09-13 19:02:56
【问题描述】:
我使用许多由后端复杂程度不同的数据库驱动的 Web 应用程序。通常,有一个ORM 层与业务和表示逻辑分开。这使得对业务逻辑进行单元测试相当简单;事物可以在离散的模块中实现,测试所需的任何数据都可以通过对象模拟来伪造。
但是测试 ORM 和数据库本身总是充满问题和妥协。
多年来,我尝试了一些策略,但没有一个完全让我满意。
使用已知数据加载测试数据库。针对 ORM 运行测试并确认返回正确的数据。这里的缺点是您的测试数据库必须跟上应用程序数据库中的任何模式更改,并且可能会不同步。它还依赖于人工数据,并且可能不会暴露由于愚蠢的用户输入而发生的错误。最后,如果测试数据库很小,它不会像缺少索引那样显示效率低下。 (好吧,最后一个并不是真正应该用于单元测试的,但它并没有什么坏处。)
加载生产数据库的副本并对其进行测试。这里的问题是您可能不知道在任何给定时间生产数据库中有什么。如果数据随时间变化,您的测试可能需要重写。
有人指出,这两种策略都依赖于特定的数据,单元测试应该只测试功能。为此,我看到建议:
- 使用模拟数据库服务器,并仅检查 ORM 是否发送正确的查询以响应给定的方法调用。
您使用了哪些策略来测试数据库驱动的应用程序(如果有的话)?什么对你最有效?
【问题讨论】:
-
我认为你仍然应该在测试环境中为唯一索引之类的情况提供数据库索引。
-
我个人不介意这个问题,但如果我们按照规则,这个问题不是针对 stackoverflow 而是针对 softwareengineering.stackexchange i> 网站。
-
这个问题将 3 个不同的方面结合为一个问题。 1. 不同环境中的数据库同步(dev、qa、staging...) 2. 数据库性能测试 3. 单元测试 每个方面都有一些最佳实践。
标签: database unit-testing orm mocking