2015-05-01 23 views
1

我想用chefspec來測試我的配方的冪等性。如何用chefspec測試冪等性

比方說,我有一個食譜,包括這兩個資源語句:

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兩次,保持第一次運行狀態(我假設沒有,因爲該文件沒有真正創建)?或者我是否會被迫使用測試廚房和流浪漢來讓realz發生?

(注:我的實際食譜有構建配置文件的自定義LWRP它從一個廚師的服務器,這就是爲什麼我使用ServerRunner資訊)

+1

鑑於ChefSpec從未試圖收斂您的資源,我相當肯定您無法測試ChefSpec的冪等性。它基本上可以確保您使用正確的操作和屬性來聲明適當的資源,但並不真正測試這些資源是否正常工作。但我希望有人能證明我的錯誤。 –

+0

@TejayCardon,你說得對,我們無法在完全銜接的層面上測試冪等性(用chefspec)。不過,我至少希望能夠測試單個資源的不同起始條件。不幸的是,它看起來不現實。我想,我必須用測試廚房來測試它。 – Kief

回答

0

警告這是未經測試。

我假設你可以模擬::File.exist?在你的規範中用這個文件返回true。

allow_any_instance_of(File).to receive('exists?').with('/etc/app.config').and_return(true) 

根據file provider這是在提供程序中調用以獲取當前狀態的方法。

這將工作乾淨,像您在問題中描述的文件資源。

但是如果操作: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') 

之後你必須遵循的通知here

resource = chef_run.file('/etc/app.config') 
expect(resource).to_not notify('service[app]').to(:restart) 

ChefSpec文件據我所知,測試,廚房是考一拍運行,以確保食譜是correc噸,在同一測試中廚師運行的倍數不會被處理,您最終不得不決定您希望用於多次運行測試的內容。

關於基礎設施測試的主廚郵件列表上有關於此問題的討論,請參閱標記wiki鏈接到ML(談話不是最終答案,不適合SO)。

+0

Poke @Tejaycardon。你是對的,沒有收斂,它是嘲笑狀態來測試行爲的問題,但隨着時間的推移,這可能會出錯。 – Tensibai

+0

嘲笑File.exist?檢查不起作用。當與Chefspec一起運行時,文件提供者實際上並沒有調用它,這是合理的,因爲如果沒有收斂,文件不會被創建,所以會失敗。 – Kief

+0

@Kief這個想法是提供一個假的狀態,其中存在文件幷包含正確的內容(所以運行不應該更新資源)。你說得對,提供者總是混淆不清,你必須寫下[這個匹配器](https://github.com/sethvargo/chefspec/blob/ab7a07d60d6df446a3c2063b8825ea8c7bce51b6/lib/chefspec/matchers/render_file_matcher.rb#L107) – Tensibai

0

它看起來像不同的起始條件只能通過實際收斂實際測試。如果是這樣,我的問題的正確答案是使用像測試廚房和流浪,而不是ChefSpec。

0

test-kitchen1.18.0版本以來,我們爲chef_*置備程序(它是早期引入的但不是損壞的並且只在最新版本中修復的)的冪等檢查提供了工作支持。它沒有記錄,但你可以找到一些細節here

基本上,你可以做的是兩行添加到您的provisioner定義:

provisioner: 
    name: chef_zero 
    ... 
    enforce_idempotency: true # force idempotence check 
    multiple_converge: 2 # how many times to run your provisioners 
    ... 

這將運行你的食譜多次,檢查最後一次運行具有0更新的資源。它還爲您提供了第二次運行時更新的資源列表。