9

I am using Ruby on Rails 3.2.2, FactoryGirl 3.1.0, FactoryGirlRails 3.1.0, Rspec 2.9.0 and RspecRails 2.9.0. In order to test my application I have to create a lot of records (about 5000) in the database, but that operation is very slow (it takes more than 10 minutes to create records). I proceed like this:

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

How can I improve my spec code so to go faster?

Note: Maybe the slowness is given by (5) article callbacks that run before and after each article creation process, but I can skip those (since the only things I have to test are articles and not associated models) if those slow creation of records... is it possible to make that and is it the right way to proceed?

4

3 回答 3

2

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

于 2012-05-16T04:49:35.090 回答
0

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

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

于 2012-05-16T04:48:34.717 回答
0

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

也就是说,速度变慢的部分原因是#create在构建后将每条记录保存到数据库中。您可能想改用FactoryGirl.build;请参阅使用工厂

当然,您将用 I/O 密集型进程换取内存密集型进程。如果这不是您真正想要的,请考虑使用#build实例化足够的记录来执行每个单独的测试,或者使用针对批量加载优化的夹具文件。

于 2012-05-16T04:59:05.833 回答