我为我的应用程序编写了357个测试(534个断言)(使用Shoulda)。整个测试套件运行时间大约为80秒。这个时间可以接受吗?我只是好奇,因为这是我写测试非常广泛的第一个应用程序之一。我的应用程序中没有花哨的东西。
顺便说一下:我尝试使用内存sqlite3数据库,但结果出乎意料地糟糕(约83秒)。有什么线索吗?
我使用Macbook作为我的开发工具,它有2GB内存和2GHz的英特尔双核处理器。
我为我的应用程序编写了357个测试(534个断言)(使用Shoulda)。整个测试套件运行时间大约为80秒。这个时间可以接受吗?我只是好奇,因为这是我写测试非常广泛的第一个应用程序之一。我的应用程序中没有花哨的东西。
顺便说一下:我尝试使用内存sqlite3数据库,但结果出乎意料地糟糕(约83秒)。有什么线索吗?
我使用Macbook作为我的开发工具,它有2GB内存和2GHz的英特尔双核处理器。
我觉得这个问题并不特别与Rails有关,所以我想插嘴一下。
关于测试的主要问题是它应该足够快,方便您经常运行它们(即一直持续)。此外,您可能希望将测试分成几个不同的集合,特别是像长时间运行的测试和单元测试这样的事情。
最后一个需要考虑的选项是,如果您的数据库设置非常耗时,可以通过从备份中恢复来创建您的域,而不是进行大量的插入。
祝你好运!
你应该尝试使用 spork 这种方法https://github.com/dchelimsky/rspec/wiki/spork---autospec-==-pure-bdd-joy-,它可以启动几个进程保持运行状态并批量执行你的测试。我发现这样的速度很快。
这实际上取决于您的测试在做什么。测试代码可以像任何其他代码一样高效编写或不高效编写。
在许多情况下明显的优化是,将测试代码编写成这样一种方式,即尽可能多地将所有内容(或大多数内容)存储在内存中,而不是对数据库进行多次读/写。但是,您可能需要更改应用程序代码以获得正确的接口来实现这一点。
大型测试套件可能需要一些时间来运行。
我通常在开发时使用"autospec -f",这样只运行自上次运行以来发生变化的规格测试——使得保持测试运行更加高效。
当然,如果你非常认真的话,你会运行类似于Cruise Control的持续集成设置——这将自动化你的构建过程,并在后台运行,检查你最新的构建并运行测试套件。
如果您想加快测试套件的运行时间,我建议使用测试服务器,例如Roman Le Négrate的这个测试服务器。
你可以尝试使用预装夹具进行实验,但它会更加难以维护,并且在我看来,这并不值得它的速度提高(我认为最多只有20%,但它取决于情况)。
众所周知,SQLite 在除了非常小的数据库之外比 mysql/pgsql 慢。
就像有人已经说过的那样,您可以将 MySQL(或其他DB)数据文件放置在某种类型的RAMDisk上(我在Linux上使用tmpfs)。
PS:我们现在有1319个Rspec示例,它在C2D-3Ghz-4GRam上运行了230秒,我认为它很好。所以,你的也很好。
与内存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/