Концепция автоматического тестирования состоит в том, что для проверки поведения настоящего кода пишутся тесты. В главе 8 вы узнаете, что с помощью CI-сервера эти тесты можно запускать после каждой отдельной фиксации. Если они не будут пройдены, фиксацию сразу же можно отменить или исправить. Таким образом, ваш код всегда будет в рабочем состоянии.
Существует три типа автоматических тестов.
•
•
У каждого типа тестов свое назначение, и с их помощью можно выявить разного рода ошибки, поэтому их стоит применять совместно. Модульные тесты выполняются быстро и позволяют сразу получить представление о внесенных изменениях и проверить разнообразные комбинации. Это дает уверенность в том, что элементарные компоненты вашего кода (отдельные модули) ведут себя так, как вы ожидали. Однако тот факт, что модули работают корректно по отдельности, вовсе не означает, что они смогут работать совместно, поэтому, чтобы убедиться в совместимости ваших элементарных компонентов, нужны интеграционные тесты. С другой стороны, корректное поведение разных частей системы не гарантирует, что эта система будет работать как следует после развертывания в промышленной среде, поэтому, чтобы проверить ваш код в условиях, приближенных к реальным, необходимы сквозные тесты.
Теперь посмотрим, как писать тесты каждого из этих типов для кода Terraform.
Модульные тесты
Чтобы понять, как писать модульные тесты для кода Terraform, можно сначала посмотреть на то, как это делается в языках программирования общего назначения, таких как Ruby. Взгляните на код веб-сервера, написанный на Ruby:
class WebServer < WEBrick::HTTPServlet::AbstractServlet
def do_GET(request, response)
case request.path
when "/"
response.status = 200
response['Content-Type'] = 'text/plain'
response.body = 'Hello, World'
when "/api"
response.status = 201
response['Content-Type'] = 'application/json'
response.body = '{"foo":"bar"}'
else
response.status = 404
response['Content-Type'] = 'text/plain'
response.body = 'Not Found'
end
end
end
Создание модульного теста для этого кода усложняется тем, что вам нужно выполнить несколько действий.
1. Создать экземпляр класса WebServer. Это сложнее, чем кажется, так как конструктору WebServer, который наследует AbstractServlet, необходимо передать целый класс HTTPServer из WEBrick. Вы могли бы создать его mock-объект, но это потребовало бы много усилий.
2. Создать объект request типа HTTPRequest. Получение экземпляра этого класса, равно как и создание его mock-объекта, требует довольно большого объема работы.
3. Создать объект response типа HTTPResponse. Опять же экземпляр этого класса нельзя получить легким путем, а для создания его mock-объекта нужно много усилий.
Если вам сложно писать модульные тесты, это часто говорит о плохом качестве кода и является поводом для рефакторинга. Чтобы облегчить модульное тестирование, обработчики (то есть код, который обрабатывает пути /, /api и «Страница не найдена») можно вынести в отдельный класс Handlers:
class Handlers
def handle(path)
case path
when "/"
[200, 'text/plain', 'Hello, World']
when "/api"
[201, 'application/json', '{"foo":"bar"}']
else
[404, 'text/plain', 'Not Found']
end
end
end
У этого нового класса есть два ключевых свойства.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии