Принципы юнит-тестирования - Владимир Хориков - E-Book

Принципы юнит-тестирования E-Book

Владимир Хориков

0,0

Beschreibung

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

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 341

Veröffentlichungsjahr: 2023

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Владимир Хориков
Принципы юнит-тестирования

Научный редактор Е. Матвеев

Переводчик Е. Матвеев

Литературный редактор А. Руденко

Художник В. Мостипан

Корректоры М. Молчанова (Котова), Г. Шкатова

Владимир Хориков

Принципы юнит-тестирования. — СПб.: Питер, 2020.

ISBN 978-5-4461-1683-6

© ООО Издательство "Питер", 2020

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

Оглавление

Предисловие к русскому изданию
Предисловие к оригинальному изданию
Благодарности
О книге
Для кого написана эта книга
О коде
Форум для обсуждения книги
Об авторе
Иллюстрация на обложке
От издательства
Часть I. Общая картина
Глава 1. Цель юнит-тестирования
1.1. Текущее состояние дел в юнит-тестировании
1.2. Цель юнит-тестирования
1.3. Использование метрик покрытия для оценки качества тестов
1.4. Какими должны быть успешные тесты?
1.5. Что вы узнаете из книги
Итоги
Глава 2. Что такое юнит-тест?
2.1. Определение юнит-теста
2.2. Классическая и лондонская школы юнит-тестирования
2.3. Сравнение классической и лондонской школ юнит-тестирования
2.4. Интеграционные тесты в двух школах
Итоги
Глава 3. Анатомия юнит-теста
3.1. Структура юнит-теста
3.2. Фреймворк тестирования xUnit
3.3. Переиспользование тестовых данных между тестами
3.4. Именование юнит-тестов
3.5. Параметризованные тесты
3.6. Использование библиотек для дальнейшего улучшения читаемости тестов
Итоги
Часть II. Обеспечение эффективной работы ваших тестов
Глава 4. Четыре аспекта хороших юнит-тестов
4.1. Четыре аспекта хороших юнит-тестов
4.2. Связь между первыми двумя атрибутами
4.3. Третий и четвертый аспекты: быстрая обратная связь и простота поддержки
4.4. В поисках идеального теста
4.5. Известные концепции автоматизации тестирования
Итоги
Глава 5. Моки и хрупкость тестов
5.1. Отличия моков от стабов
5.2. Наблюдаемое поведение и детали имплементации
5.3. Связь между моками и хрупкостью тестов
5.4. Еще раз о различиях между классической и лондонской школами юнит-тестирования
Итоги
Глава 6. Стили юнит-тестирования
6.1. Три стиля юнит-тестирования
6.2. Сравнение трех стилей юнит-тестирования
6.3. Функциональная архитектура
6.4. Переход на функциональную архитектуру и тестирование выходных данных
6.5. Недостатки функциональной архитектуры
Итоги
Глава 7. Рефакторинг для получения эффективных юнит-тестов
7.1. Определение кода для рефакторинга
7.2. Рефакторинг для получения эффективных юнит-тестов
7.3. Анализ оптимального покрытия юнит-тестов
7.4. Условная логика в контроллерах
7.5. Заключение
Итоги
Часть III. Интеграционное тестирование
Глава 8. Для чего нужно интеграционное тестирование?
8.1. Что такое интеграционный тест?
8.2. Какие из внепроцессных зависимостей должны проверяться напрямую
8.3. Интеграционное тестирование: пример
8.4. Использование интерфейсов для абстрагирования зависимостей
8.5. Основные приемы интеграционного тестирования
8.6. Тестирование функциональности логирования
8.7. Заключение
Итоги
Глава 9. Рекомендации при работе с моками
9.1. Достижение максимальной эффективности моков
9.2. Практики мокирования
Итоги
Глава 10. Тестирование базы данных
10.1. Предусловия для тестирования базы данных
10.2. Управление транзакциями
10.3. Жизненный цикл тестовых данных
10.4. Переиспользование кода в секциях тестов
10.5. Типичные вопросы при тестировании баз данных
10.6. Заключение
Итоги
Часть IV. Антипаттерны юнит-тестирования
Глава 11. Антипаттерны юнит-тестирования
11.1. Юнит-тестирование приватных методов
11.2. Раскрытие приватного состояния
11.3. Утечка доменных знаний в тесты
11.4. Загрязнение кода
11.5. Мокирование конкретных классов
11.6. Работа со временем
11.7. Заключение
Итоги
Рекомендуем прочитать

Посвящаю моей жене Нине

Предисловие к русскому изданию

Я помню, как начинал работать программистом в 2004 году в небольшой московской компании. В те времена никто не только не писал юнит-тесты, многие даже не знали о такой практике. Сейчас юнит-тестирование — неотъемлемая часть любого сколько-нибудь крупного проекта. Причем неважно, работаете ли вы в России или трудитесь на аутсорсе, навык написания хороших, легких в сопровождении тестов необходим всем.

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

Цель этой книги — не учить пользоваться фреймворками юнит-тестирования или настраивать TeamCity для регулярного прогона тестов, этого материала в интернете предостаточно. Ее цель — собрать воедино всю информацию о написании эффективных, простых в поддержке тестов. Большую часть этой информации можно узнать лишь опытным способом, набив по пути много шишек. Эта книга позволит вам пропустить стадию шишек и перейти сразу к плодам этих проб и ошибок, на что у меня ушло около 10 лет.

Предисловие к оригинальному изданию

Помню свой первый проект, в котором применил юнит-тестирование. Все прошло относительно хорошо, но после того как он был закончен, я взглянул на тесты и подумал, что многие из них были напрасной тратой времени. Большинство моих юнит-тестов тратило изрядную долю времени на настройку ожиданий и плетение сложной паутины зависимостей — и все это для проверки правильности всего трех строк кода в моем контроллере. Я не мог сформулировать, что именно не так с моими тестами, но было стойкое ощущение того, что это не нормально. К счастью, я не отказался от юнит-тестирования и продолжал применять его в последующих проектах. Тем не менее я чувствовал все большее и большее несогласие с общепринятыми (на тот момент) практиками юнит-тестирования. За эти годы я часто писал о юнит-тестировании. В этих статьях мне наконец удалось сформулировать, что пошло не так с моими первыми тестами, и обобщить эти знания для более широких областей юнит-тестирования. Эта книга — результат моих исследований, проб и ошибок, тщательно переработанных, уточненных и собранных в одном месте.

Я получил математическое образование и твердо считаю, что рекомендации в программировании, как и теоремы в математике, должны выводиться из фундаментальных принципов. Я постарался структурировать эту книгу аналогичным образом: не делать поспешных выводов и не выступать с необоснованными заявлениями, а начать с чистого листа: установить фундаментальные принципы и выводить все рекомендации по юнит-тестированию из этих принципов, «с нуля». Интересно, что после установления аксиоматики рекомендации часто выводятся сами собой, как простые следствия.

Юнит-тестирование постепенно становится обязательным требованием для программных проектов, и эта книга даст вам все необходимое для построения хороших и простых в сопровождении тестов.

Благодарности

На написание книги ушло много времени. Хотя я и был к этому готов, работы все равно оказалось намного больше, чем я мог себе представить.

Хочу поблагодарить многих людей: Сэма Зейдела (Sam Zaydel), Алессандро Кампейса (Alessandro Campeis), Фрэнсис Буран (Frances Buran), Тиффани Тейлор (Tiffany Taylor) и особенно Марину Майклз (Marina Michaels), чье бесценное мнение помогло мне поддерживать качество материала на высшем уровне и попутно улучшило мои писательские навыки. Также спасибо остальным сотрудникам Manning, работавшим над книгой в процессе выпуска и оставшимся незамеченными.

Также хочу поблагодарить научных редакторов, которые не пожалели времени на чтение моей рукописи в различных фазах работы и предоставили полезнейшую обратную связь: Аарона Бартона (Aaron Barton), Алессандро Кампейса (Alessandro Campeis), Конора Редмонда (Conor Redmond), Дрор Хелпер (Dror Helper), Грега Райта (Greg Wright), Хемант Конеру (Hemant Koneru), Джереми Ланге (Jeremy Lange), Хорхе Эзекиля Бо (Jorge Ezequiel Bo), Джорта Роденбурга (Jort Rodenburg), Марка Ненадова (Mark Nenadov), Марко Умека (Marko Umek), Маркуса Мецкера (Markus Matzker), Шрихари Шридхарана (Srihari Sridharan), Стивена Джона Уорнетта (Stephen John Warnett), Суманта Тамбе (Sumant Tambe), Тима ван Дьюрзена (Tim van Deurzen) и Владимира Купцова (Vladimir Kuptsov).

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

О книге

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

Для кого написана эта книга

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

Если у вас мало опыта в юнит-тестировании, из этой книги вы многое узнаете. Опытный программист, скорее всего, уже понимает некоторые идеи, изложенные здесь. Книга поможет ему осознать, почему приемы и практики, которыми он пользовался все это время, настолько полезны. И не стоит недооценивать этот навык: умение четко донести свои идеи коллегам чрезвычайно полезно.

Структура книги

Одиннадцать глав этой книги разделены на четыре части. В части I изложены основы юнит-тестирования, а также напоминаются наиболее общие практики юнит-тестирования:

• Глава 1 показывает цели юнит-тестирования, в ней приводится краткий обзор того, как отличить хороший тест от плохого.

• В главе 2 анализируется определение юнит-тестирования и обсуждаются две основные школы в области юнит-тестирования.

• Глава 3 рассматривает некоторые базовые вопросы — такие как структура юнит-тестов, переиспользование тестовых данных и параметризация тестов.

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

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

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

• В главе 6 рассматриваются три стиля юнит-тестирования и то, какой из этих стилей производит тесты лучшего качества и почему.

• Глава 7 показывает, как провести рефакторинг раздутых, чрезмерно усложненных тестов и получить тесты, сочетающие в себе максимальную эффективность с минимальными затратами на сопровождение.

В части III изучаются вопросы интеграционного тестирования:

• В главе 8 рассматривается интеграционное тестирование в целом, его достоинства и недостатки.

• В главе 9 обсуждаются моки (mocks) и как работать с ними так, чтобы максимально повысить эффективность ваших тестов.

• В главе 10 рассматривается работа с реляционными базами данных в тестах.

В главе 11 части IV представлены стандартные антипаттерны юнит-тестирования.

О коде

Примеры кода написаны на C#, но те аспекты, которые они демонстрируют, применимы к любому объектно-ориентированному языку (например, Java или C++). Я старался не пользоваться специфическими языковыми возможностями C# и сделать код примеров по возможности простым, чтобы вы легко разобрались в нем. Весь код примеров можно скачать по адресу www.manning.com/books/unit-testing.

Форум для обсуждения книги

Приобретая книгу, вы получаете бесплатный доступ к закрытому веб-форуму Manning, на котором можно публиковать комментарии по поводу книги, задавать технические вопросы и получать помощь от автора и других пользователей. Чтобы получить доступ к форуму, откройте страницу https://livebook.manning.com/#!/book/unit-testing/discussion. За информацией о форумах Manning и правилах поведения обращайтесь по адресу https://livebook.manning.com/#!/discussion.

В рамках своих обязательств перед читателями издательством Manning предоставляет ресурс для проведения осмысленного диалога между читателями и автором. Эти обязательства не подразумевают конкретный вклад со стороны автора, участие которого в работе форума остается добровольным (и неоплачиваемым). Задавайте автору интересные вопросы, чтобы он не терял интереса к происходящему! Форум и архивы предшествующих обсуждений доступны на веб-сайте издателя, пока книга находится в печати.

Другие сетевые ресурсы

• Мой блог находится по адресу EnterpriseCraftsmanship.com.

• У меня также имеется онлайн-курс по юнит-тестированию (в данный момент находится в разработке), на который можно записаться по адресу UnitTestingCourse.com.

Об авторе

Владимир Хориков — разработчик, Microsoft MVP и автор на платформе Pluralsight. Профессионально занимается разработкой программного обеспечения более 15 лет, а также обучением команд тонкостям юнит-тестирования. За последние годы Владимир опубликовал несколько популярных серий в блогах, а также онлайн-курс на тему юнит-тестирования. Главное достоинство его стиля обучения, которое часто отмечают студенты, — сильная теоретическая подготовка, которая затем используется на практике.

Иллюстрация на обложке

Иллюстрация, помещенная на обложку второго издания книги и озаглавленная «Esthinienne», была позаимствована из изданного в 1788 г. каталога национальных костюмов Жака Грассе де Сен-Совера (1757–1810) «Costumes Civils Actuels de Tous les Peuples Connus». Каждая иллюстрация нарисована и раскрашена от руки. Иллюстрации из каталога Грассе де Сен-Совера напоминают о культурных различиях между городами и весями мира, имевших место почти двести лет назад. Люди, проживавшие в изолированных друг от друга регионах, говорили на разных языках и диалектах. По одежде человека можно было определить, в каком городе, поселке или поселении он проживает.

С тех пор дресс-код сильно изменился, да и различия между разными регионами стали не столь выраженными. В наше время довольно трудно узнать жителей разных континентов, не говоря уже о жителях разных городов или регионов. Возможно, мы отказались от культурных различий в пользу более разнообразной личной жизни — и конечно, в пользу более разнообразной и стремительной технологической жизни.

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

От издательства

Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

На веб-сайте издательства www.piter.com вы найдете подробную информа­цию о наших книгах.

Часть I. Общая картина

Эта часть книги вводит читателя в курс текущего состояния дел в области юнит-тестирования. В главе 1 я расскажу о цели юнит-тестирования и покажу, как отличить хороший тест от плохого. Мы поговорим о метриках тестового покрытия и обсудим свойства хорошего юнит-теста.

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