如何让我的规格运行得更快?

时间:2012-11-13 09:32:21

标签: ruby-on-rails ruby rspec

我有几个看起来如下的spec文件:

describe "My DSL" do

  before :each do
    @object = prepare_my_object
  end

  describe "foo" do

    before :each do
      @result = @object.read_my_dsl_and_store_stuff_in_database__this_is_expensive
    end

    it "should do this" do
      @result.should be_this
    end

    it "should not do that" do
      @result.should_not be_that
    end

    # ... several more tests about the state of @result
  end

  # ...
end

这些测试需要很长时间,主要是因为每次都会运行第二个before :each块。使用before :all代替并没有真正帮助,因为它在外部before :each之前被调用。将所有期望放在一个it块中会有所帮助,但这被认为是不好的风格。

让我的昂贵方法只执行一次的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

加速rspec的最快方法是完全解耦数据库。 DSL 问题与进入和退出db 问题的问题不同。如果您有两种方法同时执行这两种操作,是否可以将方法分解为多个部分?

理想情况下,您的DSL将在本地缓存,因此无论如何都不必在每次请求时从数据库中提取。它可以在内存中加载一次并在刷新之前保存在那里。

如果针对本地内存缓存运行并解除数据库,那么这会加快速度吗?如果是,那么db调用很慢。如果您的DSL已完全加载到内存中并且测试仍然很慢,那么问题就在于您自己的DSL。