Усвоив идею тестирования на Testinfra и переориентировав ее для проверки системы, можно добиться очень многого. Автоматизация запуска тестов в ходе разработки приложений или даже написания и выполнения тестов для существующей инфраструктуры - два прекрасных способа упростить рутинные операции, которые могут вызвать ошибки. Рytest и Testinfra - отличные проекты, начать использовать их очень просто, к тому же при необходимости они легко расширяются. Самое естественное начало разработки проверочных тестов - во время создания самой инфраструктуры. Любое усовершенствование требует нового теста.
Сегодня погоняем пару теcтов через Testinfra.
Вам понадобится установить web-сервер и запустить его на порту 80 для выдачи статической стартовой страницы. По мере достижения прогресса мы будем добавлять новые тесты. Неотъемлемой составляющей написания тестов является осознание сбоев, так что смоделируем несколько проблем, на примере которых будем разбираться, что нужно исправить.
На свежем сервере Ubuntu начните с установки пакета Nginx:
$apt install nginx
Создайте новый файл теста test_webserver.py, в который мы будем постепенно
добавлять тесты:
def test_nginx_is_installed(host):
assert host.package('nginx').is_installed
Сделаем вывод pytest лаконичнее с помощью флага -q, чтобы сосредоточить свое внимание на сбоях. Удаленный сервер называется node4, для подключения к нему используется SSH. Вот команда для запуска первого теста:
(validate) $ pytest -q --hosts='ssh://node4' test_webserver.py
1 passed in 1.44 seconds
Отлично! Необходимо, чтобы веб-сервер был запущен и работал, так что добавляем новый тест для проверки этого поведения:
def test_nginx_is_running(host):
assert host.service('nginx').is_running
Повторный запуск теста, казалось бы, должен опять пройти успешно:
(validate) $ pytest -q --hosts='ssh://node4' test_webserver.py
.F
= FAILURES ===================================
_____________________ test_nginx_is_running[ssh://node4] ______________________
host = <testinfra.host.Host object at 0x7f629bf1d668>
def test_nginx_is_running(host):
> assert host.service('nginx').is_running
E AssertionError: assert False
E + where False = <service nginx>.is_running
E + where <service nginx> = <class 'SystemdService'>('nginx')
test_webserver.py:7: AssertionError
1 failed, 1 passed in 2.45 seconds