我想使用头孢like测试我的食谱的幂性。
假设我有一个包含这两个资源语句的菜谱:
file '/etc/app.config' do
action :create
notifies :restart, "service[app]"
end
service 'app' do
action :enable
end我如何编写一个chefspec示例来证明,如果文件/etc/app.config已经存在,那么app服务将通知而不是重新启动?
我是否可以这样做:“文件”资源认为文件已经存在了吗?我是否可以运行ChefSpec::ServerRunner两次,使状态从第一次运行(我认为不会,因为文件不会被真正创建)?或者我会被迫使用测试厨房和瓦格兰特来实现现实?
(注意:我的实际食谱有一个自定义LWRP,用于构建配置文件。它从厨师服务器获取信息,这就是我使用ServerRunner的原因)
发布于 2017-09-29 08:39:09
test-kitchen,因为1.18.0版本对chef_*提供程序的幂等性检查提供了工作支持(它是早些时候引入的,但比坏版要早,而且只在最新版本中修复)。它没有文档化,但您可以找到一些细节这里。
基本上,您可以做的是将这两行添加到provisioner定义中:
provisioner:
name: chef_zero
...
enforce_idempotency: true # force idempotence check
multiple_converge: 2 # how many times to run your provisioners
...这将多次运行您的食谱,并检查最后一次运行是否有0更新的资源。它还为您提供了在第二次运行时更新的资源列表。
发布于 2015-05-04 08:20:39
警告这是未经测试的。
我假设您可以模拟::File.exist?,以便在您的规范中为这个文件返回true。
allow_any_instance_of(File).to receive('exists?').with('/etc/app.config').and_return(true)根据文件提供程序,这是在提供程序中调用的获取当前状态的方法。
对于像您在问题中描述的文件资源,这将非常有效。
但是,如果操作是:create,并且资源是用checksum属性或content属性定义的,则必须设法模拟文件的内容或校验和,如下所示
allow_any_instance_of(Chef::Digester).to receive('generate_checksum').with('/etc/app.config').and_return('The checksum of the file, do a sha256sum on your file to get this')在此之后,您将不得不遵循关于通知的ChefSpec文档,这里
resource = chef_run.file('/etc/app.config')
expect(resource).to_not notify('service[app]').to(:restart)据我所知,test的目标是测试一次运行,以确保食谱是正确的,在同一个测试中运行的倍数厨师没有被处理,最终您不得不决定您希望使用什么来进行多次运行测试。
大厨邮件列表中有关于基础设施测试的讨论,请参阅标记wiki获取到ML的链接(对话不是最终的答案,也不适合于此)。
发布于 2015-05-05 10:27:06
看起来,不同的启动条件只能通过实际的收敛来进行实际测试。如果是这样的话,我的问题的正确答案是使用类似于测试厨房和Vagrant之类的方法,而不是使用ChefSpec。
https://stackoverflow.com/questions/29985855
复制相似问题