Обзор книги The Art of Unit Testing: with examples in C#

The Art of Unit Testing: with examples in C#Книга была опубликована под занавес 2013 года и это уже второе её издание. Автором книги является Рой Ошеров(Roy Osherove), который вряд ли известен широкому кругу читателей, тем более читателям моего блога, который в большей степени посвящён C++. Тем не менее, книгу Рой Ошеров написал хорошую, но я забегаю вперёд.

Впервые книгу я прочитал довольно давно, и читал я ещё первое издание. Кроме того, читал я её тогда, когда с .NET в общем и с C# в частности я не был знаком совершенно. И это мне совершенно не помешало прочитать и понять всё, что в ней написано. Поэтому, пусть вас не вводит в заблуждение «examples in C#»: это не является проблемой т.к. примеры предельно просты. Единственная проблема, которую составляют примеры на C#, заключается в том, что если вы пишите на C++, то настолько же элегантно писать тесты на C++ получится,— нужна рефлексия и другие механизмы. Соответственно, может развиться некоторая форма зависти и комплекса неполноценности, но это не критично.

Так как автор не является ни суровым профессором, ни художественным гением язык книги довольно прост: обычный технический английский. Стиль изложения вытекает из тех же предпосылок: всё довольно стандартно,— от брата программиста, к братьям программистам. Структура книги тоже не пытается быть оригинальной и преподносит текст в последовательном ключе: читать её стоит от корки до корки. Начинается она с представления модульных тестов: что это такое, чем это отличается от тестов интеграционных, и т.п. После этого мы ознакамливаемся с заглушками(stub) и имитациями(mock). Автор ясно даёт понять, что эти понятия совершенно разные, и использовать одно вместо другого значит испортить тест. Вообще, в книге довольно много весьма «жёстких» мнений: ясное дело, автор не философ, но программист. Зато обе темы разобраны довольно хорошо, что позволяет читателю сделать вполне объективный вывод о том, где и когда использовать заглушки и имитации.

После этого идёт пара глав посвящённых использованию заглушек/имитаций на примере различных фреймворков (в большей степени используется NSubstitute, но упоминаются и другие). В этих главах уже можно хорошо познакомится с тем, как можно работать с внешними зависимостями в модульных тестах. Далее идёт часть посвящённая вопросу написания хороших тестов и их организации. Речь будет вестись о том, как и куда помещать тесты, об автотестах и т.п. Также будут рассмотрены разнообразные хорошие практики написания модульного теста: что стоит помещать в оный, чего лучше избежать, как подойти к процессу именования теста, какого он должен быть размера и т.п.

Наконец, последняя часть книги посвящена, наверное, самому сложному вопросу: как начать писать тесты, вернее, что делать если ваш менеджмент не понимаете зачем они нужны. На самом деле я не уверен, что эта глава кому-то поможет, т.к. те кто про тесты и слышать не хочет, ни за что не согласятся их внедрять, а те кто слышал,— уже не против. Хотя я могу и ошибаться. Также в этой же части, рассмотрен вопрос унаследованного (legacy) кода, читай кода без модульных тестов, и вопрос дизайна приложения с оглядкой на модульный тесты. Эта глава тоже интересная, но, на мой взгляд, и без неё книга является вполне завершённой и достаточной.

Итак, разобравшись в общих чертах, что же содержится в книге, предлагаю разобраться для кого и для чего эта книга. Она, безусловно, в первую очередь предназначена для тех людей, кто хочет начать писать модульные тесты, но пока не понимает с какой стороны к ним подступиться. Это книга является отличной отправной точкой в написании тестов — выбирайте её не задумываясь, если относите себя к вышеупомянутой категории. Хочется сразу уточнить, что это книга не по TDD (Test-driven development), который так моден в настоящее время (а где-то уже успел даже выйти из моды!), а именно по модульным тестам. Здесь вам никто не будет навязывать методологию: книга учит написанию тестов, не более того. Что безусловно является её плюсом и помогает новичкам погрузиться в саму суть, не отвлекаясь на различные мантры методологий.

Но если вы не новичок, есть ли смысл читать? Трудно сказать, если вы ас модульного тестирования, то скорее всего эту книгу уже читали, а если нет, то рекомендую ознакомится хотя бы с оглавлением и решить самостоятельно,— книга вряд ли удивит вас чем-то новым, но некоторые вещи можно будет взять на вооружение.

Как я уже сказал, книга является отличной отправной точкой в написании тестов, и, хотя она и является самодостаточной, я рекомендую после этой книги обязательно прочесть Dependency Injection in .NET, потому что без нормального понимания как внедрять зависимости, у вас вряд ли получится писать хорошие модульные тесты. Конечно, азы внедрения зависимостей рассмотрены и в этой книге тоже, но не настолько полно, как в Dependecy Injection.

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