数据库集成测试

时间:2008-09-14 23:25:02

标签: tdd integration-testing database-testing

当您使用数据访问层或大部分应用程序堆栈进行集成测试时。如果多个测试在同一个数据库上运行,那么阻止多个测试相互冲突的最佳方法是什么?

6 个答案:

答案 0 :(得分:10)

交易。

rails单元测试框架上的ruby是什么:

Load all fixture data.

For each test:

  BEGIN TRANSACTION

    # Yield control to user code

  ROLLBACK TRANSACTION

End for each

这意味着

  1. 测试对数据库所做的任何更改都不会影响正在进行的其他线程
  2. 下一个测试的数据不会被先前的测试污染
  3. 这比为每次测试手动重新加载数据快了几十万倍。
  4. 我认为这很酷

答案 1 :(得分:9)

对于简单的数据库应用程序,我发现使用SQLite非常宝贵。它允许您为每个测试拥有一个独特的独立数据库。

然而,只有在使用简单的通用SQL功能或者可以轻松隐藏SQLite和类后面的生产数据库系统之间的细微差别时,它才有效,但我总是发现在SQL应用程序中相当容易我已经开发了。

答案 2 :(得分:1)

为了添加Free Wildebeest的答案,我还使用HSQLDB进行了类似的类型测试,其中每个测试都获得了一个干净的DB实例。

答案 3 :(得分:0)

我想接受免费牛羚和猎户座爱德华兹的答案,但它不会让我。我想这样做的原因是我得出的结论是,这是实现它的两种主要方式,但选择哪一种取决于具体情况(主要是数据库的大小)。

答案 4 :(得分:0)

同时在不同时间运行测试,这样它们不会影响彼此的性能或有效性。

答案 5 :(得分:0)

虽然在这里的其中一个答案中没有像Rails单元测试框架那样聪明,但是为每个测试或一组测试创建不同的数据是另一种方法。此解决方案的繁琐程度取决于您拥有的测试用例的数量以及它们彼此之间的依赖程度。如果每个测试或一组依赖测试都有一个数据库,那么繁琐将成立。

运行测试套件时,您可以在开始时加载数据,运行测试套件,卸载/比较结果,确保实际结果符合预期结果。如果没有,再次循环。加载,运行套件,卸载/比较。