Pull to refresh

Comments 34

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

Я так понимаю, вы описали не сами тесты, а их классы. А что по поводу конкретных видов acceptance-тестов?
Тут не очевидно, почему 10 часов тестирования — это упущенная выгода. Какой показатель указывает на это?
Допустим, построена следующая цепочка процессов: разработка → контроль качества. Это означает, что программист пишет код, а тестировщик тестирует код. Вопрос: зачем программист повторно тестирует код, если за это уже платят другому человеку?

Предположим, программист оправдывается тем, что хочет повысить качество и надёжность продукта. Но, необходимый уровень качества и надёжности уже заложен в продукт на этапе бизнес-планирования, риски оценены и застрахованы. Получается, что своими действиями (повторное тестирование) программист сохранит 1 клиента, когда без этих действий он бы принёс (за счёт разработки новой функциональности) 2 новых клиентов. Вопрос: зачем тратить ресурсы на то, что не приносит прибыль (или даже убытки)?
Это означает, что программист пишет код, а тестировщик тестирует код.

Давайте по другому посмотрим на вопрос. 50 автоматизированных тестовых последовательностей вызовов конечных точек web API отрабатывает за 27 секунд. В каждой последовательности в среднем 3 обращения к web API. То есть суммарно это около 150 HTTP запросов. Сколько времени понадобится ручному тестировщику, чтобы выполнить вручную эти 50 тестовых сценариев и оценить их результаты визуально?

Во-первых, автоматизированные тесты необходимо:
1. кому-то придумать,
2. кому-то автоматизировать,
3. кому-то выполнить и оценить результаты (они ведь не автоматические).

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

В третьих, сценарии и юнит-тесты — это одно, а контроль качества — это другое. Все необходимые сценарии, критерии и нормы закладываются ещё до того, как программист начинает что-то писать. Возможно, программист захочет протестировать эти 50 API endpoints, а менеджеру важны лишь 20 из них, а остальные — это доп. функциональность, которая не влияет на покупательную способность (а лишь на лояльность клиентов). Возможно, рынок и так уже захвачен или наоборот, компания решила покинуть рынок, снять сливки (привет, iphone). Получается:
1. программист сделал дополнительные 50 тестов
2. программист выполнил 30 лишних тестов
3. кпд тестирования = 20/(20+50) = 30%.
3. кому-то выполнить и оценить результаты (они ведь не автоматические).

Мне кажется вы тут ошиблись. Смысл автоматизированных тестов — это возможность их работы без участия человека. Нажали кнопку и на выходи получили знание — тесты прошли или нет.

критерии и нормы закладываются ещё до того, как программист начинает что-то писать

Вы описываете waterfall подход?

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

Смысл автоматизированных тестов — это возможность их работы без участия человека.

Нет, это смысл автоматических тестов. А автоматизированные тесты предполагают разомкнутый процесс тестирования, контролируемый и управляемый человеком.
1. Нажал кнопку — всё сломалось.
2. Починил — некоторые тесты не прошли проверку.
3. Создал тикет/задачу.
4. Дождался фикса и по новой с п. 1.

Вы описываете waterfall подход?

Не совсем. Просто классическое планирование бизнеса и его процессов, которое включает контроль качества и анализ рисков.
Возможно, программист захочет протестировать эти 50 API endpoints, а менеджеру важны лишь 20 из них, а остальные — это доп. функциональность, которая не влияет на покупательную способность

Странное на мой взгляд допущение. То есть мы предполагаем что программист программирует то, что ему хочется, в отрыве от требований? Ну взял просто реализовал вместо 30 нужных бизнес-функций, которые описаны в требованиях, еще 20 дополнительных, которые ему показались прикольными? А менеджер взял ему за это заплатил еще?

Почему же странное? Возможно, это были 30 тикетов с багтрекера. А клиенты уже на сидят на игле. Менеджер понимает, что, даже если тикеты не закрывать, клиентам будет очень сложно слезть с иглы.
Вы ведь тоже не перестаёте ходить в магазин после ежегодного роста цен на 10% или резкого повышения тарифов на городской транспорт.

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

А быть может, необходимо срочно закрыть 20 важнейших задач до конца года.
Мы тут находимся немного в вакууме и рассматриваем сферу.
Вопрос: зачем программист повторно тестирует код, если за это уже платят другому человеку?


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

Тут очень много вопросов к сравнили и подсчитали. Что, как, какие сценарии рассматривались.

В целом, тестов никогда не бывает много. Конечное качество продукта достигается эшелонированием разных подходов. Они дополняют друг друга. И юнит тесты и акцептант тесты и ручное тестирование — они независимо ценны.

Вопрос: зачем тратить ресурсы на то, что не приносит прибыль (или даже убытки)?

Опять это вопрос к бизнесу, и это сильно зависит от проекта и конкретных обстоятельств.

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

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

Большенство интересуемся нас случаем будут по средине, я думаю.
Конечная цель же не платить человеку, а разработать качественный софт.

Ха ха ха. Вы, явно, не владелец бизнеса, а работаете на какую-то компанию.

Тут очень много вопросов к сравнили и подсчитали.
И юнит тесты и акцептант тесты и ручное тестирование — они независимо ценны.
Опять это вопрос к бизнесу

Я не спорю с тестированием и с TDD, не говорю о бесполезности тестирования программистами своего ПО. Я говорю о ситуации, когда начальник сознательно заложил (или не заложил, или неполностью заложил, или заложил отсутствие в цену ПО) тесты тому или иному работнику.
И я говорю, что, возможно, бизнесу всё-таки стоит больше использовать тесты чем вероятности.
Очень интересно было бы взглянуть на это со стороны начальника. У вас случайно нет данных, как начальник оценивает тестирование? Какими цифрами оперирует?
Есть опыт, но только в крайностях: либо тесты вообще не нужны (сдаём в приемку за 10 минут презентации и получаем деньги), либо я сам начальник, и сам закладывают тесты. Какие? Юниты (90% покрытие), функциональные, ui/ux, интеграционные, ручные (приёмочные) и полевые.

В целом могу сказать, что вместо тестов начальники любят оперировать показателями надёжности (они даже в ГОСТах записаны). Самое адекватное и широко используемое средство. Не программист в тестах не разбирается, ему гораздо понятнее фраза: «ПО сломается в вероятностью 0,99995,» или даже: «Сервер будет простаивать не более 1 часа в год.»

Но у всех начальники разные.
Какой показатель указывает на это?

Субъективный. А если к примеру отчитаться о 10 часах дебага? Это будет упущенная выгода? Или менеджер должен быть счастлив?

1. Программисту дают задачу: разработать фичу X.
2. Через неделю он приходит и даёт отчёт о том, что он пофиксил баг (написал тесты) Y.
3. Вопрос: сколько подобных ситуаций продержится программист на рабочем месте?

Я всегда сначала пишу тесты, потом код. И считаю что для любого кода нужно и можно сначала писать тесты. Не важно серверные это приложения или клиентские. При разработке бэкендов у меня всегда есть модульные тесты и тесты API, которые я обычно пишу на Javascript + Node.js. Если говорить про разработку фронтендов, то в этом случае я обычно сначала пишу модульные тесты для компонентов, благо все современные фреймворки это позволяют, а затем пишу тестовые сценарии для пользовательского интерфейса, используя Selenium-Webdriver.


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


На мой субъективный взгляд и опыт TDD не очень модная тема в отрасли. Я много общался с разработчиками из разных команд. Это были и крупные компании и совсем маленькие коллективы. Никто не сознался в том, что пишет тесты. Я лично знаю лишь пару программистов, которые всегда пишут тесты, потом код. Так что считаю что мы вымирающий вид. Технологические динозавры. Потому что сам подход разработки через тестирование был придуман Кентом Беком достаточно давно, если судить даже по человеческим меркам.

Так что считаю что мы вымирающий вид. Технологические динозавры.
Не соглашусь. У нас, по сравнению с остальными есть преимущество в качестве и в экономике проекта. Эволюционно именно команды использующие TDD или просто автоматические тесты выигрывают на длинной дистанции.
Эволюционно именно команды использующие TDD или просто автоматические тесты выигрывают на длинной дистанции.

Коллега! Это неоспоримый факт! На длинной дистанции мы молодцы! Но где они? Эти команды? Лично я не знаю ни одной такой команды.


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

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

Тут не совсем понятно, бизнес не рассчитывает на окупаемость вложений? Ресурсы вкладываются просто так?
Тут не совсем понятно, бизнес не рассчитывает на окупаемость вложений? Ресурсы вкладываются просто так?

Поторопился и неправильно сформулировал.


Последние 7 лет программирую в восновном финансовые приложения и автоматизацию для бизнеса. Несколько новых проектов подряд в виде стартапов. Управленческий подход такой — "быстро, за полгода пишем сложную бизнес систему без всяких тестов, успешно выводим ее на рынок, потом, когда cash flow наладится, будем приводить все в порядок". Вот это я обозначил термином "быстрый перепихон".

Понял.
Подход имеет право существовать. Заказчик — барин.
Интересно было бы узнать как управленец в целом видит разработку, управление инженерными рисками, и как он это все оценивает.

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

И, я думаю, будет прав. Написание юнит-тестов должно быть включено в эстимейт. У меня на практике получается, что при TDD вместо ручного тестирования после каждой итерации, время на разработку уходит такое же или лишь немногим больше, чем без тестов. Естественно, стараюсь покрывать happy path и ожидаемые ошибки.
Для долгоживущего проекта с «долгоживущим» на одной работе программистом, тесты – маст хэв. Просто через пару лет так закопаешься, что будешь только сидеть и баги фиксить, при этом внося по 1 новому багу на каждый исправленный. Причем новый баг найдется далеко не факт что скоро, и проявится где-то у заказчика.

Для современных историй, когда работаешь на одном месте год, осваиваешь новую для себя технологию, дописываешь соответствующую строчку в резюме и уходишь в новую компанию с повышением (а оставшиеся ещё несколько лет разгребают твоё legacy), затем goto 1 повторяешь, пока не становишься тимлидом, тесты писать не обязательно, можно и так успешно расти и развиваться.

Бизнес, как правило, вольно или невольно (по глупости) выбирает именно второй вариант, не поощряя первый, ну да туда ему и дорога, в принципе.
В проектах тестов почти нет, проекты успешные, большие и старые. Delphi. Как-то справляемся без тестов. Разве что веб-сервер нагрузочными покрыт хорошо.
А есть у вас опыт проектов с юнит тестами? Успешный проект, большой и долгий, где скажем количество тестов больше 1000?
У нас несколько проектов порядка миллиона строк каждый. Автоматическое тестирование почти не применяется, проектам 15+ лет. В других крупных проектах не участвовали. Тестирование не применяем из-за почти отсутствующих деградаций кода. Вот — как раз сейчас была рефакфторинг-версия, несколько десятков тысяч исправлений, сломалось 2-3 места которые почти сразу 'высыпались'.
Мы не то, что бы против тестов. Просто тесты — очень дорогое удовольствие, не прижились. Не дают почти никакой отдачи. Ну вот у нас — так.
Из особенностей кода. Код очень сильно связан. Копипасту максимально рефакторим. Стараемся, что бы код как можно раньше 'высыпался', есть заметное число ассертов и еще некоторые техники, помогающие максимально улучшить код без тестов.
Ссылку на софт если интересно, кину в личку.
Просто тесты — очень дорогое удовольствие
Вы не расскажите, как вы пришли к выводу, что это дорогое удовольствие?
Могу я предположить, что у вас уходило много усилий, что бы разобраться, как их эффективно писать?
По времени написания тестов. Оно, если делать тесты хорошо, занимает примерно как код. Соотвественно производительность падает примерно в два раза. А хочется что бы производительность не только не падала, но и росла. Увы, но тесты нам почти ничего не дают кроме увеличения времени на разработку.

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

Кроме того, продуманность архитектуры и тестируемость проекта.

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

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

Ну так бейте большие куски на маленькие, тестируемые unit-ы, а уж потом собирайте из них большие куски, для которых тоже сначала пишите тесты. Single Responsibility Principle очень удобная штука.


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

Ну так бейте большие куски на маленькие, тестируемые unit-ы, а уж потом собирайте из них большие куски, для которых тоже сначала пишите тесты. Single Responsibility Principle очень удобная штука.

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

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

Тут программисту важно понимать, экономические последствия своих решений. Если это proof of concept, то его нужно сделать быстро, не заботясь о качестве. Эта работа — одноразовая. Если нам нужно сделать быстро, качественно и дешево, то ищем другой проект ;-).

Есть и другой аспект, а как ценить влияние тестов на качество архитектуры проекта? А они влияют. Скажем, если хочется сгруппировать тесты, то скорее всего нарушен принцип Single responsibility и можно изменить композицию продакшн юнитов. Если количество тест кейсов больше 7, то с продакшен юнитом что то не так. Тесты помогают вывести улучшенную версию кода. Но архитектура проекта — это внутренний показатель (попробуй его еще оцени) и напрямую его не видно.
Sign up to leave a comment.

Articles