Разделы портала

Онлайн-тренинги

.
Шаблоны тестирования xUnit. Рефакторинг кода тестов.
09.02.2009 22:03

Автор обзора: Виктор Кулямин

Название: Шаблоны тестяирования xUnit. Рефакторинг кода тестов.

Оригинальное название: xUnit Test Patterns: Refactoring Test Code

Автор: Джерард Месарош (Gerard Meszaros)

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

Книга содержит изложение основных понятий подхода к разработке ПО на основе тестирования (test driven development, TDD) и большой, хорошо структурированный набор образцов (шаблонов, patterns) проектирования и кодирования модульных тестов. Автор попытался, и довольно успешно, создать справочник по таким образцам, который существенно расширяет и дополняет книгу К. Бека «Экстремальное программирование. Разработка через тестирование» (Test-Driven Development: By Example) — те, кто читал ее, найдут для себя как много знакомых вещей, так и огромное количество нового. У книги есть сопровождающий сайт http://xunitpatterns.com/, где выложен не весь ее текст, но зато каталог образцов представлен в более удобной для быстрого получения нужной информации форме.

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

Для человека, знакомого с классическими источниками по тестированию ПО (Майерс «Искусство тестирования программ», Бейцер, но не переведенное «Тестирование черного ящика», а гораздо более ясные и систематичные «Software Testing Techniques», Binder «Testing Object-Oriented Systems» и пр.) эта книга может выглядеть двояко. С одной стороны, в ней говорится много очень правильных и полезных вещей, относящихся к самой сути программной инженерии. С другой — многие идеи и понятия, сформулированные классиками тестирования еще в 80-е годы, часто преподносятся как нечто новое, открытое только в сообществе XP и TDD. Довольно забавно читать, как для хорошо известной тестовой заглушки (test stub) вводится новый термин — «тестовый двойник» (test double). При этом заглушкой называется двойник некоторого специфического вида, и определяется такая навороченная классификация двойников, в которой большинство последователей TDD путается, предпочитая называть все подряд «фиктивными объектами» (mocks; предложенный перевод «подставной объект» имеет, по-моему, какой-то нехороший двойной смысл). Кажется, что от этого отсутствия исторической перспективы теряется часть глубины представленных идей, и они иногда приобретают более сиюминутный, как бы «ориентированный на продажу» вид.

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

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