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

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

Но как можно реализовать TDD с таким количеством написанного кода? С чего начать - с функций низкого уровня?

Или нам уже поздно начинать TDD?

14
Reinstate Monica - Goodbye SE 8 Июл 2010 в 17:52

2 ответа

Лучший ответ

Начните с Эффективная работа с устаревшим кодом.

Это не совсем TDD, если вы начинаете с устаревшего кода, но все ваше кодирование может быть TDD. Решая новую проблему, напишите для нее тест. Если вы не можете, потому что унаследованные классы слишком сложно тестировать, тогда начните писать для них тесты, отсекая биты и покрывая биты тестами.

Рефакторинг низко висящего фрукта.

Чтобы избежать повторения дефектов: на примере дефекта напишите тест, который его продемонстрирует. Это может быть относительно широкий тест, который просто моделирует активность пользователя; еще не юнит-тест. Убедитесь, что тест не прошел. Проведите свое исследование; выяснить, почему тест не проходит. Теперь - это важно - прежде чем исправлять ошибку, напишите модульный тест, демонстрирующий ошибку. Исправьте ошибку, и теперь у вас есть два теста, по крайней мере один из них быстрый, которые защищают вас от регрессов.

25
Carl Manaster 8 Июл 2010 в 17:56
4
+1: Главное здесь - не пытаться полностью модифицировать модульные тесты.
 – 
Richard
8 Июл 2010 в 17:57
1
- красивое резюме. Мне особенно нравится, как у вас есть модульный тест и системный текст по дефекту.
 – 
Reinstate Monica - Goodbye SE
8 Июл 2010 в 18:50
- Я озадачен - разве это не противоположность тому, что говорит Карл?
 – 
Reinstate Monica - Goodbye SE
8 Июл 2010 в 18:51
2
@Mark, я думаю, мы с Ричардом согласны; ключ «всесторонне». Если вы пройдетесь по устаревшей базе кода и попытаетесь охватить все, прежде чем двигаться вперед, вы ничего не добьетесь (и вам нечего показать). Беритесь только за то, над чем вам нужно работать; со временем ваша система становится достаточно хорошо протестированной, и по ходу вы добавляете функциональность (или, по крайней мере, удаляете ошибки).
 – 
Carl Manaster
8 Июл 2010 в 18:56
1
- определенно, иначе вы просто добавляете тесты в унаследованный код ... тогда ваш новый код быстро становится унаследованным кодом! :)
 – 
Reinstate Monica - Goodbye SE
8 Июл 2010 в 21:22

Поскольку Карл предложил одну книгу, я предлагаю другую: Искусство модульного тестирования Роя Ошерова целая глава посвящена работе с устаревший код ". Я еще не читал эту главу, но первые 5 глав превосходны, и я с нетерпением жду этого.

2
orbfish 8 Июл 2010 в 20:32
К вашему сведению, мне понравилось сравнение Ошерова определений для устаревшего кода: «исходный код, который относится к технологии, которая больше не поддерживается» «любое более старое приложение, находящееся на обслуживании», «код, который работает», «код без тестов» (из книги Фезерса)
 – 
orbfish
8 Июл 2010 в 20:35
- Спасибо за совет. Возможно, после прочтения вы вернетесь и поделитесь своими мыслями?
 – 
Reinstate Monica - Goodbye SE
8 Июл 2010 в 21:21