Sep 9, 2007

Анти паттерны Разаработки через тестирование (TDD Anti-Patterns)


Перевод. Оригинал находится в блоге Джеймса Карра.



Недавно начал набрасывать я документ по анти-паттернам в Разработке - Через - Тестирование, и решил сначала разместить общие паттерны в яху группах.

Обратная реакция оказалась замечательной! В общем, пока это просто каталог, надеюсь он будет расширен со временем.


Каталог Анти-паттернов разработки через тестирование.



Лжец(The Liar)



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



Непомерная настройка (Excessive Setup)



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



Гигант (The Giant)



Такой себе тест, которых хотя и тестирует
объект, содержит в себе множество более мелких тестов.
К тому же, он обычно очень длинный и непонятный.
Если у вас появились гиганты, это может означать что
в системе завелись Божественные объекты(англ.).



Симулянт (The Mockery)



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



Инспектор (The Inspector)



Юнит тест, который нарушает инкапсуляцию
(сокрытие данных), в попытке достичь 100% покрытия
тестами. Он слишком пристально следит за
внутренностями объекта под тестом, что любая попытка
рефакторинга сломает тест, его или прийдётся
постоянно исправлять.



Ведмежья услуга (Generous Leftovers)



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



Местный герой (The Local Hero)



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



Педант (The Nitpicker)



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



Секретный ловец (The Secret Catcher)



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



Халтурщик (The Dodger)



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



Крикун (The Loudmouth)



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



Жадный ловец (The Greedy Catcher)



Ловит исключения и проглатывает
информацию о стэке (stack trace). Иногда добавляет
своё сообщение об ошибке, гораздо менее
информативное, иногда просто пишет в лог и идёт тихо
дальше. Противоположность Крикуну.



Аутист (The Sequencer)



Тест, который зависит от последовательности
в непоследовательном списке.



Скрытая зависимость (Hidden Dependency)



Близкая родня Местного героя,
тест который нуждается во внешних данных. Если данные
вдруг не находятся, тест валится и оставляет только
намёки почему. Чтобы его починить, прийдётся
перелопатить тонны кода.



Нумератор (The Enumerator)



Тестовый класс где методы называются с
помощью цифр. Например: test1, test2, ... В
результате Цель теста непонятна, остаётся только
прочитать тест и молится о понятности кода.



Чужак (The Stranger)



Сценарий тестирования, который даже не
принадлежит тесту, в котором лежит. Обычно, он
тестирует другой объект, тесно связанный с объектом
под тестом. При этом он общается с этим объектом
напрямую, игнорируя базовый объект. Известен ещё как
Дальний родственник.



Проповедник системы (The Operating System Evangelist)



Тест, который надеется на
определённый тип Операционной Cистемы. Как пример,
тест который использует символ новой строки для
Windows, не будет работать под Linux.



Успех вопреки всему (Success Against All Odds)



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



Свободная езда (The Free Ride)



Вместо нового сценария для теста,
добавляются утверждения в уже существующий сценарий.



Избранный (The One)



Комбинация Гиганта и Свободной езды.
Содержит в себе один сценарий(тестовый метод),
который тестирует всё что делает объект под тестом.
Часто названия теста и метода совпадают, и метод
содержит много строк настройки и утверждений.



Подглядывающий Мальчик (The Peeping Tom)



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



Философ (The Slow Poke)



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

No comments: