1

我正在关注这个基本教程,似乎这些测试应该在最多 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)

8 个示例,0 次失败

4

3 回答 3

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
    

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

于 2016-10-11T20:46:38.700 回答
1

您没有共享代码,但最有可能的是您没有任何用于 chef run 的缓存机制。

基本上这段代码:

let(:chef_run) do
  runner = ChefSpec::ServerRunner.new
  runner.converge(described_recipe)
end

需要在每个规格中融合机器,这很慢。如果您有更复杂的规范规则(例如在整个测试套件中缓存不同的属性和服务),您可以考虑使用内置机制来缓存chef_run结果或构建自己的解决方案。

另一部分解决方案是并行划分和执行规范。您可以使用parallel_tests gem来实现它。

于 2016-10-11T14:07:59.920 回答
0

如果您的存储库中有大型目录或文件(如.gitvendor/bundle,请参阅du -chs *完整列表),这可能会影响运行:chefspec 将所有这些文件上传到本地临时 Chef 服务器。

添加这些以chefignore避免上传它们。

这可能与您的情况没有直接关系,但我刚刚遇到了一个类似的问题(在 CI 服务器上运行 40分钟,而在我的笔记本电脑上运行不到 10 秒),所以我觉得如果有人也遇到这个问题,我应该离开解决方案。

于 2017-06-28T14:52:55.443 回答