Как стать автором
Обновить

Пирамида тестирования VS чистая архитектура — делим тесты между QA и разработчиком

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров6.9K
Всего голосов 15: ↑15 и ↓0+19
Комментарии14

Комментарии 14

Спасибо за статью.

Все тесты должен писать разработчик - это ваш специалист по коду. QA только приносят ему готовые спецификации\сценарии тестов - специалисты по качеству же. Вместе, вы как команда ответственные за качество продукта.

e2e тестирование тоже выполняется разработчиками. И вы правильно заметили, про скоуп по 1 сервису. Т.к. Ваши сервисы по умолчанию должны быть Независимыми - тестируются и деплоятся отдельно от остальных. А то чего вы на самом деле боитесь - интеграция сервисов, покрывается Контрактными Тестами.

Конечно у вас должны возникнуть вопросы к правильности архитектуры ваших сервисов, их границам.

Иначе, скорее всего у вас так, - у вас появятся огромные тестовые стенды с полным поднятым окружением. Еще хуже, когда их становится больше чем у вас команд.

Рекомендую к просмотру видео Dave Farley - соавтор методологии Continuous Delivery, а конкретно про e2e тестирование и Acceptance тестирование.

все должен делать разработчик, AQA не нужны, я верно понял?

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

Все это добро они приносят разрабам. Разрабы это все кодируют - профит.

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

Тут еще важно правильно организовать код и тесты в репе. Т.к. тесты ломаются когда меняется код. А код меняют разрабы. Значит им его и чинить. Иначе получается нездоровая динамика - сокрытие информации от разрабов, когда они не знают работает ли система, пока не запушат все и не увидят лампочку...

AQA - automatic quality assurance. Я имел ввиду тех, кто пишет автотесты

Понял. Ну как сказать... не все что делается - лучшая практика. Иногда это просто то что делают все...

ИМХО этот тайтл появился из-за размытия понятия QA, чтобы отделить мануальщиков, от автоматизаторов - не более. Чтобы было проще нанимать людей со скилом в программировании.

Тут срабатывает как раз тот вариант, когда QA могут писать Acceptance тесты, в репе с кодом. Но тут надо следить, чтобы QA соблюдали практики написания кода разработчиков (или если они более скиловые - предлагали свои). Но владение кодом должно быть общим и по большей части - у разрабов.

Это про то, что разрабы по итогу будут запускать эти тесты, чтобы понять все ли они правильно сделали. И если тест падает без очевидной причины - им надо разобраться в чем именно проблема.

Т.е. роль вполне себе актуальная.

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

Спасибо за столь развернутый комментарий.
Мне даже сложно что-то добавить, так как я придерживаюсь схожей позиции.
Вопрос (мысли вслух) в том какая стратегия будет достижима, погрузить разработчиков в практики тестирования или погрузить QA в практики разработки. Меч обоюдоострый, потому к этому стоит подходить с осторожностью.

Мне кажется там без вариантов. Одни должны учиться кодить, а вторые писать тесты. Прикрывать друг-друга. Это и есть командная работа.

На скрамтреке недавно хорошо про это рассказали."Награды и HR-политики в Аджайл-организациях. Илья Павличенко"

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

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

Например если у вас «ЧА», одна модель хранения данных (например база данных) и вы используете ORM, ромб это ваш выбор, потому что писать unit тесты c active record не целесообразно, а интеграционные в самый раз.

По поводу интеграционных тестов и моков, существуют понятия процессные зависимости и внепроцессные зависмости.

Все внепроцессные зависимости делятся на две категории.
Управляемые зависимости (внепроцессные зависимости, находящиеся под вашим полным контролем): эти зависимости доступны только через ваше приложение; взаимодействия с ними не видны внешнему миру. Типичный пример — база данных.
Неуправляемые зависимости (внепроцессные зависимости, которые не находятся под вашим полным контролем) — результат взаимодействия с такими зависимостями виден извне. В качестве примеров можно привести сервер SMTP и шину сообщений.
Взаимодействия с управляемыми зависимостями относятся к деталям имплементации. И наоборот, взаимодействия с неуправляемыми зависимостями являются частью наблюдаемого поведения вашей системы.

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

Я полностью согласен с @Atorian— тесты должны писать разработчики

Благодарю за содержательный комментарий, про "ромб" прям интересно. А не подскажете, где можно про перечисленные вами стратегии тестирования "ромб", "пирамида" и "перевёрнутая пирамида" и их связь с архитектурой приложения более подробно почитать?

Gariks дал хорошие рекомендации и мы немного подискутировали в комментариях к анонсу этой статьи в tg - https://t.me/latech/1113
Речь о книге Хононова - Изучаем DDD. Gariks привел схему из нее где отражено как выбор паттерна архитектуры влияет на выбор стратегии тестирования.
Для примера можно взять две архитектуры по краям - Транзакционая и Событийная:
В транзакционной мы предполагаем линейный код, который будет выполнять бизнес-логику шаг за шагом. Это значит, что вся сложность будет сосредоточена в последовательнастях вызовов методов, которые выполняют сценарии. Соотвественно наша стратегия тестирования - перевернутая пирамида, так как логика сильно связанная- отсюда преимущественно сквозные сценарии.
В событийной мы сосредотачиваем бизнес-логику в обработчиках событий и агрегатах. Эти обработчики и агрегаты можно с легкостью тестировать изолированно. Отсюда акцент на юнит-тестах. В тоже время нас интересует интеграция с управляемыми зависимостями для тестирования потока событий. И тогда для e2e остается совсем немного места - ведь мы уже почти все проверили на уровнях ниже. В итоге получается классическая пирамида.

Если говорить о реализации самой пирамиды, то есть множество статей разного уровня погружения. На вскидку, обзорная (в ней так же есть ссылки на др ресурсы) - https://medium.com/@mateuszroth/why-the-test-pyramid-is-a-bullshit-guide-to-testing-towards-modern-frontend-and-backend-apps-4246e89b87bd

Непонятно, почему приемочные (acceptance bdd) тесты находятся ближе к основанию пирамиды, чем интеграционные. По идее они менее гранулярные.

Это ошибка - прошу меня простить)

Давайте распутаем. Есть два типа стейкхолдеров в ИТ. Продуктовые знают Что, но не знают Как. Инженерные знают Как но не знают Что. Ни первые ни вторые не любят погружаться в домены друг друга. Отсюда два вывода.

1. Каждый тестирует свой домен - инженеры что накодили, продакты что напридумали.

2. Продакты не умеют автоматизировать свои тесты, поэтому мы их либо учим клик-инструментам, либо даём личного автоматизатора.

Соответственно, инженера стремятся к 100% покрытия ими накоженного, а продакты стремятся к 100% покрытия ими напридуманного. Так как накоженное часто не совпадает с напридуманным, некоторое дублирование покрытия тестами лучше дырок в нем.

К сожалению все чаще сталкиваюсь с коллегами которые считают что unit тесты не нужны, чистый код и архитектура это пережиток прошлого и наследие дедов, сейчас все иначе... и т.д. Из-за своих софт-скиллов не вступаю в спор, но мне страшно за будущее разработки, так как это мне говорили TL и синьоры... Да даже тут на хабре в комментариях бывают пришут.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий