Но не отчаивайтесь. Вы все еще можете укрепить свою уверенность в том, что ваш код Terraform ведет себя предсказуемо. Для этого автоматические тесты должны использовать ваш код для развертывания реальной инфраструктуры в реальном окружении (например, в настоящей учетной записи AWS). Иными словами, модульные тесты для Terraform на самом деле являются интеграционными. Но я все равно предпочитаю называть их модульными, чтобы подчеркнуть нашу цель: протестировать отдельный (обобщенный) модуль и как можно быстрее получить результат.
Это означает, что базовая стратегия написания модульных тестов для Terraform подразумевает следующее.
1. Создание обобщенного автономного модуля.
2. Создание простого в развертывании примера для этого модуля.
3. Выполнение terraformapply для развертывания примера в реальной среде.
4. Проверка того, что развернутый вами код работает так, как вы ожидали. Этот этап зависит от типа инфраструктуры, которую вы тестируете: например, чтобы проверить балансировщик ALB, ему нужно послать HTTP-запрос и убедиться в том, что он возвращает тот ответ, который вы ожидаете.
5. Выполнение terraformdestroy в конце для очистки ресурсов.
Иными словами, вы выполняете все те же шаги, что и при ручном тестировании, но оформляете их в виде кода. Такой образ мышления хорошо подходит для создания автоматических тестов для кода Terraform: спросите себя, как бы вы проверили данный модуль, чтобы убедиться в его работе, и затем запрограммируйте этот тест.
Для написания тестов подходит любой язык программирования. В этой книге все тесты написаны на языке Go. Это позволяет использовать открытую библиотеку тестирования Terratest (http://bit.ly/2Tbzvch), которая поддерживает широкий спектр инструментов IaC (скажем, Terraform, Packer, Docker, Helm) в разнообразных окружениях (таких как AWS, Google Cloud, Kubernetes). Библиотека Terratest напоминает швейцарский армейский нож: в ней сотни инструментов, которые существенно упрощают тестирование инфраструктурного кода, включая полноценную поддержку только что описанной стратегии, когда вы развертываете код с помощью terraformapply, убеждаетесь, что он работает, и затем выполняете в конце terraformdestroy, чтобы очистить ресурсы.
Чтобы использовать Terratest, вам нужно сделать следующее.
1. Установить Go: golang.org/doc/install.
2. Настроить переменную среды GOPATH: golang.org/doc/code.html#GOPATH.
3. Добавить $GOPATH/bin в переменную среды PATH.
4. Установить Dep, диспетчер зависимостей для Go: golang.github.io/dep/docs/installation.html57.
5. Создать внутри GOPATH папку для тестов. Учитывая, что переменная GOPATH по умолчанию равна $HOME/go, вы могли бы создать $HOME/go/src/terraform-up-and-running.
6. Выполнить команду depinit в только что созданной вами папке. В результате у вас должны появиться файлы Gopkg.toml и Gopkg.lock, а также пустая папка vendors.
Чтобы быстро проверить, верно ли сконфигурировано ваше окружение, создайте в своей новой папке файл go_sanity_test.go следующего содержания:
package test
import (
"fmt"
"testing"
)
func TestGoIsWorking(t *testing.T) {
fmt.Println()
fmt.Println("If you see this text, it's working!")
fmt.Println()
}
Выполните этот тест с помощью команды gotest и убедитесь, что она возвращает следующий вывод:
$ go test -v
If you see this text, it's working!
PASS
ok terraform-up-and-running 0.004s
Флаг -v означает verbose («подробно»). Он делает так, чтобы тест показывал весь журнальный вывод.
Если все работает, можете удалить go_sanity_test.go и приступить к написанию модульного теста для модуля alb. Создайте в папке test файл alb_example_test.go со следующим каркасом своего теста:
package test
import (
"testing"
)
func TestAlbExample(t *testing.T) {
}
Для начала вы должны указать Terratest, где находится ваш код Terraform. Используйте для этого тип terraform.Options:
package test
import (
"github.com/gruntwork-io/terratest/modules/terraform"
"testing"
)
func TestAlbExample(t *testing.T) {
opts := &terraform.Options{
// Сделайте так, чтобы этот относительный путь
// вел к папке с примерами для alb!
TerraformDir: "../examples/alb",
}
}
Следует отметить, что для проверки модуля alb вам действительно нужно протестировать код примера в папке examples (обновите относительный путь в TerraformDir, чтобы он вел к нужной папке). Это означает, что демонстрационный код теперь имеет тройное назначение: он служит исполняемой документацией, средством ручного тестирования и инструментом для выполнения автоматических тестов ваших модулей.
Обратите также внимание на новую инструкцию импорта для библиотеки Terratest вверху файла. Чтобы загрузить эту зависимость на ваш компьютер, выполните depensure:
$ dep ensure
Команда depensure просканирует ваш код на Go, найдет все новые инструкции импорта, автоматически загрузит их вместе со всеми зависимостями в папку vendor и пропишет их в файл Gopkg.lock. Если для вас в этом слишком много магии, можете использовать команду depensure-add, чтобы перечислить все нужные вам зависимости вручную:
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии