我有2个spec文件使用不同的docker镜像,因此假设启动单独的和不同的docker容器来运行示例。
在下面的片段中,我使用serverspecgem来测试我的容器
规格/ dockerfile / ember_spec.rb
require 'spec_helper'
require 'shared_examples/release'
describe 'ember' do
before(:all) do
@image = Docker::Image.build_from_dir(image_path('ember'))
set :os, family: :alpine
set :backend, :docker
set :docker_image, @image.id
set :docker_container_create_options, { 'Entrypoint' => ['/bin/sh'] }
end
describe command('ember version') do
its(:stdout) { should contain 'ember-cli: 3.3.0' }
its(:stdout) { should contain 'node: 10.10.0' }
end
include_examples 'os release', 'Alpine Linux'
end
规格/ dockerfile / gerbv_spec.rb
require 'spec_helper'
require 'shared_examples/release'
describe 'gerbv' do
before(:all) do
@image = Docker::Image.build_from_dir(image_path('gerbv'))
set :os, family: :debian
set :backend, :docker
set :docker_image, @image.id
set :docker_container_create_options, { 'Entrypoint' => ['/bin/sh'] }
end
describe package('gerbv') do
it { should be_installed }
end
include_examples 'os release', 'Ubuntu 18.04'
end
但是在运行bundle exec rspec时很明显,正在使用相同的容器来运行每个spec文件。我已经通过在每个示例之前打印出正在运行的容器来确认这一点。这当然导致其中一个文件的规格失败(以第二个为准)。
当文件独立运行时,bundle exec rspec path/to/file所有规格都通过。
在一个文件中的示例运行并为另一组示例创建新容器之后,有没有办法强制将容器缩小?
我找到了一种方法来解决这个问题,尽管这个问题非常糟糕。这个问题的关键在于容器最终是如何释放的。当不再有任何引用指向Docker实例时,它将被垃圾收集并且容器被杀死并被删除。但是,对象实例作为基类中的单例保存在类级变量中。在我看来,“重置”specinfra的唯一方法是调用clear在Docker类上继承的方法。
最后,以下解决了问题,正在使用正确的类来运行每个规范。
after(:all) {
Specinfra.backend.class.clear
}
很高兴知道有一种更好的方法来访问这些方法,而不必依赖于未通过serverspecgem 公开的方法。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。