Есть ли веские доказательства окупаемости модульного тестирования?

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

Какие есть доказательства? Кто-нибудь на самом деле разработал одно и то же программное обеспечение двумя отдельными командами, одна из которых использовала модульное тестирование, а другая нет, и сравнила результаты? Я сомневаюсь. Должен ли я просто оправдать это словами: «Поищи это в Интернете, все об этом говорят, так что это, должно быть, правильное решение»?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
128
0
13 161
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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

Редактировать: например, как указывалось, книга «Код завершен» сообщает о таких исследованиях (параграф 20.3, «Относительная эффективность методов обеспечения качества»). Но есть и частные исследования в сфере консалтинга, подтверждающие это.

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

Robert Rossney 26.10.2008 01:27

Это не связано с методом тестирования, а с тем, когда в процессе сообщается об ошибке, и в дальнейшем было бы лучше потратить время на поиск ошибок в спецификациях, поскольку стоимость их исправления при их обнаружении при разработке сообщается в 1000 раз дороже ( коэффициент 10 на этап разработки)

Rune FS 23.03.2014 12:46

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

LKM 09.07.2019 12:06

Мы убедительно продемонстрировали, что можно писать дрянное программное обеспечение без модульного тестирования. Я считаю, что есть даже свидетельства того, что с помощью модульного тестирования существует дрянное ПО. Но суть не в этом.

Модульное тестирование или разработка через тестирование (TDD) - это метод проектирования, а не метод тестирования. Код, написанный на основе тестов, полностью отличается от кода, который таковым не является.

Хотя это не ваш вопрос, мне интересно, действительно ли это самый простой способ пойти по дороге и ответить на вопросы (и привести доказательства, которые могут быть опровергнуты другими сообщениями), которые могут быть заданы неправильно. Даже если вы найдете веские доказательства в пользу своего дела - кто-то другой может найти веские доказательства против.

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

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

Слушайте, слышите :) Многие неопровержимые доказательства TDD также исходят от очень опытных команд, которые и без того добивались хороших результатов. TDD просто улучшили свои результаты, а не создавали их на пустом месте. Настоящая рентабельность инвестиций - это нанять приличных программистов и позволить им решать, как что-то делать.

workmad3 26.10.2008 01:17

«Счетчики бобов должны определять, как должны работать технические специалисты?» -> все бизнес-решения сводятся к деньгам. Тем не менее, хороший ответ, +1

jcollum 17.02.2009 20:23

@jcollum, но то, как вы выполняете свою работу, не имеет ничего общего с деньгами, и если вы хотите, чтобы один из них был подотчетен, вы позволяете им решать, КАК они делают то, ЧТО вы их просили

Rune FS 23.03.2014 12:50

TDD - это не метод проектирования, это просто метод кодирования. blog.ploeh.dk/2010/12/22/TheTDDApostate Многие комментаторы не согласны с тем, что TDD включает рефакторинг (который является методом проектирования), но рефакторинг не подразумевает TDD. Можно провести рефакторинг без тестов, большой сложный рефакторинг в любом случае влияет на модульные тесты, т.е. тесты тоже нужно реорганизовать, поэтому они могут стать недействительными / ложно-зелеными; более простые рефакторинги не влияют на тесты, но риск ошибки ниже, потому что рефакторинг прост.

KolA 07.03.2019 06:08

@KolA ну, с отражением 10,5 лет после этого ответа, я могу сказать, что сегодня это немного более оборонительно, но все же: я не спорю, что TDD - это метод проектирования единственный, который вам когда-либо понадобится, и Марк начинает с хороший дизайн техники, прежде чем сделать вывод, что это совсем не так. Я бы ослабил его мнение и сказал, что не должен - это метод проектирования Только. Каждый код, который Я когда-либо писал TDD, отличается от кода, без которого я писал. Я бы назвал это результатом дизайна. Я лучше всего работаю с доской, обсуждениями и другими инструментами в дополнение к TDD. Но спасибо за ссылку

Olaf Kock 07.03.2019 09:24

Я использую другой подход к этому:

Какая у вас уверенность в том, что ваш код верен? Или что это не нарушает предположение X, когда кто-то из вашей команды изменяет func1 ()? Я не уверен, что без юнит-тестов, поддерживающих вашу «честность», у вас будет много уверенности.

Интересна идея обновления тестов. Сами тесты менять нечасто. У меня в 3 раза больше тестового кода по сравнению с производственным кодом, и тестовый код был немного изменен очень. Однако это то, что позволяет мне хорошо спать по ночам и то, что позволяет мне сказать клиенту, что я уверен, что смогу реализовать функциональность Y, не нарушая работу системы.

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

Вот где это окупается: 1) вы уверены в своем коде и 2) вы обнаруживаете проблемы раньше, чем в противном случае. У вас нет такого специалиста по контролю качества, который сказал бы: «Эй, вы не потрудились проверить границы функции xyz (), не так ли? Он не может найти эту ошибку, потому что ты обнаружил ее месяц назад. Это хорошо для ему хорошо для вас, хорошо для компании и хорошо для клиента.

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

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

itsmatt 26.10.2008 02:04

Полностью согласен с тем, что модульное тестирование заставит вас больше думать о своем дизайне и правильности, а не безрассудно кодировать

chakrit 26.10.2008 02:28

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

Thomas Eyde 26.10.2008 02:47

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

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

Я привык сначала программировать снизу и использовать REPL, поэтому, когда я получил модульный тест (один тест для каждой функции), это было похоже на возвращение REPL к языкам, которые очень часто компилируются. Это вернуло веселье каждой строчке кода, который я написал. Я чувствовал себя богом. Мне понравилось. Мне не нужен был отчет, в котором говорилось бы, что я начал писать более качественный код быстрее. Моему боссу не нужен был отчет, чтобы заметить, что из-за того, что мы занимались сумасшедшими вещами, мы ни разу не пропустили дедлайн. Моему начальнику не нужен был отчет, чтобы заметить, что количество «простых» ошибок упало с (до многих) почти до нуля из-за этой очень странной вещи, связанной с написанием непродуктивного кода.

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

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

Я просто начинал использовать его всякий раз, когда мне нужно было написать что-то новое. Есть старая поговорка, которую мне трудно перевести на английский, но:

Start with something so simple that you don't notice that you do it. When training for a marathon, start by walking 9 meters and run 1 meter, repeat.

Итак, я должен просто сделать это? Это гарантированно сработает, и неважно, если со мной этого никто не сделает?

raven 26.10.2008 01:39

Собственно, это тест Джоэла: joelonsoftware.com/articles/fog0000000043.html. Мне кажется, у вас может быть больше проблем, чем отсутствие Нобелевской премии исследования по модульному тесту.

Jonke 26.10.2008 03:07
Ответ принят как подходящий

да. Это связь исследования Боби Джорджа и Лори Уильямс из NCST и Другая Нагаппана и др. Я уверен, что есть еще кое-что. Доктор Вильямс публикации о тестировании может стать хорошей отправной точкой для их поиска.

[РЕДАКТИРОВАТЬ] В двух вышеупомянутых документах конкретно упоминается TDD и показано увеличение начального времени разработки на 15-35% после принятия TDD, но снижение на 40-90% дефектов до выпуска. Если вы не можете получить полнотекстовые версии, я предлагаю использовать Google Scholar, чтобы посмотреть, сможете ли вы найти общедоступную версию.

Первое исследование сравнивает Agile + TDD с проектами водопада, его результаты были бы более актуальными, если бы в нем сравнивались две agile-команды. Во втором исследовании упоминаются другие исследования, которые практически не обнаружили бонусов за качество для проектов TDD. И когда вы сравниваете оценки руководства о необходимом дополнительном времени для TDD, это значительно выше для двух команд с большим опытом в предметной области, но при этом их охват тестированием на 20% ниже. Это подтверждает мой собственный опыт, я считаю, что уверенность намного важнее в системах, с которыми я еще не работал, а тестирование является препятствием для всего остального.

LearnCocos2D 14.10.2013 21:45

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

Rune FS 23.03.2014 12:40

Так что, если стоимость исправления ошибок после выпуска составляет 0,01% от общей суммы разработки? В таком случае TDD будет ужасной инвестицией. А если багов мало? Эти% s ничего не значат без контекста. Честно говоря, я еще не прочитал все исследование. Но в нынешнем виде ваш пост полезен (хорошие ссылки), но не отвечает на вопрос о рентабельности инвестиций, IMO.

Instine 13.06.2014 14:56

@Instine К счастью (?) Есть веские доказательства того, что это не так. Исправление ошибок после выпуска экспоненциально дороже, чем ошибки, обнаруженные на ранней стадии разработки (что и делает TDD). В этом контексте затраты в 0,01% от общего объема разработки для всех ошибок после выпуска кажутся маловероятными. (Подробнее см. Код завершен, в частности Boehm и др., «Понимание и контроль затрат на программное обеспечение», IEEE Trans Softw Eng (1988)).

Konrad Rudolph 04.11.2014 13:52

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

Zachary Yates 14.06.2018 19:31

"Я должен убедить других программистов и, что более важно, счетчиков компонентов в управлении, что все дополнительное время, потраченное на изучение среды тестирования, написание тестов, поддержание их в обновлении и т. д., Окупится само за себя, а потом еще немного. "

Почему?

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

Обучение фреймворку занимает очень мало времени.

Написание одного теста, всего одного, занимает очень мало времени.

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

Это все, что нужно. Никто не должен знать, что вы это делаете. Просто сделай это.

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

Thomas Eyde 26.10.2008 02:54

Просто сделайте это и не говорите им, а продайте идею своим колледжам во время перерыва на кофе ;-)

Johan 17.02.2009 23:06

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

Graviton 05.11.2009 17:52

@Ngu Soon Hui: Они не только так скажут, но и обратное: «даже если модульный тест работает для вас, мне он не нужен, потому что мои проекты проще, чем ваши». Люди придумывают массу причин избегать «работы», выполняя больше работы по кодированию, отладке и исправлению, чтобы избежать работы по написанию модульного теста. «Убедить» в чем-либо, кроме удачного примера, сложно.

S.Lott 05.11.2009 18:16

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

Andrew 16.01.2010 08:09

Привет - хорошие комментарии. И вы никогда не услышите, как кто-то из разработчиков, сидящих рядом с вами, говорит "&% ^ # (#) $ & # (Это сработало вчера!". Если бы у них были модульные тесты, они бы точно знали, где он сломался и почему. У нас никогда не было времени, чтобы делай это правильно, но всегда успеваешь сделать это снова и снова, и ... :) привет!

Bill Campbell 13.02.2011 16:18

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

Ran Halprin 29.01.2012 17:00

@Neko: Модульные тесты не добавляют «накладных расходов». Они сокращают общую рабочую нагрузку, предотвращая целый поток глупых ошибок. Работа не растет; он просто переходит от плохого кода к хорошим модульным тестам и хорошему коду.

S.Lott 29.01.2012 18:19

Счетчики bean-компонентов хотят, чтобы их инженеры предоставили надежные решения проблем домена. Вы можете просто написать тесты как часть своего решения. Они даже не заметят. Если они спросят, вы можете просто сказать им, что тратите на него больше времени, чтобы убедиться, что он надежный и не требует переделки. Если вы ПРЕДЛАГАЕТЕ написать им модульные тесты, вы спрашиваете их одобрения в том, о чем они ничего не знают.

Yorkshireman 01.11.2017 19:44

Вот отличное и занимательное прочтение о парне, меняющем компанию изнутри. Это не ограничивается TDD. http://jamesshore.com/Change-Diary/ Обратите внимание, что он довольно долго не уговаривал «счетчиков фасоли», а вместо этого использовал «партизанскую тактику».

ссылка выглядит интересной ... стоит проверить re: изменение рабочих процессов организации ...

nasty pasty 18.02.2009 08:13

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

Много месяцев назад я был новым выпускником, работающим над большим проектом VB6, и мне довелось написать большой объем кода хранимых процедур. Подсистема, которую я писал, составляла около 1/4 всей кодовой базы - около 13 000 LOC из 50 000 или около того.

Я написал набор модульных тестов для хранимых процедур, но модульное тестирование кода пользовательского интерфейса VB6 невозможно без таких инструментов, как Rational Robot; по крайней мере, тогда этого не было.

По статистике QA, во всей подсистеме возникло около 40 или 50 дефектов, из которых два возникла из хранимых процедур. Это один дефект на 6500 строк кода против 1 на 1000–1200 или около того по всей части. Также имейте в виду, что около 2/3 кода VB6 было стандартным кодом для обработки ошибок и ведения журнала, идентичным для всех процедур.

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

Больше о TDD, чем строго модульное тестирование, вот ссылка на статью Повышение качества за счет разработки, основанной на тестировании: результаты и опыт четырех промышленных групп, написанную Нагаппаном, Э. Майклом Максимилианом, Тирумалешем Бхатом и Лори Уильямс. статья, опубликованная группой Microsoft Эмпирическая программная инженерия и измерения (ESM) и уже упоминавшаяся здесь.

Команда обнаружила, что команды TDD создали код, который на 60–90% лучше (с точки зрения плотности дефектов), чем команды, не использующие TDD. тем не мение Командам TDD требовалось от 15% до 35% больше времени, чтобы завершить свои проекты.

Если вас также интересуют доказательства против модульного тестирования, вот одна хорошо изученная и продуманная статья:

Почему большинство модульных тестов бесполезно? Джеймс О Коплиен (гуру бережливости и гибкости)

Чтобы добавить больше информации к этим ответам, есть два ресурса для мета-анализа, которые могут помочь выяснить влияние производительности и качества на академическую и отраслевую подготовку:

Введение приглашенных редакторов: TDD - искусство бесстрашного программирования [связь]

All researchers seem to agree that TDD encourages better task focus and test coverage. The mere fact of more tests doesn't necessarily mean that software quality will be better, but the increased programmer attention to test design is nevertheless encouraging. If we view testing as sampling a very large population of potential behaviors, more tests mean a more thorough sample. To the extent that each test can find an important problem that none of the others can find, the tests are useful, especially if you can run them cheaply.

Table 1. A summary of selected empirical studies of test-driven development: industry participants*

https://www.computer.org/cms/Computer.org/dl/mags/so/2007/03/figures/s3024t1.gif

Table 2. A summary of selected empirical studies of TDD: academic participants*

Влияние разработки, основанной на тестировании, на внешнее качество и производительность: метаанализ [связь]

Абстрактный:

This paper provides a systematic meta-analysis of 27 studies that investigate the impact of Test-Driven Development (TDD) on external code quality and productivity.

The results indicate that, in general, TDD has a small positive effect on quality but little to no discernible effect on productivity. However, subgroup analysis has found both the quality improvement and the productivity drop to be much larger in industrial studies in comparison with academic studies. A larger drop of productivity was found in studies where the difference in test effort between the TDD and the control group's process was significant. A larger improvement in quality was also found in the academic studies when the difference in test effort is substantial; however, no conclusion could be derived regarding the industrial studies due to the lack of data.

Finally, the influence of developer experience and task size as moderator variables was investigated, and a statistically significant positive correlation was found between task size and the magnitude of the improvement in quality.

Другие вопросы по теме