Есть ли веские доказательства ROI модульного тестирования? - PullRequest
118 голосов
/ 26 октября 2008

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

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

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

Ответы [ 11 ]

94 голосов
/ 26 октября 2008

Да. Это ссылка на исследование Боби Джорджа и Лори Уильямса в NCST и еще Nagappan et al. Я уверен, что есть еще. Доктор Уильямс публикаций по тестированию может послужить хорошей отправной точкой для их поиска.

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

28 голосов
/ 26 октября 2008

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

Почему?

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

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

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

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

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

15 голосов
/ 26 октября 2008

Я придерживаюсь другого подхода к этому:

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

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

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

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

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

10 голосов
/ 26 октября 2008

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

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

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

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

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

6 голосов
/ 20 октября 2009

Больше о TDD, чем строго модульное тестирование, есть ссылка на Реализация улучшения качества с помощью разработки, основанной на тестировании: результаты и опыт четырех промышленных групп , статья Nagappan, E. Michael Maximilien, Thirumalesh Bhat и Лори Уильямс. статья, опубликованная группой Microsoft Empirical Software Engineering and Measurement (ESM) и уже упоминавшаяся здесь.

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

5 голосов
/ 17 августа 2015

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

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

5 голосов
/ 27 октября 2008

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

4 голосов
/ 13 ноября 2016

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

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

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

Таблица 1. Сводка избранных эмпирических исследований, основанных на тестировании. развитие: участники отрасли *

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

Таблица 2. Резюме отдельных эмпирических исследований TDD: академический Участники *

enter image description here

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

Аннотация:

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

Результаты показывают, что в целом TDD оказывает небольшое положительное влияние на качество, но практически не оказывает заметного влияния на производительность. Тем не менее, анализ подгруппы имеет обнаружил, что как улучшение качества, так и падение производительности намного больше в промышленных исследованиях по сравнению с академическими исследованиями. Большее падение производительности было обнаружено в исследованиях, где разница в усилиях по тестированию между TDD и контрольной группой Процесс был значительным. Большее улучшение качества было также найдено в академических исследованиях, когда разница в тесте существенным; тем не менее, нельзя сделать вывод относительно промышленные исследования из-за отсутствия данных.

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

4 голосов
/ 26 октября 2008

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

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

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

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

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

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

Начните с чего-то настолько простого, что Вы не замечаете, что делаете это. Когда вы готовитесь к марафону, начинайте с 9 метров и бегите 1 метр, повторить.

3 голосов
/ 26 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...