- Я говорю о модульных тестах в смысле TDD. (Не автоматизированная «интеграция», или то, что вы любите называть тестами.)
- Устаревший код как в: (C ++) код без тестов. (см .: « Эффективная работа Майкла Фезерса с устаревшим кодексом» )
- Но также унаследованный код, такой как: Код, с которым наша команда работала последние 10-5 лет, поэтому мы очень часто имеем хорошее представление о том, где что-то изменить.
- У нас есть модульные тесты (через Boost.Test) для некоторых модулей, которые пришли позже или были «естественными» для модульных тестов (общие контейнеры для конкретных приложений, строковые вещи, сетевые помощники и т. Д.)
- У нас пока нет надлежащих автоматических приемочных испытаний.
Недавно у меня было «удовольствие» реализовать 3 новые функции, ориентированные на пользователя.
Каждое из них заняло у меня около 1-2 часов, чтобы освоиться с частями кода, которые мне нужно было изменить, 1-2 часа, чтобы реализовать (маленький) код, который мне нужно было изменить, и еще 1-2 часа, чтобы убедиться, что приложение побежал правильно после этого и сделал, это должно было сделать.
Теперь я действительно добавил немного кода. (Я думаю, один метод и несколько линий вызова для каждой функции.)
Извлечение этого кода (с помощью любого из методов, предложенных в WEwLC ), чтобы модульный тест имел смысл (а не полную тавтологию), легко занял бы еще 2-4 часа, если не больше. Это добавило бы 50% -100% времени к каждой функции, без немедленной выгоды, так как
- Мне не нужен юнит-тест, чтобы понять что-нибудь о коде
- Ручное тестирование - это тот же объем работы, который мне все еще нужно проверить, правильно ли код интегрирован в остальную часть приложения.
Конечно, если позже «кто-то» придет и коснется этого кода, он теоретически может получить некоторую пользу от этого модульного теста. (Только теоретически, поскольку этот проверенный островок кода будет жить в океане непроверенного кода.)
Итак, «на этот раз» я решил не выполнять тяжелую работу по добавлению модульного теста: изменения кода, чтобы получить этот тестируемый материал, были бы значительно более сложными, чем изменения кода, чтобы правильно (и безошибочно ) реализовать эту функцию .
Это что-то типичное для сильно связанного унаследованного кода? Я ленивый / мы устанавливаем неправильные приоритеты как команда? Или я осторожен, только проверяю вещи, где накладные расходы не слишком высоки?