我跟随this basic tutorial并且似乎这些测试应该在最多2秒内运行,但是我在5次测试中获得 41秒。
我用--profile
运行了ChefSpec,结果是
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)
8个例子,0个失败
答案 0 :(得分:6)
有几个问题:
正如@smefju所提到的,缓存可以提供帮助,但通常只是更容易组合多个规范:
it "does httpd stuff" do
expect(chef_run).to enable_service 'httpd'
expect(chef_run).to start_service 'httpd'
end
这只会运行一次收敛并将其用于两个检查,而不是像教程中那样将它们作为两个单独的示例。您可以在一个示例中放置任意数量的断言,只需了解您将提高速度但减少测试隔离。在这种情况下,可能值得。
答案 1 :(得分:1)
您没有共享代码,但最有可能的是您没有任何缓存机制用于自行车运行。
基本上这段代码:
let(:chef_run) do
runner = ChefSpec::ServerRunner.new
runner.converge(described_recipe)
end
需要在每个规范中收敛机器,这很慢。如果您有更复杂的规范规则(例如,在整个测试套件中缓存不同的属性和服务),您可以考虑使用built-in mechanism for caching chef_run
result或构建自己的解决方案。
另一部分解决方案是并行划分和执行规范。您可以使用parallel_tests gem来实现它。
答案 2 :(得分:0)
如果您的仓库中有大型目录或文件(例如.git
或vendor/bundle
,请参阅du -chs *
获取完整列表),这可能会影响运行:chefspec uploads all 将它们发送到本地临时Chef服务器。
将这些内容添加到chefignore
以避免上传。
这可能与你的情况没有直接关系,但我刚刚遇到类似的问题(在CI服务器上运行40 分钟,而在我的笔记本电脑上运行不到10秒)所以我觉得我应该离开解决方案,如果有人遇到这个。