ChefSpec运行速度超慢

Chr*_*sco 1 ruby chef-infra chefspec

我正在遵循这个基本教程,似乎这些测试应该在最多2秒内运行,但是我在5次测试中得到41秒.

我用ChefSpec运行--profile,这就是结果

Top 8 slowest examples (41.17 seconds, 99.8% of total time):
  webserver_test::default When run on CentOS 7.2.1511 installs httpd
5.21 seconds ./spec/unit/recipes/default_spec.rb:20
  webserver_test::default When run on Ubuntu 14.04 converges successfully
5.17 seconds ./spec/unit/recipes/default_spec.rb:39
  webserver_test::default When run on CentOS 7.2.1511 enables the httpd service
5.16 seconds ./spec/unit/recipes/default_spec.rb:24
  webserver_test::default When run on Ubuntu 14.04 starts the apache2 service
5.15 seconds ./spec/unit/recipes/default_spec.rb:51
  webserver_test::default When run on CentOS 7.2.1511 converges successfully
5.15 seconds ./spec/unit/recipes/default_spec.rb:16
  webserver_test::default When run on Ubuntu 14.04 installs apache2
5.13 seconds ./spec/unit/recipes/default_spec.rb:43
  webserver_test::default When run on CentOS 7.2.1511 starts the httpd service
5.11 seconds ./spec/unit/recipes/default_spec.rb:28
  webserver_test::default When run on Ubuntu 14.04 enables apache2 service
5.1 seconds ./spec/unit/recipes/default_spec.rb:47

Finished in 41.26 seconds (files took 6.58 seconds to load)
Run Code Online (Sandbox Code Playgroud)

8个例子,0个失败

cod*_*ger 6

有几个问题:

  1. Berkshelf集成增加了相当高的固定开销(即,无论您有多少规格,它只需要一些时间,但只需要一次.
  2. ServerRunner比SoloRunner单边慢.你应该几乎总是使用SoloRunner.在这方面,Chef教程是错误的.
  3. 正如@smefju所提到的,缓存可以提供帮助,尽管组合多个规范通常更容易:

    it "does httpd stuff" do
       expect(chef_run).to enable_service 'httpd'
       expect(chef_run).to start_service 'httpd'
    end
    
    Run Code Online (Sandbox Code Playgroud)

    这将仅运行一次收敛并将其用于两个检查,而不是像教程中那样将它们作为两个单独的示例.您可以在一个示例中放置任意数量的断言,只需了解您将提高速度但减少测试隔离.在这种情况下,可能值得.