Короткий ответ
Для Ansible-ролей используется Molecule: она поднимает временное окружение (контейнер/VM), прогоняет роль, затем прогоняет её повторно для проверки идемпотентности (idempotence сценарий ожидает changed=0 на втором прогоне) и может выполнять verifier-тесты (например, Testinfra/Ansible assert) для проверки итогового состояния; для Terraform — встроенный terraform test (с файлами .tftest.hcl, доступен с версии 1.6) или внешний Terratest на Go позволяют реально применить модуль в тестовом окружении (или sandbox-аккаунте), проверить атрибуты созданных ресурсов и корректно уничтожить их после теста.
Как это работает подробнее
Molecule оборачивает полный цикл create -> converge -> idempotence -> verify -> destroy, запуская роль Ansible против эфемерного драйвера (чаще всего Docker), что даёт быструю обратную связь без необходимости реальных облачных ресурсов; terraform test/Terratest, напротив, обычно выполняют реальные apply/destroy против тестового облачного окружения, потому что поведение провайдера нельзя полностью эмулировать локально, поэтому такие тесты дороже и медленнее и обычно запускаются не на каждый commit, а на PR в основную ветку или по расписанию.
Пример кода
# molecule/default/molecule.yml (фрагмент)
driver:
name: docker
scenario:
test_sequence:
- create
- converge
- idempotance
- verify
- destroy
# tests/vm.tftest.hcl
run "creates_instance_with_tag" {
command = apply
assert {
condition = aws_instance.app.tags["Environment"] == "test"
error_message = "Тег Environment не установлен"
}
}Что использовать на практике
- Практика. практичная пирамида для такого репозитория: быстрые статические проверки (
terraform fmt/validate,ansible-lint,tflint) на каждый push; Molecule-сценарии для ролей на PR; Terraform-тесты с реальным apply/destroy в изолированном sandbox-аккаунте — реже (PR в main или nightly), с обязательной очисткой ресурсов даже при сбое теста; важно также проверять idempotence (повторный прогон без изменений) как отдельный обязательный шаг, а не полагаться на единичный успешный прогон.
Подводные камни
- Ошибка. частая ошибка — ограничиваться только статическими линтерами и считать это достаточным тестированием, из-за чего логические ошибки (роль работает, но не идемпотентна, или модуль создаёт ресурс не с тем параметром) обнаруживаются только в проде; другая ошибка — не предусмотреть гарантированную очистку (
destroy) тестовых ресурсов при сбое теста посреди выполнения, из-за чего в тестовом аккаунте копится забытая инфраструктура и растут расходы.