Настрой – действуй – проверь: паттерн для хороших автотестов |
10.02.2021 00:00 | ||||
Автор: Энди Найт (AndyKnight) Тест – это процедура, которая проверяет поведение с целью определить, правильно ли оно функционирует. У тестов много видов – юнит, интеграционные, end-to-end, но все функциональные тесты по сути делают одно и то же: пробуют что-то и сообщают PASS или FAIL. Тестирование дает эмпирическую петлю обратной связи разработке, и тем самым обеспечивает нашу безопасность. Имея тесты, мы знаем, когда что-то ломается. Без тестов программирование может быть опасным. Мы же не хотим отправить в релиз большие страшные баги! Как же нам написать хорошие тесты, если мы планируем потратить время на создание тестов? Существует простой, но мощный паттерн, которому следую я: "Настрой – действуй – проверь" (Arrange-Act-Assert). Паттерн "Настрой – действуй – проверь" – отличный способ структуризации тест-кейсов. Он задает порядок операций.
В BDD паттерн "Настрой –Действуй – Проверь" называется иначе – Если – Когда – Тогда. Язык Gherkin использует шаги Если – Когда – Тогда для описания поведенческих сценариев. По сути это та же самая формула, что и в "Настрой – Действуй – Проверь". Каждый крупный язык программирования имеет как минимум один тест-фреймворк. Фреймворки вроде JUnit, NUnit, Cucumber, и моего любимого pytestпозволяют вам как разработчику автоматизировать тесты, запускать наборы тестов и отчитываться о результатах. Однако фреймворк сам по себе не делает тест хорошим или плохим. Знать, как создавать хорошие тесты – это ваша задача как тестировщика! Давайте посмотрим, как применить паттерн "Настрой – Действуй – Проверь" к коду Python. Для демонстрации я буду использовать pytest. Юнит-тестирование Вот базовый юнит-тест для функции абсолютного значения в Python:
Этот тест может показаться тривиальным, но его можно использовать для иллюстрации паттерна. Я люблю писать комментарии, отделяющие каждую фазу тест-кейса. Тестирование фичи Усложним задачу с более заковыристым тестом. Следующий пример проверяет DuckDuckGoInstantAnswerAPIс использованием библиотеки requests:
Можно увидеть, что паттерн "Настрой – Действуй – Проверь" работает тут не хуже, чем в юнит-тестах: Этот паттерн также работает для других типов тестов, вроде WebUI и мобильных. Советы Настрой-действуй-проверь хорош своей простотой. Он заставляет тесты концентрироваться на независимых, индивидуальных поведениях. Он отделяет шаги настройки от основных шагов. Он требует, чтобы тесты проводили проверки, а не просто ходили по шагам. Заметьте, что паттерн не выглядит как "Настрой – действуй – настрой – действуй – проверь" – последующие действия и проверки должны находиться в других тестах! Это отличный паттерн для создания хороших функциональных тестов. |