Является ли тестирование единиц стоит усилий, в большой и старой (5yr) кодовой базе?

Я только что присоединился к команде, которая работает в основном режиме всегда в течение последних 5 лет (проект java, maven). Следовательно, планы по использованию единичного тестирования всегда были в стадии разработки, никогда не материализуясь (пока). Большая команда разработчиков обеспечила хорошее качество кода, и не существует проблем с структурным кодом, но нет никакой культуры написания тестов jnuit. Но я, увидев преимущества модульного тестирования, стал единственным воином, который настаивал на принятии автоматического тестирования.

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

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

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

Что бы вы сделали на моем месте?

P.S.: Я знаю аналогичный вопрос в qaru.site/info/13077/..., но в этом цель состоит в том, чтобы убедить различных заинтересованных сторон и лучший путь к такелу; не сравнение технологий.

Ответ 1

Похоже, у вас неплохая ручка в ситуации.

Две вещи:

  • Не ожидайте, что сможете полностью unit test создать 5-летний проект. Предполагая, что 5 разработчиков работают 5 лет, вы находитесь в районе 50 000 часов программиста. Предполагая, что тесты требуют времени, необходимого для написания кода, вы бы неплохо получали 2-3% покрытия в год.

  • Итак: протестируйте новый код и напишите тесты для модификации более старого кода. Получите время/время, чтобы настроить CI. Постепенно вы создадите хорошую батарею тестов.

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

Ответ 2

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

С большим существующим приложением, которое не имеет охвата тестирования на данный момент, вы не захотите сесть и написать тесты всего за один раз, чтобы получить 100% -ный охват unit test, и вы никогда этого не сделаете. Вы просто выделили определенную функциональность для тестирования. Я не думаю, что есть такая вещь, как слишком мало или слишком поздно; модульные тесты только для небольшого числа очень важных функций лучше, чем вообще, и некоторые модульные тесты теперь лучше, чем никакие юнит-тесты.

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Я бы не писал тесты только для написания тестов. Каким будет бизнес-выигрыш? Вероятно, ваш бизнес уже подвергся воздействию не единичных тестов, и теперь проблемы были устранены. Если бы я добавил тесты, я бы добавил их только к разделам кода, которые могли бы вызвать самые неприятные результаты. Например, я бы подумал о добавлении тестирования к любому коду, связанному с ролью/безопасностью.

Ответ 7

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

  1. Приводим пример: это из реального опыта, когда я возглавлял небольшую подгруппу разработчиков, которые работали над большим модулем, который должен был быть поставлен в течение 6 месяцев, и была другая подгруппа с аналогичной задачей ( другой модуль). Мы решили принять практику автоматизации тестирования (модульное тестирование, тестирование API и т.д.) С полным рвением против обычной практики, распространенной в других командах. Я мог видеть разницу, когда различные модули проходили циклы качества перед финальным запуском. Наш модуль, благодаря надежному тестовому покрытию, обнаружил очень мало дефектов по сравнению с другими модулями, разработанными для запуска. Результат, заинтересованные стороны бизнеса и менеджеры по доставке были впечатлены и спросили, что мы сделали по-другому, что привело к повышению качества. Для команды у нас было свободное время перед стартом с другими подгруппами, которые трудились днем и ночью, чтобы добраться до финиша. В следующем выпуске мы внедрили многие из методов для подгрупп в одной и той же программе и естественным образом применили в качестве стратегии тестирования.
  2. Для унаследованного приложения убедитесь, что каждая ошибка, которую вы сообщаете о качестве, выпуске или производственной среде, также получает покрытие модульных тестов для исправления, которое делает команда. Таким образом, вы добавите тестовые случаи, где они наиболее важны.
  3. Для новых разработок всегда пишите кейсы для новых историй.
  4. Используйте программное обеспечение для управления версиями, чтобы узнать, какая часть вашей кодовой базы меняется чаще других. Эти области могут стать центром привлечения их к тестированию.