tap
ansible-tap
Производитель Test Anything Protocol (TAP) для Ansible.
Этот плагин обратного вызова позволяет вам писать тестовые наборы TAP в виде плейбуков Ansible. Считайте это альтернативой только для Ansible к Serverspec и Testinfra.
Требования
- Ansible 2
- Python 2.7+
Установка
Хотя вы не можете установить этот плагин напрямую с помощью ansible-galaxy
, вы можете использовать ansible-galaxy
для его загрузки:
ansible-galaxy install -p roles/ benwebber.tap
Перейдите в каталог роли и выполните make install
:
cd roles/benwebber.tap
make install
Это скопирует плагин в ~/.ansible/plugins/callback
.
Использование
Настройте Ansible для использования этого плагина в качестве стандартного обратного вызова:
ANSIBLE_STDOUT_CALLBACK=tap ansible-playbook -i hosts test.yml -l hostname
Вы также можете задать его как стандартный обратный вызов в ansible.cfg
:
[defaults]
stdout_callback=tap
Написание тестов Ansible
По умолчанию Ansible прерывает выполнение плейбука, если какая-либо задача не выполнена. Установите ignore_errors: true
для всех тестов, чтобы отключить это поведение:
- name: проверить, запущена ли служба
command: systemctl is-active service
register: is_active
tags: diagnostic
- name: подтвердить, что служба запущена
assert:
that: is_active.rc == 0
ignore_errors: true
Это обеспечит выполнение всего тестового набора, кроме неожиданных сбоев.
Если у вас много тестов, вы можете установить ignore_errors: true
для block
:
- name: проверить, запущена ли служба
command: systemctl is-active service
register: is_active
tags: diagnostic
- name: проверить, включена ли служба
command: systemctl is-enabled service
register: is_enabled
tags: diagnostic
- ignore_errors: true
block:
- name: подтвердить, что служба запущена
assert:
that: is_active.rc == 0
- name: подтвердить, что служба включена
assert:
that: is_enabled.rc == 0
Если задача не выполнится, плагин выведет информацию об устранении неисправностей в виде встроенного YAML-документа:
not ok - assert: подтвердить, что переменная установлена
---
_ansible_no_log: false
_ansible_verbose_always: true
assertion: статус определен
changed: false
evaluated_to: false
failed: true
invocation:
module_args:
that: статус определен
module_name: assert
...
Исключение задач из потока TAP
Часто результат теста будет зависеть от предыдущих задач. Вы, конечно, захотите исключить эти подготовительные задачи из потока TAP.
Чтобы сделать это, просто пометьте подготовительные задачи тегом diagnostic
:
- name: подготовить следующий тест
command: 'true'
register: true_
tags: diagnostic
- name: должен всегда проходить
assert:
that: true_.rc == 0
ignore_errors: true
Плагин обратного вызова выведет диагностические строки вместо тестовых строк:
# command: подготовить следующий тест
ok - assert: должен всегда проходить
В отличие от отдельных тестов, вы, вероятно, не хотите игнорировать ошибки для этого типа задачи. Ошибки будут представлять собой ошибку в тестовом наборе, а не сбой теста.
Ожидаемые сбои и неожиданные успехи
TAP поддерживает директиву TODO
, чтобы игнорировать тесты для функций, которые еще не были реализованы.
Если тест, отмеченный TODO
, не проходит, потребители TAP будут считать это ожидаемым сбоем. Точно так же, если тест, отмеченный TODO
, проходит, потребители TAP будут считать это неожиданным успехом.
Помечайте ожидаемые сбои тегом TODO
:
- name: ожидаемый сбой
assert:
that: false
ignore_errors: true
tags: TODO
Это выведет директиву # TODO
в потоке TAP:
not ok - assert: ожидаемый сбой # TODO
Если тест проходит, вы получите вывод неожиданного успеха:
ok - assert: ожидаемый сбой # TODO
Пропуск тестов
TAP также поддерживает директиву SKIP
, чтобы игнорировать конкретные тесты.
Этот обратный вызов использует оператор when
Ansible для управления пропущенными тестами:
- name: это пропущенная задача
assert:
that: false
ignore_errors: true
when: false
Причина пропуска теста появится в строке теста:
ok - assert: пропущено # SKIP Условная проверка не прошла
Пример
Директория tests/
содержит пример тестового набора, который выдает все возможные результаты тестов.
После установки плагина запустите тестовый набор с помощью:
ANSIBLE_STDOUT_CALLBACK=tap ansible-playbook -i localhost, -c local tests/playbooks/test_multiple_with_failures.yml
Вы получите следующий поток TAP. Вы можете передать это любому потребителю TAP.
TAP version 13
# command: подготовить следующий тест
ok - assert: проход
not ok - assert: сбой
---
_ansible_no_log: false
_ansible_verbose_always: true
assertion: false
changed: false
evaluated_to: false
failed: true
invocation:
module_args:
that: false
module_name: assert
...
not ok - assert: ожидаемый сбой # TODO
ok - assert: неожиданный проход # TODO
ok - assert: пропущено # SKIP Условная проверка не прошла
1..5
Замечания
В данный момент этот плагин поддерживает запуск тестов только на одном хосте одновременно. Спецификация TAP не описывает способ объединения нескольких потоков вывода.
Лицензия
MIT
Test Anything Protocol (TAP) producer callback plugin
ansible-galaxy install benwebber/ansible-tap