如何为我的rspec测试加速创建5,000条记录?

时间:2012-05-16 04:24:48

标签: ruby-on-rails ruby ruby-on-rails-3 testing rspec

我正在使用Ruby on Rails 3.2.2,FactoryGirl 3.1.0,FactoryGirlRails 3.1.0,Rspec 2.9.0和RspecRails 2.9.0。为了测试我的应用程序,我必须在数据库中创建大量记录(大约5000个),但该操作非常慢(创建记录需要10分钟以上)。我这样做:

before(:each) do
  5000.times do
    FactoryGirl.create(:article,)
  end
end

如何改进规范代码以便更快?

注意:也许在每篇文章创建过程之前和之后运行的文章回调都会给出缓慢,但我可以跳过这些(因为我必须测试的唯一内容是文章和没有关联的模型)如果那些记录的创建缓慢......是否可以做到这一点并且是否是正确的方法?

3 个答案:

答案 0 :(得分:2)

当你开始处理大量这样的记录时,最好直接在sql中进行,以避免你不需要的ActiveRecord开销。
我希望编写一个脚本或创建一个存储过程来执行此操作取决于您的sql实现。它很可能会在几秒钟内完成。

答案 1 :(得分:0)

我不是测试专家,但我认为FactoryGirl不应该有这个用途。应该只创建一些记录。

想想你是否真的需要这么多的测试记录,如果你这样做,他们是否必须在每次测试前“重置”? (是的,您在每次测试之前创建它们,因此您实际上创建了5000 * number_of_tests记录)。是不是原始sql脚本的选择?因此,当您的测试数据库被创建时,所有这些记录也会被创建。

答案 2 :(得分:0)

正如其他人所说,工厂不应该是高产量的。为什么任何合理的单元测试需要5,000条记录?

也就是说,减速的部分原因是 #create 会在构建完成后将每条记录保存到数据库中。您可能想要使用 FactoryGirl.build ;见Using Factories

当然,您将要为内存绑定进程交易I / O绑定进程。如果这不是您真正想要的,请考虑使用 #build 来实例化足够的记录来执行每个单独的测试,或使用针对批量加载优化的fixture file