【发布时间】:2010-09-08 20:52:50
【问题描述】:
当您仅使用数据访问层或大部分应用程序堆栈进行集成测试时。如果多个测试在同一个数据库上运行,那么防止多个测试相互冲突的最佳方法是什么?
【问题讨论】:
标签: tdd integration-testing database-testing
当您仅使用数据访问层或大部分应用程序堆栈进行集成测试时。如果多个测试在同一个数据库上运行,那么防止多个测试相互冲突的最佳方法是什么?
【问题讨论】:
标签: tdd integration-testing database-testing
交易。
ruby on rails 单元测试框架的作用是这样的:
Load all fixture data.
For each test:
BEGIN TRANSACTION
# Yield control to user code
ROLLBACK TRANSACTION
End for each
这意味着
我个人认为这很酷
【讨论】:
对于简单的数据库应用程序,我发现使用SQLite 非常宝贵。它允许您为每个测试拥有一个独特且独立的数据库。
但是,它仅在您使用简单的通用 SQL 功能或可以轻松地将 SQLite 和您的生产数据库系统之间的细微差别隐藏在一个类后面时才有效,但我一直发现这在 SQL 应用程序中相当容易我已经开发了。
【讨论】:
只是为了添加到 Free Wildebeest 的答案,我还使用 HSQLDB 进行了类似的类型测试,其中每个测试都获得了一个干净的数据库实例。
【讨论】:
我想同时接受 Free Wildebeest 和 Orion Edwards 的答案,但它不会让我接受。我想这样做的原因是我得出的结论是,这是两种主要的方法,但选择哪一种取决于具体情况(主要是数据库的大小)。
【讨论】:
还要在不同的时间运行测试,这样它们就不会影响彼此的性能或有效性。
【讨论】:
虽然在此处的其他答案之一中不如 Rails 单元测试框架聪明,但为每个测试或测试组创建不同的数据是另一种方法。这种解决方案的乏味程度取决于您拥有的测试用例的数量以及它们之间的依赖程度。如果每个测试或一组依赖测试都有一个数据库,那么乏味将继续存在。
运行测试套件时,您在开始时加载数据,运行测试套件,卸载/比较结果以确保实际结果符合预期结果。如果没有,请再次执行此循环。加载、运行套件、卸载/比较。
【讨论】: