Автоматизированное тестирование стало неотъемлемой частью разработки современного программного обеспечения, позволяя командам оптимизировать свои усилия по тестированию и быстрее поставлять высококачественное программное обеспечение. 

В этой статье я расскажу о 14 простых, но эффективных практиках, которые помогут вам получить максимальную отдачу от автоматизации тестирования. От разработки тестовых сценариев до их выполнения и анализа, эти методы направлены на оптимизацию процесса тестирования и повышение общего качества программных продуктов. 

Я проиллюстрирую эти лучшие практики на примерах автоматизации с помощью TypeScript Cypress. 

1. Начните со стратегии 

Перед тем как начать автоматизацию тестирования, необходимо разработать подробный план или стратегию. Определите  конкретные цели и задачи для автоматизации тестирования. Определите, какие процессы требуют автоматизации, а какие можно оставить без изменений, основываясь на их выполнимости. 

Это подход также предполагает взаимодействие с теми, кто наилучшим образом разбирается в приложении, такими как менеджер проекта, бизнес-аналитик или дизайнер UI/UX — членами команды, которые осведомлены о функционировании приложения и его значимости для пользователей. Дополнительно, можно обратиться к отделу QA, который может предоставить информацию о своём опыте в прошлых проектах и посоветовать, следует ли придерживаться уже проверенной стратегии или разработать новую, которая будет лучше соответствовать требованиям текущего проекта

2. Используйте тестовые наборы с умом 

Разделите тесты на категории в зависимости от тем, функциональности или страниц приложения. Так, можно создать отдельный набор тестов для проверки функционала авторизации, другой набор для тестирования платёжных функций и так далее. Такой подход облегчает контроль и эффективное проведение тестирования, особенно когда количество тестов увеличивается. 

Для примера возьмем функционал "Процесс бронирования" (набор тестов), который содержит тесты, например, "Бронирование билета для взрослого" и "Бронирование билета для взрослого с ребенком"

В качестве примера, вот как можно использовать функцию describe() для создания "Тестового набора" и функцию it() для описания "Тестового сценария в Cypress: 

3. Подробно опишите сценарии тестирования. 

Перед тем как приступить к написанию кода, подробно опишите каждый шаг теста и ожидаемые результаты. Это схоже с разработкой детализированного плана перед началом строительства — важно чётко понимать, что и как вы будете делать. Детальная проработка каждого шага заранее облегчит написание тестового кода в дальнейшем, так как вы уже будете знать, какие аспекты и в каком порядке необходимо проверить. 

Пример тестового сценария для автоматизации 
Пример тестового сценария для автоматизации 

4. Создайте поддерживаемые тестовые сценарии

Создавайте тестовые сценарии таким образом, чтобы их было легко читать и поддерживать. Присваивайте тестам и их компонентам названия, которые ясно отражают их суть. Не забывайте уделять время на оптимизацию методов для возможности их повторного использования. Придерживайтесь установленных в компании стандартов и правил написания кода. Ниже представлены несколько советов по оптимизации кода. 

5. Добавьте идентификаторы к элементам HTML 

Присваивая HTML элементам атрибут data-testid в коде фронтенда, вы эффективно маркируете их для тестирования. Это упрощает работу автоматизированных тестов в точной идентификации и взаимодействии с этими элементами, даже при измененнии HTML разметки. В случаях, когда инженеры по качеству не имеют доступ к репозиторию фронтенд-кода, может потребоваться запросить data-testid у разработчиков. 

Примеры data-testid для элементов в HTML
Примеры data-testid для элементов в HTML

Пример использования data-testid в Cypress: 

6. Используйте предусловия и постусловия 

Предусловия и постусловия помогают нам подготовить тест и провести очистку после него. Перед запуском теста критично важно проверить, что система находится в нужном состоянии для проведения испытаний (предварительные условия). После окончания теста требуется возвратить систему в исходное состояние или произвести требуемую чистку, чтобы система была готова к новому тесту (постусловия). Использование методов таких как Before, After, BeforeEach и AfterEach позволяет автоматизировать эти процессы настройки и очистки, тем самым обеспечивая стабильность и независимость наших тестов. 

Пример использования хуков before(), beforeEach(), after() в Cypress: 

7. Используйте вызовы API для автоматизации задач, экономии времени и предотвращения нестабильности тестов  

Здесь мы говорим о применении API для таких целей, как создание необходимых тестовых данных или настройка состояний пользовательских аккаунтов перед проведением тестов, а также для последующей очистки или перезагрузки этих данных. Применение API-вызовов не только улучшает стабильность тестов, но и экономит время за счет автоматизации рутинных операций. 

Пример использования методав Cypress: 

8. Правильно применяйте шаблон Page Object 

В данном подходе каждая страница приложения оформлена как отдельный объект в коде. Это упрощает организацию тестов и облегчает их поддержку, так как любые изменения в пользовательском интерфейсе регулируются в рамках соответствующего объекта страницы. Применение шаблона объекта страницы делает тестовый код более читаемым и легко масштабируемым. 

Шаблон Page Object целесообразно использовать в автоматизации тестирования в следующих случаях:  

  • Приложение имеет сложный пользовательский интерфейс с множеством страниц или элементов, которые требуют частого взаимодействия в тестах. 

  • Существует необходимость повторного использования элементов или действий в нескольких тестах или наборах тестов. 

  • Вы предполагаете частые изменения в пользовательском интерфейсе и хотите централизовать изменения, связанные с пользовательским интерфейсом, в одном месте, чтобы упростить поддержку. 

Нет необходимости использовать шаблон Page Object в следующих случаях: 

  • Приложение имеет простой пользовательский интерфейс с несколькими страницами или элементами, которые не требуют большого взаимодействия в тестах. 

  • Вы создаете одноразовые или специальные тесты, которые не нужно поддерживать или использовать повторно в будущем. 

  • Вы ограничены во времени и вам нужно быстро создавать тесты, не сосредотачиваясь на долгосрочном обслуживании или масштабируемости. 

Вот статья Глеба Бахмутова об использовании Page Object и App Actions в Cypress. 

9. Применение наследования для элементов общей страницы 

Некоторые страницы могут использовать одинаковые шаблоны. Вместо повторения кода для общих элементов в разных объектах страниц, мы можем создать базовый объект страницы, который будет включать эти общие элементы. После этого мы можем разработать дочерние объекты страниц для специфических страниц, которые будут наследовать базовый объект страницы. Такой подход делает наш тестовый код более модульным и структурированным. 

Пример наследования страниц 
Пример наследования страниц 


10. Группировка общих компонентов для повторного использования 

Важно уметь определить, когда определенные элементы встречаются на нескольких страницах, такие как хедеры, футеры или меню. 

Определяя эти общие компоненты и сохраняя их в отдельных файлах, как указано выше, мы можем избежать дублирования кода в различных объектах страницы. Вместо этого мы разрабатываем методы для взаимодействия с этими общими элементами только один раз. Такой подход экономит время и ресурсы, а также делает наш тестовый код более эффективным, легким в поддержке и пригодным для повторного использования. 

11. Разработайте многократно используемые вспомогательные методы 

Эффективно разрабатывать вспомогательные методы для часто повторяющихся задач в разных тестах, например, для авторизации. Такие методы заключают в себе логику выполнения этих действий, облегчая их повторное применение в множественных тестах. 

Структура папок проекта Cypress 
Структура папок проекта Cypress 

12. Логируйте детали тестов для упрощения отладки 

Полезно логировать ключевую информацию на разных этапах проведения теста. Эти записи могут включать такие данные, как этапы тестирования, входные параметры, ожидаемые и реальные результаты. Логи предоставляют важные сведения для диагностики ошибок и отладки проблем в тестах, что помогает определить первопричины неполадок и эффективно устранить их. 

Пример использования метода log() в Cypress: 

13. Организуйте тестовые данные в отдельные файлы 

Полезно размещать разнообразные типы тестовых данных в отдельных файлах, классифицированных по категориям. Эти файлы могут содержать такую информацию, как данные приложения, локаторы  для идентификации элементов интерфейса, входные данные для тестовых сценариев, URL веб-страниц и данные для аутентификации. Организация тестовых данных в таком виде и их централизация в одном файле упрощает их повторное использование и обновление. Вместо того чтобы вносить изменения в данные в различных тестах, вы можете обновлять их в одном месте, что обеспечивает консистентность и повышает эффективность процесса тестирования. 

Пример файла .json с данными: 

14. Регулярно обновляйте тесты  

Регулярно пересматривайте и актуализируйте автоматические тесты, чтобы они оставались релевантными и эффективными. Пренебрежение регулярным обновлением тестов со временем может снизить их результативность. Вносите необходимые корректировки, чтобы тесты соответствовали последним изменениям в требованиях и функционале приложения. 

Комментарии (2)


  1. XVlady5
    23.10.2024 02:30

    Что сразу бросилось в глаза:

    1. Используйте yml вместо json - его существенно удобнее diffить в pr

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

    3. Очень важный пункт - помните про параллельность и уборку за собой не озвучен.

    4. Выбор данных, их подготовка, приборка не должны влиять на систему радикальным образом. Например, видел историю когда статистика в базе сходила с ума от запуска тестов и тестовая зона вела себя не адекватно

    5. Хорошо сказали про api. Но нужно добавить, что не следует бояться расширять апи в целях увеличения тестируемости продукта. Это лучше прямых конектов в приложение.


  1. mikkax
    23.10.2024 02:30

    Пункт 0 - не пишите UI тесты. Точнее пишите, но мало. Пирамида тестирования, все дела