Книга демонстрирует преимущества методологии разработки на основе тестирования (TDD) на языке Python. Вы научитесь писать и выполнять тесты для создания любого фрагмента вашего приложения и затем разрабатывать минимальный объем программного кода, необходимого для прохождения этих тестов. Вы также научитесь работать с различными инструментами и фрейм-ворками, такими как Django, Selenium, Git, jQuery и Mock.
Издание предназначено всем разработчикам, кто уже освоил начальный уровень программирования на Python и хочет перейти на следующий.
Author(s): Персиваль Г.
Publisher: ДМК Пресс
Year: 2018
Language: Russian
Pages: 624
City: М.
обложка......Page 1
Разработка на основе тестирования вместе с Python_165_235_out......Page 2
Предисловие......Page 17
Предпосылки и предположения......Page 22
Часть I. Основы TDD и Django......Page 34
Повинуйтесь Билли-тестировщику! Ничего не делайте, пока у вас не будет теста......Page 35
Приведение Django в рабочее состояние......Page 38
Запуск репозитория Git......Page 41
Использование функционального теста для определения минимального дееспособного приложения......Page 45
Модуль unittest стандартной библиотеки Python......Page 48
Фиксация......Page 51
Глава 3. Тестирование простой домашней страницы при помощи модульных тестов......Page 53
Модульные тесты и их отличия от функциональных тестов......Page 54
Модульное тестирование в Django......Page 56
MVC в Django, URL-адреса и функции представления......Page 57
Наконец-то! Мы на самом деле напишем прикладной код!......Page 59
Файл urls.py......Page 60
Модульное тестирование представления......Page 63
Цикл «модульный-тест/программный-код»......Page 65
Глава 4. И что же делать со всеми этими тестами (и рефакторизацией)?......Page 69
Программировать – все равно что поднимать ведро с водой из колодца......Page 70
Использование Selenium для тестирования взаимодействий пользователя......Page 72
Правило «Не тестировать константы» и шаблоны во спасение......Page 75
Перестройка программного кода для использования шаблона......Page 76
Тестовый клиент Django......Page 80
О рефакторизации......Page 82
Еще немного о главной странице......Page 84
Резюме: процесс TDD......Page 86
Глава 5. Сохранение вводимых пользователем данных: тестирование базы данных......Page 89
Подключение формы для отправки
POST-запроса......Page 90
Обработка POST-запроса на сервере......Page 93
Передача переменных Python для вывода в шаблоне......Page 94
Если клюнуло трижды, рефакторизуй......Page 99
Django ORM и первая модель......Page 101
Первая миграция базы данных......Page 103
Тест продвинулся удивительно далеко......Page 104
Новое поле означает новую миграцию......Page 105
Сохранение POST-запроса в базу данных......Page 106
Переадресация после POST-запроса......Page 109
Лучшие приемы модульного тестирования: каждый тест должен проверять одну единицу кода......Page 110
Генерирование элементов в шаблоне......Page 111
Создание производственной базы данных с миграцией......Page 113
Резюме......Page 116
Обеспечение изоляции в функциональных тестах......Page 119
Выполнение только модульных тестов......Page 123
Ремарка: обновление Selenium и Geckodriver......Page 124
О неявных и явных ожиданиях
и вуду сне time.sleep......Page 125
Маломасштабные конструктивные изменения по мере необходимости......Page 131
Вам это никогда не понадобится!......Page 132
REST (-овский) подход......Page 133
Инкрементная реализация новой структуры кода на основе TDD......Page 134
Обеспечение теста на наличие регрессии......Page 135
Итеративное движение в сторону новой структуры кода......Page 138
Первый самодостаточный шаг: один новый URL-адрес......Page 140
Новая функция представления......Page 141
Зеленый? Рефакторизуй!......Page 143
Еще один шажок: отдельный шаблон для просмотра списков......Page 144
Тестовый класс для создания нового списка......Page 147
URL-адрес и представление для создания нового списка......Page 149
Регрессия! Наведение форм на новый URL-адрес......Page 150
Стиснув зубы: корректировка моделей......Page 152
Связь по внешнему ключу......Page 154
Адаптация остальной части мира к новым моделям......Page 156
Каждому списку – свой URL-адрес......Page 158
Извлечение параметров из URL-адресов......Page 159
Адаптирование new_list к новому миру......Page 161
Функциональные тесты обнаруживают еще одну регрессию......Page 162
Еще одно представление для добавления элементов в существующий список......Page 163
Остерегайтесь «жадных» регулярных выражений!......Page 164
Последний новый URL-адрес......Page 165
Последнее новое представление......Page 166
Тестирование контекстных объектов отклика напрямую......Page 167
Финальная рефакторизация с использованием URL-включений......Page 169
Часть II. Непременные условия веб-разработки......Page 172
Что функционально тестируется в макете и стилевом оформлении......Page 173
Придание привлекательного вида: использование платформы CSS......Page 177
Наследование шаблонов в Django......Page 179
Строки и столбцы......Page 181
Статические файлы в Django......Page 183
Переход на StaticLiveServerTestCase......Page 184
Класс jumbotron......Page 185
Использование собственного CSS......Page 186
О чем мы умолчали: collectstatic и другие статические каталоги......Page 188
Несколько вещей, которые не удались......Page 191
Глава 9. Тестирование развертывания с использованием промежуточного сайта......Page 192
TDD и опасные зоны развертывания......Page 193
Как всегда, начинайте с теста......Page 195
Ручное обеспечение работы сервера для размещения сайта......Page 197
Запуск сервера......Page 198
Инсталляция Nginx......Page 199
Конфигурирование доменов для промежуточного и реального серверов......Page 201
Развертывание исходного кода вручную......Page 202
Корректировка расположения базы данных......Page 203
Создание Virtualenv вручную и использование requirements.txt......Page 205
Простое конфигурирование Nginx......Page 207
Создание базы данных при помощи команды migrate......Page 210
Успех! Наше хакерское развертывание работает......Page 211
Переход на Gunicorn......Page 213
Настройка Nginx для раздачи статических файлов......Page 215
Переход на использование сокетов Unix......Page 216
Установка DEBUG в False и настройка
ALLOWED_HOSTS......Page 217
Применение Systemd для проверки, что Gunicorn запускается на начальной загрузке......Page 218
Сохранение изменений: добавление Gunicorn в файл requirements.txt......Page 219
Сохранение шаблонов конфигурационных файлов этапа обеспечения работы......Page 220
Сохранение хода выполнения......Page 223
Глава 11. Автоматизация развертывания с помощью Fabric......Page 225
Описание частей сценария Fabric для развертывания......Page 226
Получение исходного кода из репозитория командой git......Page 227
Обновление файла settings.py......Page 228
Миграция базы данных при необходимости......Page 230
Испытание автоматизации......Page 231
Развертывание на работающем сайте......Page 232
Конфигурирование Nginx и Gunicorn при помощи sed......Page 235
Маркировка релиза командой git tag......Page 236
Дополнительные материалы для чтения......Page 237
Начало с ФТ валидации данных: предотвращение пустых элементов......Page 239
Пропуск теста......Page 240
Разбиение функциональных тестов на несколько файлов......Page 242
Выполнение только одного файла с тестами......Page 245
Новый инструмент функционального тестирования: обобщенная вспомогательная функция явного ожидания......Page 246
Завершение ФТ......Page 250
Рефакторизация модульных тестов на несколько файлов......Page 252
Глава 13. Валидация на уровне базы данных......Page 255
Контекстный менеджер self.assertRaises......Page 256
Причуда Django: сохранение модели не выполняет валидацию......Page 257
Выведение на поверхность ошибок валидации модели в представлении......Page 258
Проверка, чтобы недопустимые входные данные не сохранялись в базе данных......Page 262
Схема Django: обработка POST-запросов в том же представлении, которое генерирует форму......Page 264
Рефакторизация: передача функциональности new_item в view_list......Page 265
Обеспечение валидации модели в view_list......Page 268
Тег {% url %} шаблона......Page 270
Использование get_absolute_url для переадресаций......Page 271
Перемещение программной логики валидации из формы......Page 275
Исследование API форм при помощи модульного теста......Page 276
Переход на Django ModelForm......Page 278
Тестирование и индивидуальная настройка валидации формы......Page 279
Использование формы в представлении с GET-запросом......Page 282
Глобальный поиск и замена......Page 283
Адаптация модульных тестов к представлению new_list......Page 286
Использование формы для отображения ошибок в шаблоне......Page 288
Использование формы в другом представлении......Page 289
Вспомогательный метод для нескольких коротких тестов......Page 290
Неожиданное преимущество: бесплатная валидация на стороне клиента из HTML5......Page 292
Одобряющее похлопывание по спине......Page 294
Не потратили ли мы уйму времени впустую?......Page 295
Использование собственного для формы метода save......Page 296
Еще один ФТ на наличие повторяющихся элементов......Page 299
Предотвращение дубликатов на уровне модели......Page 300
Небольшое отступление по поводу упорядочивания Queryset и представлений строковых значений......Page 302
Новое написание старого теста модели......Page 305
Некоторые ошибки целостности проявляются при сохранении......Page 307
Экспериментирование с проверкой на наличие повторяющихся элементов на уровне представлений......Page 308
Более сложная форма для проверки на наличие повторяющихся значений......Page 309
Использование существующей формы для элемента списка в представлении для списка......Page 311
Итоги: что мы узнали о тестировании Django......Page 314
Начинаем с ФТ......Page 317
Настройка элементарного исполнителя тестов на JavaScript......Page 319
Использование элемента div для jQuery и фикстуры......Page 321
Создание модульного теста на JavaScript для требуемой функциональности......Page 325
console.log для отладочной распечатки......Page 327
Использование функции инициализации для большего контроля над временем выполнения......Page 329
Коломбо говорит: стереотипный код для onload и организация пространства имен......Page 331
Несколько вещей, которые не удалось сделать......Page 333
Развертывание на промежуточном сервере......Page 335
Итоги: маркировка нового релиза
командой git tag......Page 336
Часть III. Основы TDD и Django......Page 338
Беспарольная аутентификация......Page 339
Разведочное программирование, или Импульсное исследование......Page 340
Открытие ветки для результатов импульсного исследования......Page 341
Отправка электронных писем из Django......Page 342
Хранение маркеров в базе данных......Page 345
Индивидуализированные модели аутентификации......Page 346
Завершение индивидуализированной авторизации в Django......Page 347
Внедрение результатов импульсного исследования......Page 352
Возвращение импульсного исходного кода в прежний вид......Page 354
Минимальная индивидуализированная модель пользователя......Page 355
Тесты в качестве документирования......Page 358
Модель маркера для соединения электронных адресов с уникальным идентификатором......Page 359
Перед началом: получение базовой инфраструктуры......Page 363
Создание имитаций вручную, или Обезьянья заплатка......Page 364
Библиотека Mock......Page 368
Использование unittest.patch......Page 369
Тестирование инфраструктуры сообщений Django......Page 372
Добавление сообщений в HTML......Page 375
Начало с URL-адреса для входа в систему......Page 376
Подтверждение отправки пользователю ссылки с маркером......Page 377
Создание индивидуализированного серверного процессора аутентификации на основе результатов импульсного исследования......Page 379
Еще один тест для каждого случая......Page 380
Метод get_user......Page 383
Использование серверного процессора аутентификации в представлении входа в систему......Page 385
Еще одна причина использовать имитации: устранение повторов......Page 386
Использование mock.return_value......Page 389
Установка заплатки на уровне класса......Page 391
Момент истины: пройдет ли ФТ?......Page 393
Теоретически – работает! Работает ли на практике?......Page 395
Завершение ФТ, тестирование выхода из системы......Page 397
Пропуск регистрации в системе путем предварительного создания сеанса......Page 400
Проверка работоспособности решения......Page 403
Финальный вспомогательный метод явного ожидания: декоратор ожидания......Page 406
Чтобы убедиться в пудинге, надо его попробовать: использование предварительного сервера для отлавливания финальных дефектов......Page 411
Настройка журналирования......Page 412
Установка секретных переменных окружения на сервере......Page 414
Адаптация ФТ для тестирования реальных электронных писем POP3......Page 415
Управляющая команда Django для создания сеансов......Page 419
Настройка ФТ для выполнения управляющей команды на сервере......Page 421
Использование fabric напрямую из Python......Page 422
Резюме: создание сеансов локально по сравнению с промежуточным сервером......Page 423
Внедрение программного кода журналирования......Page 425
Итоги......Page 426
Альтернатива: «изнутри наружу»......Page 428
ФТ для «Моих списков»......Page 429
Спуск на один уровень вниз к функциям представления (к контроллеру)......Page 432
Быстрая реструктуризация иерархии наследования шаблонов......Page 434
Конструирование API при помощи шаблона......Page 435
Спуск к следующему уровню: что именно представление передает в шаблон......Page 437
Следующее техническое требование из уровня представлений: новые списки должны записывать владельца......Page 438
Момент принятия решения: перейти к следующему уровню с неработающим тестом или нет......Page 439
Спуск к уровню модели......Page 440
Финальный шаг: подача .name API из шаблона......Page 442
Пересмотр точки принятия решения: уровень представлений зависит от ненаписанного кода моделей......Page 445
Первая попытка использования имитаций для изоляции......Page 447
Использование имитации side_effects для проверки последовательности событий......Page 448
Слушайте свои тесты: уродливые тесты сигнализируют о необходимости рефакторизации......Page 450
Держите рядом старый комплект интегрированных тестов в качестве проверки на токсичность......Page 451
Новый комплект тестов с полной изоляцией......Page 452
Мышление с точки зрения взаимодействующих объектов......Page 453
Спуск вниз на уровень форм......Page 458
Продолжайте слушать свои тесты: удаление программного кода ORM из нашего приложения......Page 459
Наконец, спуск вниз на уровень моделей......Page 463
Назад к представлениям......Page 465
Момент истины (и риски имитации)......Page 467
Точка зрения о взаимодействиях между уровнями как о контрактах......Page 468
Идентификация неявных контрактов......Page 469
Исправление недосмотра......Page 470
Еще один тест......Page 472
Удаление избыточного кода на уровне форм......Page 473
Удаление старой реализации представления......Page 474
Удаление избыточного кода на уровне форм......Page 475
Выводы: когда писать изолированные тесты, а когда – интегрированные......Page 476
Пусть вычислительная сложность будет вашим гидом......Page 477
Вперед!......Page 478
Инсталляция сервера Jenkins......Page 480
Набор плагинов на первое время......Page 482
Конфигурирование пользователя-администратора......Page 483
Указание серверу Jenkins, где искать Python 3 и Xvfb......Page 484
Настройка проекта......Page 485
Первая сборка!......Page 486
Установка виртуального дисплея, чтобы ФТ выполнялись бездисплейно......Page 488
Взятие снимков экрана......Page 490
Если сомневаетесь – встряхните тайм-аут!......Page 493
Установка node......Page 495
Добавление шагов сборки в Jenkins......Page 496
Больше возможностей с CI-сервером......Page 498
ФТ с многочисленными пользователями и addCleanup......Page 500
Страничный шаблон проектирования......Page 502
Расширение ФТ до второго пользователя и страница «Мои списки»......Page 505
Упражнение для читателя......Page 507
Глава 26. Быстрые тесты, медленные тесты и горячий поля......Page 510
Священное состояние потока......Page 512
Изолированные тесты труднее читать и писать......Page 513
Тесты с имитациями могут стать близко привязанными к реализации......Page 514
Чистый код, удобный в сопровождении......Page 515
Оценивайте свои тесты относительно преимуществ, которые вы хотите от них получить......Page 516
Порты и адаптеры/шестиугольная/чистая архитектура......Page 517
Функциональное ядро, императивная оболочка......Page 518
Дополнительные материалы для чтения......Page 519
Держите свои сборки CI-сервера на зеленом уровне......Page 522
Не пропадайте!......Page 523
Выполнение сеансов Firefox Selenium при помощи Xvfb......Page 524
Настройка Django как веб-приложение PythonAnywhere......Page 526
Глава о развертывании......Page 527
Обобщенные представления на основе классов......Page 529
Домашняя страница как FormView......Page 530
Использование form_valid для индивидуализации CreateView......Page 531
Более сложное представление для обработки просмотра и добавления к списку......Page 534
Сравните старую верию с новой......Page 537
Лучшие приемы модульного тестирования обобщенных представлений на основе классов......Page 538
Установка системных пакетов и Nginx......Page 540
Конфигурирование Gunicorn и использование обработчиков для перезапуска служб......Page 542
Что делать дальше......Page 543
Попытка развертывания на промежуточном сервере......Page 545
Выполнение тестовой миграции локально......Page 546
Вставка миграции данных......Page 547
Совместное тестирование новых миграций......Page 548
Выводы......Page 549
Что такое BDD?......Page 551
Базовые служебные операции......Page 552
Написание ФТ как компонента при помощи синтаксиса языка Gherkin......Page 553
Программирование шаговых функций......Page 554
Эквиваленты setUp и tearDown
в environment.py......Page 556
Извлечение параметров в шагах......Page 557
BDD по сравнению с ФТ с локальными комментариями......Page 560
Страничный шаблон проектирования как альтернатива......Page 562
Будут ли непрограммисты писать тесты?......Page 564
Некоторые предварительные выводы......Page 565
Наш подход для этого раздела......Page 566
Организация базовой конвейерной передачи......Page 567
Получение фактического отклика......Page 569
Добавление POST-метода......Page 570
Тестирование клиентского Ajax при помощи Sinon.js......Page 571
Соединение всего в шаблоне, чтобы убедиться, что это реально работает......Page 575
Реализация Ajax POST-запроса, включая маркер CSRF......Page 577
Имитация в JavaScript......Page 579
Валидация данных. Упражнение для читателя......Page 583
Инсталляция......Page 588
Сериализаторы (на самом деле – объекты ModelSerializer)......Page 589
Объекты Viewset (на самом деле – объекты ModelViewset) и объекты Router......Page 590
Другой URL для элемента с POST-запросом......Page 593
Адаптирование на стороне клиента......Page 594
Что дает инфраструктура Django-Rest-Framework......Page 596
Основной поток операций TDD......Page 600
Выход за пределы тестирования только на сервере разработки......Page 601
Лучшие приемы на основе Selenium / функциональных тестов......Page 602
«Снаружи внутрь», изоляция тестов против интегрированных тестов и имитация......Page 603
Уведомления – на сайте и по электронной почте......Page 604
Сайт администратора Django......Page 605
MVC-инфраструктуры для JavaScript......Page 606
Шифрование на стороне клиента......Page 607
Здесь место для ваших предложений......Page 608
Полный список ссылок для каждой главы......Page 609
Использование Git для проверки вашего прогресса......Page 611
Не позволяйте этому превращаться в костыль!......Page 612
Предметный указатель......Page 613