在Rails中运行测试套件的速度

时间:2009-01-29 10:11:49

标签: ruby-on-rails testing

我的应用程序有357个测试(534个断言)(使用Shoulda)。整个测试套件运行大约80秒。这次好吗?我只是很好奇,因为这是我第一个广泛编写测试的应用程序之一。我的应用程序中没有华而不实的东西。

顺便说一下:我试图在内存中使用sqlite3数据库,但结果出乎意料地差了很多(大约83秒)。这里有线索吗?

我正在使用配备2GB RAM和2GHz Intel Core Duo处理器的Macbook作为我的开发机器。

7 个答案:

答案 0 :(得分:2)

我觉得这个问题不是特定于轨道的,所以我会插话。

关于测试的主要问题是,它应该足够快,以便你经常运行它们(就像在所有的时间一样)。此外,您可能希望将测试分成几个不同的集合,特别是“长时间运行测试”和“单元测试”等。

要考虑的最后一个选项是,如果您的数据库设置非常耗时,那就是通过从备份中恢复来创建域,而不是进行一大堆插入。

祝你好运!

答案 1 :(得分:2)

你应该尝试使用spork这个方法http://wiki.github.com/dchelimsky/rspec/spork-autospec-pure-bdd-joy来启动一些保持运行并批量测试的进程。我发现它很快。

答案 2 :(得分:1)

这实际上取决于您的测试正在做什么。测试代码可以有效地编写,也可以与其他代码完全相同的方式编写。

在许多情况下,一个明显的优化是编写测试代码,使得所有(或尽可能多)在内存中完成,而不是对数据库的许多读/写。但是,您可能必须更改应用程序代码才能使用正确的接口来实现此目的。

答案 3 :(得分:1)

大型测试套件可能需要一段时间才能运行。

我在开发时通常使用“autospec -f”,这只运行自上次运行以来已更改的规范 - 使测试运行更有效率。

当然,如果您真的很认真,那么您将运行Cruise Control之类的持续集成设置 - 这将自动化您的构建过程并在后台运行,检查您的最新建筑并运行该套件。

答案 4 :(得分:1)

如果您希望加快测试套件的运行时间,那么我将使用测试服务器,例如this one from Roman Le Négrate.

答案 5 :(得分:0)

与内存中的SQLite相反,您可以将MySQL数据库放在RAMDISK(在Windows上)或在Linux上的tmpfs上。

MySQL具有非常有效的缓冲,因此在经常更新大量数据之前,将数据库放入内存并没有多大帮助。

更重要的是每个测试的测试隔离和数据准备方法。

您可以使用交易固定装置。这意味着每个测试都将被包装到事务中,因此下一个测试将从初始点开始。

这比在每次测试之前清理数据库要快。

在某些情况下,您希望同时使用事务和显式数据擦除,这里有一篇很好的文章:http://www.3hv.co.uk/blog/2009/05/08/switching-off-transactions-for-a-single-spec-when-using-rspec/

答案 6 :(得分:0)

你可以尝试预装夹具,但是它会更难维护,而且,恕我直言,不值得它的速度改进(我认为最多20%,但这取决于)

众所周知,SQLite比mysql / pgsql慢,除了非常小的小型数据库

正如有人已经说过的,你可以将mysql(或其他数据库)数据文件放在某种RAMDisk上(我在linux上使用tmpfs)。

PS:我们现在有1319个Rspec示例,它在C2D-3Ghz-4GRam上运行了230秒,我认为这很好。所以,你的也很好。