数据库集成测试

时间:2020-03-05 18:53:06  来源:igfitidea点击:

当我们仅使用数据访问层或者大多数应用程序堆栈进行集成测试时。如果多个测试在同一数据库上运行,最好的方法是防止它们相互冲突?

解决方案

回答

对于简单的数据库应用程序,我发现使用SQLite很有用。它使我们可以为每个测试拥有唯一的独立数据库。

但是,仅当我们使用简单的通用SQL功能或者可以轻松地将SQLite和生产数据库系统之间的细微差别隐藏在类后面时,它才起作用,但是我一直发现,在SQL应用程序中,这相当容易发达。

回答

交易。

ruby on rails单元测试框架的作用是这样的:

Load all fixture data.

For each test:

  BEGIN TRANSACTION

    # Yield control to user code

  ROLLBACK TRANSACTION

End for each

这意味着

  • 测试对数据库所做的任何更改都不会影响正在运行的其他线程
  • 下一个测试的数据不会被先前的测试污染
  • 这比为每个测试手动重新加载数据快大约十亿倍。

我一个人认为这很酷

回答

我想同时接受自由牛羚和猎户座爱德华兹的回答,但我拒绝了。我之所以要这样做,是因为我得出的结论是,这是完成此操作的两种主要方法,但是选择哪种方法取决于具体情况(主要是数据库的大小)。

回答

还应在不同的时间运行测试,以免影响彼此的性能或者有效性。

回答

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

回答

尽管在其他答案之一中不如Rails单元测试框架那么聪明,但是为每个测试或者一组测试创建不同的数据是另一种方法。此解决方案的乏味程度取决于我们拥有的测试用例的数量以及它们之间的依赖性。如果每个测试或者一组相关测试有一个数据库,那么繁琐的工作将适用。

运行测试套件时,我们首先要加载数据,运行测试套件,然后卸载/比较结果,以确保实际结果符合预期结果。如果没有,请重新执行该循环。加载,运行套件,卸载/比较。