Выбор лучшего репозитория для кода тест-автоматизации |
04.02.2025 00:00 | ||||||||||||
Где должен жить код тестов проекта? Старый, как мир, спор Как только инженерное сообщество начало включать тестирование в жизненный цикл разработки ПО, мы спорим о подходящем доме для кода тест-автоматизации. Должен ли он жить в том же репозитории, что и код тестируемого приложения? Может, лучше выделить его в отдельный репозиторий, подальше от основной базы кода? Этот спор почти так же горяч, как противостояние «табуляция или пробелы». В этой статье изложены аргументы обеих сторон, а также плюсы и минусы каждого подхода. Она предлагает гибридное решение на основании опыта автора и обсуждений с командой разработки. Статья делает акцент на важности «культуры качества» и роли адвокатов качества, которую играют инженеры по обеспечению качества. Также будет обсуждаться внедрение прекоммитных хуков и использование тегов в pytest для создания быстрой петли обратной связи и повышения эффективности непрерывной интеграции и поставки/разработки (CI/CD). В заключении говорится о том, что для улучшения QA-практик необходимы масштабные исследования. О чем спор? Кто эти современные Хэтфилды и МакКои? Давайте посмотрим на обе группы повнимательнее. Для ясности я не буду обсуждать связанное с нашим вопросом противостояние, писать код тестов на том же языке, что и приложение, или не писать. Оставим это на другой раз. Адвокаты репозитория приложения говорят, что так проще поддерживать код тестовАдвокаты репозитория приложения твердо уверены, что все, что относится к коду приложения, должно существовать в этом же коде. Это включает юнит-тестирование, а также любую тест-автоматизацию. Решение часто принимается на основании используемого тест-фреймворка, а идея в том, что код тест-автоматизации легче поддерживать, если он часть репозитория приложения. Адвокаты отдельного репозитория говорят, что надо учитывать сложность кода тестовАдвокаты отдельного репозитория принимают во внимание сложность проекта тест-автоматизации и уверены, что в репозитории приложения должно находиться только само приложение. Лучший источник информации – метод проб и ошибокВ ходе работы над этой статьей я пытался выяснить, проводилось ли когда-нибудь формальное исследование, разбирающееся, как принимаются эти решения, и где обычно хранится код тестов. К сожалению, таких исследований я не нашел, и мне приходится полагаться на свидетельства очевидцев и личный опыт. Погрузимся глубже в «за» и «против» хранения кода тестов в репозитории приложения или же в отдельном репозитории. Преимущества и недостатки каждого подходаПреимущества использования репозитория приложения
Недостатки использования репозитория приложенияПреимущества использования отдельного репозиторияНедостатки использования отдельного репозиторияПредставляю вам гибридное решение вопроса репозиториевУх. Хорошие аргументы с обеих сторон. Неудивительно, что этот спор так и не решен. Я могу предоставить компромиссное решение, которое может сработать для множества организаций. Зачем выбирать один-единственный подход, если в реальности наилучшим будет гибридный? Я основываю свое предложение на личном опыте и моих многолетних разговорах с членами команды как со стороны разработки, так и со стороны QA. Тест-план похож на пахлаву – в нем множество слоев, он тщательно сконструирован, и если все правильно сделано – о, эта сладость успеха! �� Какой код должен жить в репозитории приложения?Юнит-тесты принадлежат репозиторию приложенияПо моему личному опыту и словам других участников QA-сообщества, лучшим домом для юнит-тестов будет репозиторий приложения. Не думаю, что кто-то будет спорить, что юнит-тесты должны жить где-то снаружи в своем личном репозитории. Контрактные тесты лучше работают в репозитории приложенияВторой тип тестов, которые я бы включил в репозиторий приложения – это контрактные тесты. Контрактное тестирование – это метод тестирования, убеждающийся, что две системы, сервисы или микросервисы, могут общаться и взаимодействовать друг с другом согласно ожиданиям. Эти тесты проверяют, что контракт между системами правильно реализован. В норме я бы поспорил, что интеграционное тестирование должно жить вовне репозитория приложения, и я обосную это чуть позже. Однако контрактное тестирование – особый вид интеграционного тестирования. Это наилучший способ убедиться, что сервисы могут правильно общаться друг с другом, без лишних затрат на полноценные end-to-end тесты. Оснащение тестов в репозитории приложенияЯ бы добавил и юнит, и контрактные тесты в прекоммитный хук вместе с инструментами контроля качества кода, его статического анализа и проверки безопасности. Эта практика дает разработчикам быструю обратную связь и помогает убедиться, что пулл-реквесты соответствуют нужным процессам. Какой код должен жить в репозитории кода тестов?Если вкратце: все остальные тесты!Я считаю, что все остальные типы тестов должны жить вне репозитория приложения, в своем личном репозитории. Сделайте шаг назад и подумайте – зачем нам нужны различные уровни тестирования? Каких результатов мы хотим добиться? Добавьте в репозиторий кода тестов инфраструктуру и ограничьте имитированиеПланируя такое тестирование, как интеграционное, функциональное, доступности, end-to-end, надо добавить инфраструктуру в качестве тестируемого компонента и максимально сократить имитирование. Группировка тестов в репозитории тестов с тегами pycodeЯ твердо верю в принцип DRY (не повторяйся), и думаю, что имеет смысл хранить код тест-автоматизации в едином репозитории, чтобы снизить дупликацию кода и логики – это улучшает поддерживаемость и снижает ошибки. Нужно использовать нечто вроде «тегов» в pytest для группировки релевантных тестов в наборы тестов. Эти наборы затем можно использовать в пайплайне CI/CD. В пайплайне CI/CD, когда прекоммитный хук успешно пройден, а пулл-реквест готов к созданию, нужно начать добавлять слои тестирования, используя вышеупомянутые теги наборов тестов. В этом случае вам нужно создать доступ только к одному репозиторию кода тестов, а затем прогнать релевантные тесты. Уведомление нужных людей о падениях тестовПоследним поводом для волнения хорошего адвоката QA будет проверка, что команда быстро узнает о падениях, что данные видимы. К сожалению, по моему и не только опыту, после запуска пайплайна CI/CD никто не отслеживает его завершение. Нам надо убедиться, что мы даем быструю обратную связь и уведомить нужных людей, если произошло падение. Надо также собирать исторические данные для отслеживания трендов и выявления возможностей для улучшения. Вкратце о гибридном подходе к репозиториюНаше исследование тест-стратегий выявило важность всеобъемлющего подхода к проверке качества и надежности ПО. Каждый шаг, от прекоммитных хуков до пайплайнов CI/CD, от юнит-тестирования до тестирования безопасности, играет критическую роль в тестировании. Ниже – таблица, резюмирующая ключевые компоненты этого процесса и делающая упор на необходимости дальнейших исследований и стандартизации сообщества QA. Таблица 1: Типы тестирования и подходяще оснащение для репозиториев кода приложения и кода тестов
QA-сообществу стоит подумать о проведении более масштабных исследований для разработки хороших практик, но пока что мы можем полагаться только на личный опыт. ЗаключениеСпор о том, какой репозиторий лучше, продолжается, но гибридный подход – это практичное компромиссное решение этого спора. Сохраняя юнит-тесты и контрактные тесты в репозитории приложения, и отделяя другие тесты в отдельный репозиторий, команды получают преимущества обоих подходов. Эта стратегия поддерживает культуру качества и упрощает сдвиг тестирования влево, что в итоге приводит к более эффективным и результативным процессам разработки ПО. |