Читаем Terraform: инфраструктура на уровне кода полностью

Метод http_helper.HttpGetWithRetry почти не отличается от метода http_helper.HttpGetWithValidation, только при отсутствии ответа с нужными кодом состояния или телом он повторит попытку. Максимальное количество повторений (десять) и длину интервалов между ними (десять секунд) можно настроить. Если в какой-то момент он получит ожидаемый ответ, тест будет пройден; если после истечения максимального количества попыток ожидаемый ответ так и не пришел, тест считается проваленным.

В конце теста нужно выполнить команду terraformdestroy, чтобы очистить ресурсы. Для этого у Terratest есть вспомогательный метод: terraform.Destroy. Но, если вызывать его в самом конце, из-за любой программной ошибки выше по коду (например, HttpGetWithRetry даст сбой из-за неправильной конфигурации ALB) тест может завершиться, не доходя до него, в результате чего развернутая инфраструктура не будет удалена.

Таким образом, вам нужно убедиться в том, что terraform.Destroy выполняется всегда, даже если тест проваливается. Во многих языках программирования для этого предусмотрены конструкции try/finally или try/ensure. Но в Go это делается с помощью выражения defer, которое гарантирует, что переданный в него код будет выполнен при завершении окружающей его функции (каким бы оно ни было):

func TestAlbExample(t *testing.T) {

        opts := &terraform.Options{

                // Сделайте так, чтобы этот относительный путь

                // вел к папке с примерами для alb!

                TerraformDir: "../examples/alb",

        }

        // Удаляем все в конце теста

        defer terraform.Destroy(t, opts)

        // Развертываем пример

        terraform.InitAndApply(t, opts)

        // Получаем URL-адрес ALB

        albDnsName := terraform.OutputRequired(t, opts, "alb_dns_name")

        url := fmt.Sprintf("http://%s", albDnsName)

        // Проверяем в ALB действие по умолчанию, которое должно вернуть 404

        expectedStatus := 404

        expectedBody := "404: page not found"

        maxRetries := 10

        timeBetweenRetries := 10 * time.Second

        http_helper.HttpGetWithRetry(

                t,

                url,

                &tls.Config{},

                expectedStatus,

                expectedBody,

                maxRetries,

                timeBetweenRetries,

        )

}

Обратите внимание, что defer размещается в начальной части кода, еще до вызова terraform.InitAndApply. Это нужно для того, чтобы тест не был провален еще до выражения defer, иначе вызов terraform.Destroy может не попасть в очередь на выполнение.

Этот модульный тест готов к запуску. Поскольку он развертывает инфраструктуру в AWS, перед его выполнением следует привычным способом аутентифицировать свою учетную запись (см. врезку «Способы аутентификации» на с. 64). Как упоминалось в этой главе, ручное тестирование следует проводить в изолированной учетной записи. Это вдвойне справедливо для автоматических тестов, поэтому советую сделать аутентификацию от имени совершенно отдельного пользователя. По мере создания все новых автоматических тестов у вас могут создаваться сотни и тысячи ресурсов, поэтому крайне важно изолировать их от всего остального.

Я обычно рекомендую командам разработчиков выделить совершенно отдельную среду (например, в отдельной учетной записи AWS) специально для автоматических тестов — отдельно даже от изолированных окружений, которые используются для ручного тестирования. Так, можно безопасно удалять в этой среде все ресурсы старше нескольких часов (предполагается, что ни один тест не выполняется настолько долго).

После входа в учетную запись AWS, которую можно безопасно применять для тестирования, запустите тест:

$ go test -v -timeout 30m

TestAlbExample 2019-05-26T13:29:32+01:00 command.go:53:

Running command terraform with args [init -upgrade=false]

(...)

TestAlbExample 2019-05-26T13:29:33+01:00 command.go:53:

Running command terraform with args [apply -input=false -lock=false]

(...)

TestAlbExample 2019-05-26T13:32:06+01:00 command.go:121:

Apply complete! Resources: 5 added, 0 changed, 0 destroyed.

(...)

TestAlbExample 2019-05-26T13:32:06+01:00 command.go:53:

Running command terraform with args [output -no-color alb_dns_name]

(...)

TestAlbExample 2019-05-26T13:38:32+01:00 http_helper.go:27:

Making an HTTP GET call to URL

http://terraform-up-and-running-1892693519.us-east-2.elb.amazonaws.com

(...)

TestAlbExample 2019-05-26T13:38:32+01:00 command.go:53:

Running command terraform with args

[destroy -auto-approve -input=false -lock=false]

(...)

TestAlbExample 2019-05-26T13:39:16+01:00 command.go:121:

Destroy complete! Resources: 5 destroyed.

(...)

PASS

ok   terraform-up-and-running   229.492s

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Искусство управления IT-проектами
Искусство управления IT-проектами

В отличие от множества трудов, посвященных руководству проектами и командами, в этой книге не проповедуются никакие новые учения и не превозносятся великие теории. Скотт Беркун считает залогом успеха практику и разнообразие подходов. В книге описываются основные сложности и проблемные ситуации, возникающие в работе менеджера проекта, даны рекомендации по выходу из них.Издание предназначено не только для лидеров команд и менеджеров высшего звена, но и для программистов, тестеров и других исполнителей конкретных проектных заданий. Также оно будет полезно студентам, изучающим бизнес-менеджмент, проектирование изделий или программную инженерию.Текст нового издания значительно переработан автором с целью добиться большей ясности, кроме того, книга дополнена новым приложением и более чем 120 практическими упражнениями.

Скотт Беркун

Деловая литература
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги