УДК 004.451iOS
ББК 32.973.26-018.2
Л55
Л55 Грэхем Ли
Разработка через тестирование для iOS. Пер. с англ. Киселев А. Н. –
М.: ДМК Пресс, 2018. – 272 с.: ил.
ISBN 978-5-97060-587-5
Гибкий и понятный программный код, легко поддающийся модификации и не
скрывающий неприятных сюрпризов для своих создателей. Как оказывается, это
не сказка! Всего этого позволяет добиться методика разработки через тестирование
(Test-Driven-Development, TDD). Она основана, на первый взгляд, на парадоксальной
идее – создавать тесты до написания тестируемого прикладного кода.
В первых главах книги автор раскрывает теоретические основы методики
TDD, знание которых, кстати, может пригодиться не только разработчикам приложений
для iOS. В последующих главах он подробно демонстрирует применение
этой методики на примере разработки действующего приложения, целиком и
полностью реализованного с использованием TDD. За рассмотрением примера
следует обсуждение различных тем, связанных с проектированием программных
продуктов при использовании методики TDD, применение этой методики к унаследованным
проектам, и краткий обзор будущих возможностей, уже реализованных
для некоторых платформ, но пока не поддерживаемых в iOS.
О модульном тестировании написано множество книг. Это отличные книги, но
они не содержат специализированной информации, например, для разработчиков
приложений на основе фреймворка Cocoa Touch. Предоставляя примеры на языке
Objective-C, используя Xcode с сопутствующими инструментами и оперируя
идиомами Cocoa, автору удалось сделать принципы, лежащие в основе разработки
через тестирование, более доступными для разработчиков приложений для iOS.
Original English language edition published by Pearson Education, Inc., Permissions
Department, One Lake Street, Upper Saddle River, New Jersey 07458, or you may fax your
request to (201) 236-3290. Copyright © 2012 Pearson Education, Inc. Russian-language
edition copyright © 2012 by DMK Press. All rights reserved.
Все права защищены. Любая часть этой книги не может быть воспроизведена
в какой бы то ни было форме и какими бы то ни было средствами без письменного
разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но, поскольку
вероятность технических ошибок все равно существует, издательство не может гарантировать
абсолютную точность и правильность приводимых сведений. В связи с
этим издательство не несет ответственности за возможные ошибки, связанные с использованием
книги.
ISBN 978-0-32-177418-7 (англ.)
ISBN 978-5-97060-587-5 (рус.)
© 2012 Pearson Education, Inc.
© Оформление, перевод на русский язык
ДМК Пресс
Стр.5
ОГЛАВЛЕНИЕ
ПРЕДИСЛОВИЕ ..................................................9
БЛАГОДАРНОСТИ ............................................. 11
ОБ АВТОРЕ ...................................................... 12
ГЛАВА 1. О тестировании программного
обеспечения и модульном тестировании .............. 13
Зачем тестировать программное обеспечение? ...................... 13
Кто должен тестировать программы? ...................................... 15
Когда следует тестировать программы? .................................. 19
Примеры из практики тестирования ........................................ 21
Как в общую картину вписывается модульное тестирование? .. 22
Что все это означает для разработчиков iOS? .......................... 27
ГЛАВА 2. Приемы разработки через тестирование ... 29
Сначала тест............................................................................ 29
Красный, зеленый, рефакторинг ............................................. 32
Проектирование приложений при разработке через
тестирование .......................................................................... 36
Подробнее о рефакторинге ..................................................... 37
Вам это не понадобится .......................................................... 38
Тестируйте до, во время и после создания кода ...................... 41
ГЛАВА 3. Как писать модульные тесты .................. 44
Требования.............................................................................. 44
Запуск кода с известными исходными данными ...................... 45
Получение ожидаемых результатов ......................................... 47
Проверка результатов ............................................................. 48
Увеличение удобочитаемости тестов ....................................... 50
Организация множества тестов ............................................... 51
Рефакторинг............................................................................ 55
В заключение .......................................................................... 57
ГЛАВА 4.Инструменты для тестирования .............. 58
OCUnit и Xcode......................................................................... 58
Стр.7
Оглавление
7
Альтернативы фреймворку OCUnit ........................................... 70
Google Toolkit for Mac ................................................................. 70
GHUnit ........................................................................................ 72
CATCH ........................................................................................ 72
OCMock...................................................................................... 74
Непрерывная интеграция ........................................................ 77
Hudson ....................................................................................... 79
CruiseControl .............................................................................. 83
В заключение .......................................................................... 84
ГЛАВА 5. Разработка приложений для iOS
через тестирование .......................................... 86
Цель проекта ........................................................................... 86
Порядок использования .......................................................... 87
План атаки ............................................................................... 89
Начало ..................................................................................... 90
ГЛАВА 6. Модель данных ................................... 92
Темы ........................................................................................ 93
Вопросы .................................................................................. 99
Люди ..................................................................................... 102
Соединение класса Question с другими классами .................. 103
Ответы .................................................................................. 108
ГЛАВА 7. Проектирование приложений ............... 114
План атаки ............................................................................. 114
Создание объекта Question.................................................... 116
Создание объектов Question из данных в формате JSON ....... 132
ГЛАВА 8. Взаимодействие с сетью ..................... 142
Архитектура класса NSURLConnection ................................... 142
Реализация StackOverflowCommunicator ............................... 144
В заключение ........................................................................ 156
ГЛАВА 9. Контроллеры представлений ............... 157
Организация классов ............................................................ 157
Класс контроллера представления ........................................ 159
TopicTableDataSource и TopicTableDelegate ............................ 164
Создание нового контроллера представления ....................... 181
Источник данных со списком вопросов .................................. 192
Что дальше ............................................................................ 204
ГЛАВА 10. Собираем все вместе ....................... 205
Завершение реализации логики приложения ........................ 205
Стр.8
8
Оглавление
Отображение аватара пользователя ...................................... 220
Завершение и наведение порядка ......................................... 224
Отправка приложения! .......................................................... 235
ГЛАВА 11. Проектирование при разработке
через тестирование ........................................ 237
Проектируйте интерфейсы, а не реализацию ........................ 237
Сообщайте, а не спрашивайте ............................................... 240
Маленькие, узкоспециализированные классы и методы ........ 241
Инкапсуляция ........................................................................ 243
Использование лучше повторного использования ................. 244
Тестирование кода, выполняющегося параллельно ............... 245
Не мудрите больше, чем это необходимо .............................. 246
Отдавайте предпочтение широким и неглубоким иерархиям
наследования ........................................................................ 247
В заключение ........................................................................ 248
ГЛАВА 12. Применение приема разработки
через тестирование к существующим проектам .. 249
Первый тест – самый важный ................................................ 249
Рефакторинг в поддержку тестирования ............................... 250
Тестирование в поддержку рефакторинга .............................. 253
Действительно ли необходимо писать все эти тесты? ........... 255
ГЛАВА 13. За рамками сегодняшних
возможностей разработки через тестирование ... 257
Выражение диапазонов входных и выходных значений .......... 257
Разработка на основе определения функциональности ......... 258
Автоматическое создание тестов .......................................... 260
Автоматическое создание кода для прохождения тестов ....... 263
В заключение ........................................................................ 264
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ ............................... 265
Стр.9