Сколько единиц тестирования - это хорошо?

(Нет "связанных вопросов", похоже, это гвоздь, поэтому здесь идет.)

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

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

Как вы находите здоровый, оправданный баланс?

Изменить: ответить на несколько вопросов, которые подняли разумные люди...

  • Продажи не запускают этот процесс, но они, безусловно, имеют ввод и должны иметь ограниченный ввод в любой группе. Это те, кто оплачивает счета. Если они полностью управляют всем, это было бы необоснованно, очевидно.

  • Я уверен, что лучшего ответа нет, но мне любопытно, что другие люди считают разумным. Я ожидаю обоих крайностей (все! Ничего!), И много в середине.

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

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

Любые идеи о том, как оправдать что-то проактивное?

Ответ 1

Два предложения для минимального модульного тестирования, которые обеспечат самый "удар по доллару":

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

Если ошибка исправлена, напишите unit test, который бы ее обнаружил.

Ответ 2

Это, я думаю, ошибочность:

Если вы тестируете каждый класс, каждый метод, ваш текущий выпуск займет больше времени, возможно, намного дольше.

Тестирование - особенно первое испытание - улучшает наш поток, удерживает нас в зоне, фактически ускоряет нас. Я делаю работу быстрее, потому что я тестирую. Он не проверяет, что замедляет нас.

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

Ответ 3

Что мне посоветовало следующее:

  • Попробуйте, как вы думаете; Через некоторое время оцените себя:
  • Если тестирование тратит больше времени, чем вы чувствовали, было разумно, и у вас было слишком мало возврата к инвестициям, протестируйте меньше.
  • Если ваш продукт был достаточно проверен и вы потеряли время, проверьте больше.
  • Петля при необходимости.

Другой алгоритм:: -)

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

ОБНОВЛЕНО для комментария, о подтверждении полезности некоторых тестов (те, в которые вы твердо верите):

Я часто рассказываю своим младшим коллегам, что мы, технические люди (разработчики и т.п.), испытываем недостаток в связи с нашим менеджментом. Как вы говорите, для управления расходы, которые не перечислены, не существуют, поэтому они избегают их, не могут служить оправданием других затрат. Я тоже был разочарован этим. Но, думая об этом, это самая суть их работы. Если бы они не принимали ненужных затрат без оправдания, они были бы бедными менеджерами!

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

  • В месте, где вы отслеживаете время, которое вы тратите, обратите внимание отдельно на затраты, которые исходят из кода, который не тестировался (если он недоступен в инструменте, добавьте его в качестве комментария)
  • Совокупность этих затрат в отдельном отчете, если инструмент не работает, так что каждую неделю ваш менеджер читает, что X% вашего времени тратилось на
  • Каждый раз, когда вы оцениваете нагрузки, оцениваете отдельно несколько параметров с автоматическим тестированием или без него, показывает время, затрачиваемое на ручное тестирование или автоматическое тестирование, примерно одинаковое (если вы ограничиваете себя самым полезным тесты, как объяснялось ранее), в то время как последний является активом против регрессий.
  • Связать ошибки с исходным кодом. Если ссылка отсутствует в вашем процессе, найдите способ их подключения: вам нужно показать, что ошибка возникает из-за отсутствия автоматических тестов.
  • Накопить также отчет о тех ссылках.

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

Ответ 4

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

Затем, как только вы получите доверие, и они увидят значение, начните добавлять менее проблемные области, пока не начнете замечать, что ROI просто больше не существует.

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

Ответ 5

"Стоимость" оплачивается во время разработки, когда она намного экономичнее, а возврат осуществляется при текущем обслуживании, когда исправлять ошибки гораздо труднее и дороже.

Обычно я выполняю модульное тестирование на методах, которые:

  • Чтение/запись в хранилище данных
  • Выполнить бизнес-логику и
  • Подтвердить ввод

Тогда для более сложных методов я буду unit test те. Для простых вещей, таких как getter/seters или простой математический материал, я не тестирую.

При обслуживании большинство легитимных отчетов об ошибках получают unit test, чтобы гарантировать, что конкретная ошибка больше не повторится.

Ответ 6

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

Не каждому методу/функциям нужен unit test. Может потребоваться следующее. (1) Тот, который явно не является сложным, как просто get/set, небольшое условие или цикл. (2) Тот, который будет вызываться другим методом, который имеет модульные тесты.

С этими двумя критериями, я думаю, вы можете сократить многие из них.

Просто мысль.

Ответ 7

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

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

Ответ 8

Испытайте достаточно, чтобы вы чувствовали себя комфортно, что плохие рефактористы поймают тесты. Обычно это достаточно для проверки логики и кода сантехники/проводки. Если у вас есть код, который по существу является getter/seters, зачем тестировать их?

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

Ответ 9

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

Разработка, управляемая тестированием

Это должно сэкономить вам много времени и не создавать значительного количества накладных расходов. Надеюсь это поможет! Если да, отметьте его.

Ответ 10

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

Наш сервисный уровень - это ТОЛЬКО способ взаимодействия с базой данных (через методы на уровне данных).

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

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

Наши объекты не проверяются модулем, кроме, кстати, через тесты уровня обслуживания. Они также имеют тенденцию быть "немыми" объектами - большинство из них не имеют методов, кроме требуемых (например, Equals() и GetHastCode()).

Ответ 11

Цель тестирования разработчиков - ускорить разработку готового программного обеспечения с приемлемым уровнем качества.

Это приводит к двум оговоркам:

  • вполне возможно сделать это неправильно, так что это фактически замедлит вас. Поэтому, если вы обнаружите, что это замедляет вас, очень вероятно, что вы делаете это неправильно.
  • Ваше определение "приемлемого качества" может отличаться от определения маркетинга. В конечном счете, они правы или, по крайней мере, имеют последнее слово.

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

Ответ 12

Сколько единиц тестирования - хорошая вещь:

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

В основном тестирование устройства должно выполняться каждый раз: 1) вы исправляете

2) Новая версия

3) Или вы обнаружите новый выпуск

Я не упоминал период разработки, так как в этот период ваш тест уровня подразделения развивается.

Основная вещь здесь не количество (сколько), но покрытие вашего unit test

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

Итак, ваш unit Test должен проверить:

1) Каждый интерфейс

2) Все операции ввода/вывода

3) Логические проверки

4) Специфичные для приложения результаты

Ответ 13

Я бы посоветовал собрать книгу The Art of Unit Testing. В главе 8 описывается интеграция модулей в вашу организацию. Там отличная таблица (стр. 232), которая показывает результаты двух командного испытания (один из которых использует тесты, один без); испытательная группа сбрила два дня с их общего времени выпуска (включая интеграцию, тестирование и исправление ошибок) и имела 1/6 ошибок, обнаруженных в производстве. В главе 9 обсуждается анализ осуществимости теста для получения наиболее вероятного кода с устаревшим кодом.

Ответ 14

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

Часто тестируйте раннее тестирование и проверяйте его как можно практичнее!

Ответ 15

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

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

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

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