2014-01-16 4 views
5

Wie kann ich einen Komponententest für einen Chef-Provider schreiben?Unit testet einen Chef-Provider

Bisher verwendet unsere Einheitenteststrategie ChefSpec für Rezepte, und wir füllen die meisten interessanten Logik für unsere Anbieter in Bibliotheken aus, um die Logik testbarer zu machen. Wir stoßen jedoch immer noch auf Probleme, bei denen unsere Anbieter andere Ressourcen aufrufen (neben anderen einfachen logischen Problemen). Zum Beispiel:

action :run do 

    helper = Helper.new 
    template '/etc/hosts' do 
    source 'hosts.erb' 
    variables ({ 
       "host" => @new_resource.host, 
       "ip_address" => node['ipaddress'] 
      }) 
    only_if { helper.update_hosts } 
    end 

    service 'httpd' do 
     action :restart 
    end 
end 

(nicht echter Code ist, nur ein triviales Beispiel)

Was wir möchten, dass diese Anbieter tun testet in Isolation ist für logische Fehler zu überprüfen. ChefSpec hat die Möglichkeit, in einen LWRP zu treten, aber es sieht so aus, als würde uns dies dazu zwingen, den LWRP in ein Rezept zu bringen, und viele unserer Kochbücher sind im Grunde LWRP-Bibliotheken ohne Rezepte. Wir würden auch gerne eine saubere Trennung in unseren Tests beibehalten, daher ist es offensichtlich, welche Komponente fehlgeschlagen ist, wenn man sich den Dateinamen angesehen hat.

Außerdem wäre es nett, wenn der Test automatisch fehlschlagen würde, wenn Syntaxfehler in der LWRP-Definition vorliegen. Zum Beispiel:

action :run do 
    template '/etc/hosts/' do 
    source_whoops 'hosts.erb' 
    action :whoops 
    end 
end 

Es wäre wirklich schön, wenn die obige Aussage der Test aufgrund der Attributnamen scheitern würde dazu führen, falsch definiert wird, und der Aktionsname nicht vorhanden (wie ChefSpec).

Die einzige Lösung, die ich mir ausgedacht habe, ist im Grunde ein "Test Cookbook" zu erstellen - ein separates Kochbuch, das jeden LWRP 1: 1 mit einem einzigen Rezept definiert, damit ChefSpec auf diese Art und Weise eintreten kann. Es scheint eine vernünftige, aber weniger als ideale Lösung zu sein.

Antwort

6

Sieht aus wie es eine (sehr neue) Lösung zu diesem gibt.

Erstens, this pull request würde grundsätzlich tun, was ich frage, obwohl es von der ChefSpec Maintainer aus verständlichen Gründen abgelehnt wurde.

Der Betreuer schlägt vor, ein mycookbook_test-Muster zu verwenden - ein separates Kochbuch enthält alle Komponententests. Dies würde einen einfachen 1 Rezept-pro-Lwrp-Ansatz ermöglichen.

Darüber hinaus hält dieser Ansatz das Kochbuch von jeder Einheit Tests frei, die für die Verbraucher des Kochbuchs nett ist. Die Verbraucher möchten vielleicht ihre eigenen Komponententests durchführen, und es besteht keine Notwendigkeit (oder Wunsch), Tests an Kochbüchern von Drittanbietern durchzuführen.

+0

Ja. Das ist genau das, was ich gesagt habe :) – sethvargo