Обратите внимание на аргумент -timeout30m, который используется вместе с командой gotest. Go по умолчанию ограничивает время работы тестов десятью минутами; когда это время заканчивается, тестовое выполнение принудительно завершается, в результате чего тест не просто проваливается, но даже не доходит до кода очистки (terraformdestroy). Эта проверка ALB должна занять около пяти минут, но при реализации тестов, которые развертывают реальную инфраструктуру, время ожидания лучше увеличить, чтобы тест не прервался на полпути и не оставил после себя разного рода инфраструктуру.
Этот тест сгенерирует длинный журнальный вывод, но, если внимательно почитать, можно заметить все его ключевые моменты.
1. Выполнение terraforminit.
2. Выполнение terraformapply.
3. Чтение выходной переменной с помощью terraformapply.
4. Неоднократная отправка HTTP-запросов к ALB.
5. Выполнение terraformdestroy.
Этот код работает несравнимо медленнее модульных тестов на Ruby, но теперь менее чем за пять минут вы автоматически узнаете, ведет ли себя ли ваш модуль alb так, как вы того ожидали. Для инфраструктуры AWS это максимально быстро, и в результате вы должны увериться в том, что ваш код работает как следует. Если в вашем примере есть какая-либо ошибка (например, код состояния для действия по умолчанию был случайно изменен на 401), вы довольно скоро об этом узнаете:
$ go test -v -timeout 30m
(...)
Validation failed for URL
http://terraform-up-and-running-931760451.us-east-2.elb.amazonaws.com.
Response status: 401. Response body: 404: page not found.
(...)
Sleeping for 10s and will try again.
(...)
Validation failed for URL
http://terraform-up-and-running-h2ezYz-931760451.us-east-2.elb.amazonaws.com.
Response status: 401. Response body: 404: page not found.
(...)
Sleeping for 10s and will try again.
(...)
--- FAIL: TestAlbExample (310.19s)
HTTP GET to URL
http://terraform-up-and-running-931760451.us-east-2.elb.amazonaws.com
unsuccessful after 10 retries
FAIL terraform-up-and-running 310.204s
Внедрение зависимостей
Теперь посмотрим, сколько усилий потребуется, чтобы создать модульный тест для чуть более сложного кода. Еще раз вернемся к примеру с веб-сервером на Ruby и представим, что нам нужно добавить новую точку входа /web-service, которая шлет HTTP-вызовы к внешней зависимости:
class Handlers
def handle(path)
case path
when "/"
[200, 'text/plain', 'Hello, World']
when "/api"
[201, 'application/json', '{"foo":"bar"}']
when "/web-service"
# Новая точка входа, которая вызывает веб-сервис
uri = URI("http://www.example.org")
response = Net::HTTP.get_response(uri)
[response.code.to_i, response['Content-Type'], response.body]
else
[404, 'text/plain', 'Not Found']
end
end
end
Обновленный класс Handlers обрабатывает URL-адрес /web-service, отправляя HTTP-запрос типа GET на example.org и передавая ответ. Если обратиться к этой точке входа с помощью curl, получится следующий результат:
$ curl localhost:8000/web-service
<-- (...) -->
This domain is established to be used for illustrative
examples in documents. You may use this domain in
examples without prior coordination or asking for permission.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии