Модульное тестирование поставщика Chef

Как написать модульный тест для поставщика Chef?

На данный момент наша стратегия модульного тестирования использует ChefSpec для рецептов, и мы вкладываем большую часть интересной логики для наших поставщиков. в библиотеках, чтобы сделать логику более проверяемой. Однако мы по-прежнему сталкиваемся с проблемами, когда наши провайдеры вызывают другие ресурсы (помимо других простых логических проблем). Например:

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

(это не настоящий код, просто тривиальный пример)

Что мы хотели бы сделать, так это протестировать этот провайдер изолированно, чтобы проверить наличие логических ошибок. У ChefSpec есть возможность входить в LWRP, но похоже, что это заставит нас включить LWRP в рецепт, а многие из наших поваренных книг в основном представляют собой LWRP-библиотеки без рецептов. Мы также просто хотели бы сохранить четкое разделение в наших тестах, чтобы было очевидно, какой компонент вышел из строя, глядя на имя файла.

Кроме того, было бы неплохо, если бы тест автоматически завершался ошибкой при наличии синтаксических ошибок в определении LWRP. Например:

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

Было бы очень хорошо, если бы приведенный выше оператор привел к сбою теста из-за неправильного определения имени атрибута и отсутствия имени действия (точно так же, как ChefSpec).

Единственное решение, которое я придумал, — это создать «тестовую кулинарную книгу» — отдельную кулинарную книгу, которая определяет каждый LWRP 1:1 с помощью одного рецепта, чтобы ChefSpec мог вмешаться в нее таким образом. Это кажется разумным, но далеко не идеальным решением.


person user949286    schedule 16.01.2014    source источник


Ответы (1)


Похоже, есть (очень недавнее) решение этой проблемы.

Во-первых, этот запрос на вытягивание в основном сделает то, что я прошу, хотя он был отклонен сопровождающим ChefSpec из-за понятные причины.

Мейнтейнер предлагает использовать паттерн mycookbook_test — в отдельной поваренной книге хранятся все модульные тесты. Это позволило бы использовать простой подход 1 рецепт на lwrp.

Кроме того, этот подход избавляет кулинарную книгу от каких-либо модульных тестов, что удобно для потребителей кулинарной книги. Потребители могут захотеть запустить свои собственные модульные тесты, и нет необходимости (или желания) запускать тесты на сторонних кулинарных книгах.

person user949286    schedule 18.01.2014
comment
Да. Я именно это и сказал :) - person sethvargo; 19.01.2014