Дисклеймер: меня зовут Эрик Бурыгин, я давно работаю тестировщиком, веду студентов на курсе «Инженер по тестированию», поэтому может показаться, что тестировщик просто хочет перекинуть кусок работы на разработчиков. На самом деле у описываемого подхода есть как плюсы, так и минусы, поэтому статья носит в том числе и дискуссионный характер. Буду рад увидеть в комментах мнения как разработчиков, так и тестировщиков.
Если тесты пишет разработка, можно решить сразу несколько проблем, например:
- Ощутимо ускорить релизный цикл.
- Снять нагрузку с тестирования.
В большинстве команд процесс выглядит примерно так:
- Разработчик создаёт новые фичи и допиливает существующие.
- Тестировщик всё это тестирует и пишет различные тест-кейсы.
- Автоматизатор, оправдывая название должности, автоматизирует всё по написанным тест-кейсам из п.2.
Вроде бы всё выглядит просто.
Но в этой парадигме есть слабые места.
Допустим, разработчик доделал свою фичу и благополучно отдал её в тестирование. Но фича получилась не medium rare, а откровенно сырая. Это приведёт к переоткрытию задачи и дополнительным фиксам, причём итераций может быть от одной до N, в зависимости от размера этой фичи, её сложности, влияния на смежные процессы, добросовестности самого разработчика. А ещё от того, как у вас в принципе устроены процессы внутри разработки, насколько тщательно смотрятся пул-реквесты, запускается ли приложение перед отправкой на тестирование.
В общем, переменных хватает.
После того как задача будет протестирована и готова к релизу, тестированию нужно написать на весь функционал тест-кейсы. Затем сделать регресс/смоук и наконец зарелизить.
Автоматизатор же после получения написанных тест-кейсов покрывает тестами функционал. Здесь есть довольно большая вероятность, что задача попадёт в существующую очередь, поэтому тесты будут написаны с задержкой.
— Просто нужно больше разработчиков
Увы, не панацея. Скорее наоборот. Чем больше в этой схеме у вас будет разработчиков, тем сильнее будет нагрузка на тестирование. В итоге будет увеличиваться или релизный цикл, или сама команда тестирования.
А это по принципу домино увеличит нагрузку уже на автоматизаторов, которым придётся обрабатывать всё большее и большее количество тест-кейсов, падающих на них от тестирования. Будет зеркальная ситуация: или увеличится время покрытия тестами, или штат автоматизаторов.
На восемь разработчиков обычно приходится два тестировщика и один автоматизатор. Автоматизация при этом не участвует в релизном цикле напрямую — скорее находится поблизости. И возникает вопрос: как сделать описанные процессы более эффективными, да ещё и не потерять в качестве?
Давайте попробуем сдвинуть этап автоматизации с третьего места на первое, на этап разработки.
Что получится
Получится сразу неплохой набор плюсов, смотрите:
- разработчики пишут тесты одновременно с написанием самой фичи, что существенно улучшает её качество;
- падает нагрузка на тестирование: тестировщикам теперь надо посмотреть результаты тестов и оценить, в достаточной ли степени задача покрыта тестами;
- ручного регресса в схеме больше нет за ненадобностью.
А что тестировщики?
Тестировщик и в обновлённой парадигме остаётся экспертом в тестировании — именно он ревьюит как качество, так и полноту покрытия автотестами той или иной фичи, а также занимается анализом сложных и необычных проблем. Но теперь, благодаря снижению нагрузки, у тестировщика освобождается часть времени, он может заниматься процессами.
При этом надо понимать, что ручное тестирование всё равно никуда не денется — у вас всегда будет что-то, что по какой-то причине автоматизировать либо невозможно, либо не имеет смысла.
Так вот, к новой парадигме. Круто же? Да хоть прямо сейчас внедрять. Если получится сделать две вещи.
- Продать эту идею разработке. Потому что далеко не каждый разработчик сразу захочет писать тесты, ведь это может быть скучно, или он просто не хочет: у вас, вообще-то, тестировщики вон там для чего сидят?
- Продать эту идею менеджерам. Потому что при прочих плюсах у вас увеличивается время разработки каждой фичи.
Какие минусы тут могут вас поджидать.
- Большая часть разработчиков просто не умеет тестировать, потому что они разработчики, а не тестировщики. И это нормально. Тут вы можете или научить их тестировать, что будет не самой тривиальной задачей, или просто писать тест-кейсы для них. Что де-факто ломает сам процесс.
- На старте автоматизация будет занимать больше времени, ведь не будет кодовой базы тестов, инфраструктуры и привычных подходов — задача-то новая.
- Будут нужны понятные отчёты для тестирования. Но имейте в виду: даже самый понятный отчёт не всегда можно сразу научиться правильно читать.
- Не каждую задачу вы сможете легко и быстро покрыть тестами. В ряде случаев вам придётся на тесты тратить больше времени, чем на саму реализацию фичи.
- Масштабные задачи будет сложно отдавать одновременно с тестами, это занимает довольно много времени.
- Для этих же масштабных и сложных задач надо будет всё равно закладывать время на то, чтобы просто в них вникнуть, потому что нет другого способа проверить правильность тестов, которые писали разработчики.
Что же делать?
В принципе у каждой из проблем есть решение.
- Разработчики не умеют тестировать. >
Можно консультировать их на первых этапах, чтобы помочь разобраться. - Нет кодовой базы, инфраструктуры и подходов. >
Всё решается только временем. На размеченные функции писать тексты проще. - Понятные отчёты. >
В отчёты надо включать все шаги, а название каждого теста должно сразу отражать, что именно им проверяется. - Приходится тратить много времени на ряд задач. >
Спасает здравый смысл: не всё стоит покрывать здесь и сейчас. - Сложно отдавать задачи, когда нет подходов и инструментов. >
Тоже решается постепенно, главное — время для анализа и внедрения того или иного инструмента. И это должно быть отдельной задачей. - Проблема масштабных задач. >
Их можно сразу отдавать без тестов либо частично покрытыми тестами. Но это в любом случае не отменяет погружения в контекст.
Вывод
Подход со всеми своими плюсами и минусами имеет право на жизнь. А если ещё и правильно настроить процессы, то это поможет вам и релизный цикл ускорить, и штат не раздувать (:
Ulys-ses
Они не просто не умеют тестировать. Они тестируют то, что работает.
Все дело именно в том, что разраотчик писал этот код. Если бы ему пришла в голову мысль, что здесь что-то может пойти не так, он бы поправил это в коде. А, если такая мысль при разработке не пришла, то почему она придет при тестировании?
Разработчики должны писать внутренние тесты. Но они не для проверки, а для будущей разработки — рефакторинга, доработки.
А внешние тесты, для проверки должен и писать внешний человек — тестировщик.
iiwabor
По большому счету, если дефект попадает в прод, это вина всей команды, поэтому команда — и тестировщики и разработчики, должны писать необходимые тесты, чтобы гарантировать, что дефекты не дойдут до клиента.
Mishiko
Мораль: от регресса производимого тестировщиками не уйти
psycha0s
Автор же тестировщик. Он описал ситуацию, глядя со своей колокольни. Если говорить о юнит-тестировании, то пожалуй соглашусь с автором. Разработчик должен четко документировать свои публичные интерфейсы и покрывать их тестами. В первую очередь это поможет самому понимать, какое поведение ожидается от той или иной функции и убедиться в корректной обработке пограничных случаев.
d08r0 Автор
В такой парадигме жизнь тестировщика не упрощается, меняются задачи которые он решает, на его стороне остаётся экспертиза в тестировании.
Но в данном случаи речь речь не про облегчение или усложнение жизни или уход от регресса, как правило регресс можно просто покрыть автоматизаций, были бы свободные руки и желание. Речь о процессе в целом, в данном случаи нужно оценивать общий профит или его отсутствие, а не конкретного звена :D
funca
Если тестировщик сам не тестирует, то откуда у него возьмётся экспертиза?
JekaMas
Это если сначала код писать.
Ulys-ses
А какая разница?
Если сначала написать тесты, то они будут тестировать то, что будет работать. То, что не будет — все равно останется за бортом.
JekaMas
Отчего же? Я пишу не только положительные случаи, но и пачку quick property based. Написать их легко, кейсы придумывать не надо. Только свойства описывать, которые и есть инварианты программы.
Ulys-ses
Речь не о том, положительные мы случаи тестируем или отрицательные, а о том, что разработчик о них знает и в коде обработал. Неожиданные для себя варианты он не проверит.
JekaMas
Так же ж… Я про то, что мешает добавлять quick тестирование, которое сродни whitebox fuzzing.
Ulys-ses
Пример: допустим, у нас есть вес коробки, на который мы где-то в коде делим.
Если разработчик сообразил, что кто-то может указать там 0, то он и проверку в коде сделает и тест с 0 напишет.
Если не сообразил — не сделает ни того, ни другого.
JekaMas
Мы начали с того, что разработчик если будет писать тесты, то напишет только на положительные кейсы.
Собственно, если начинаешь с тестов, то нет никакого "сообразил-не сообразил", есть описание спеки в виде тестов. Часть их них превратится в инварианты для более глубокого тестирования перебором.
Если же разработчик не в состоянии начать со спеки, то это уже фигак и в продакшн, тут медицина бессильна.
Ulys-ses
Что Вы называете «положительными кейсами»? Возможно, мы просто разной терминологией пользуемся.
В спецификации написано — «вес коробки». Всем же известно, что в реальной жизни вес положительный. Так?
JekaMas
Немного не так работает. Начав с теста поймёшь, что нет описания веса коробки — тест не написать. Придется писать письма, топать ножками и дорабатывать спеку и переносить в тесты. Где система типов помощнее, там сразу в тип.
Ulys-ses
Тут же дело не в том, что это вес коробки, а в том, заметит разработчик это граничное условие или нет.
Хорошо, если условие такое очевидное — 0. А если 3,14? Или -1?
Да, в коде (или в ТЗ) будет деление (например) на x+1. Если разработчик это заметит, то он и в коде проверку напишет и в тесте. Если нет — ни там, ни там. И это не зависит от того, что он пишет сначала — код или тесты.
Т.е., тесты, написанные разработчиком, не найдут его ошибки.
А значит, нужно независимое от разработчика тестирование.
Вот все, что я хочу сказать.
Но, так-то, да. Хорошо бы сначала написать подробное ТЗ со спецификациями, потом тесты, потом код, потом документацию. Где-то в идеальном мире…
JekaMas
А вот это уже пофиг. Для этого whitebox fuzzing или quick property based testing. Пусть оно само ищет.
0xd34df00d
Зачем на это писать тесты, если (в идеале) система типов требует, чтобы делитель не был равен нулю?
funca
Интересно в каком языке система типов может вывести такое ограничение в статистике, учитывая, что числа вводятся пользователем в рантайме?
0xd34df00d
Любой язык с зависимыми типами, плюс, конкретно ограничения подобного рода — любой язык с refinement types (вроде Liquid Haskell или аналогичной ерунды для всяких окамлей).
PrinceKorwin
Писать тесты перед ещё удобно в том, что даёт сразу понимание удобно будет итоговое API для использования или нет. Бывает так, что архитектурили, но реальное применение выявляет нюансы и требуется модификация API. Когда пишешь тест до, собственно, кода как раз эти моменты и всплывают.
Ulys-ses
Я не спорю с полезностью написания тестов до кода.
Я только про то, что тесты все равно будут написаны только на те случаи, что обработаны в коде. Не выявят ошибок, неожиданных для программиста.
PrinceKorwin
Ну так от тестов не требуется покрытия 100% неожиданных ситуаций.
Типов тестов много разных и каждых из них решает свои задачи.
Ну не выявят неожиданных ошибок. Выявит тестировщик или пользователь, будет заведен дефект при закрытии которого появится новый тест. Обычный процесс.
Ulys-ses
Так о том и речь. Разработчик — не выявит. А тестировщик — вполне может.
Поэтому требовать от разработчика написания тестов именно для проверки новой функциональности — бессмыслено.
d08r0 Автор
Всё зависит от разработчика, бывают разработчики которые консультируют тестировщиков о том как нужно тестировать, бывают те кто вообще не умеют тестировать, их могут консультировать тестировщики(:
Также новая функциональность может быть разная по сложности тестирования, к примеру если добавляется новый фильтр в приложение и нет ни одного теста на другие фильтры — в этом случаи могут возникнуть вопросы по тестированию. И наоборот, если добавляется новый фильтр и уже есть тесты на все остальные фильтры — в этом случаи написать тесты будет просто. Чем больше кодовой базы в автоматизации, тем проще писать последующие тесты на новый функционал(:
d08r0 Автор
То что не каждый разработчик умеет тестировать это правда и одна из основных сложностей, по этому на тестировании остается валидация тестов. Как это работает, разработчик пишет тесты и отдаёт в тестирование человкочитаемый отчёт c подробными шагами, с этой задачей отлично справляется Allure. Тестировщик смотрит на покрытие, и если тестов недостаточно то отправляет на доработку. С каждой итераций качество тестов растёт, а количество переоткрытий из-за багов уменьшается.
Про Unit-тесты, хорошее замечание, но как показывает практика часто они вовсе отсутствуют.
funca
Стратегия тестирования это скорее работа QA, чем тестировщика и там не только тесты. Задача тестировщика вовремя предоставлять качественную обратную связь, и она не сводится к одной лишь автоматизации.
d08r0 Автор
Согласен, так и QA никуда не исчезает и продолжает заниматься тестирование в глобальном понимании этого(:
ApeCoder
Тестировщик подскажет :)
Можно сначала согласовать приемочные тесты командой, потом, разработчик разрабатыает пишет тесты, потом exploratory тестирование тестировщиком, если находит глюки разработчик фиксит и пишет тесты.
То, что кто-то пишет тесты не означает что он их придумывает с самого начала.
martin_wanderer
Есть непроверенная гипотеза, что сам процесс написания теста вынуждает подумать о граничных условиях. Кроме того, написанный тест позволяет быстро прогнать свой код на разных входных данных — мне случалось так ловить ошибки столь же элементарные сколь и неочевидные
fallenworld
это антипаттерн "позитивное тестирование". Далеко не все разработчики ему подвержены
asolntsev
Ошибка.
Именно так и происходит: когда разработчик начинает писать тест, его мозг переключается из "созидательного" в "критический" режим, и он начинает придумывать разные ситуации, в которых его код может сломаться. Это помогает не только тесты написать, но и тут же улучшить код, не дожидаясь всего этого долгого процесса релиза/установки/тестирования/багфикса.
См. https://www.youtube.com/watch?v=8u6_hctdhqI&feature=youtu.be&a