Персиваль Г. - Python. Разработка на основе тестирования (2018)
Книга демонстрирует преимущества методологии разработки на основе тестирования (TDD) на языке Python. Вы научитесь писать и выполнять тесты для создания любого фрагмента вашего приложения и затем разрабатывать минимальный объем программного кода, необходимого для прохождения этих тестов. Вы также научитесь работать с различными инструментами и фрейм-ворками, такими как Django, Selenium, Git, jQuery и Mock.
Издание предназначено всем разработчикам, кто уже освоил начальный уровень программирования на Python и хочет перейти на следующий.
Оглавление
Предисловие.................................................................................................................16
Предпосылки и предположения ...............................................................................21
Сопутствующее видео.................................................................................................30
Признательности..........................................................................................................31
Часть I. Основы TDD и Django ............................................................................ 33
Глава 1. Настройка Django с использованием функционального теста .............34
Повинуйтесь Билли-тестировщику! Ничего не делайте, пока у вас не будет теста ....34
Приведение Django в рабочее состояние ................................................................................... 37
Запуск репозитория Git.......................................................................................................................40
Глава 2. Расширение функционального теста при помощи
модуля unittest.............................................................................................................44
Использование функционального теста для определения минимального
дееспособного приложения ......................................................................................................44
Модуль unittest стандартной библиотеки Python .................................................................... 47
Фиксация...................................................................................................................................................50
Глава 3. Тестирование простой домашней страницы при помощи
модульных тестов........................................................................................................52
Первое приложение Django и первый модульный тест.........................................................53
Модульные тесты и их отличия от функциональных тестов.................................................53
Модульное тестирование в Django.................................................................................................55
MVC в Django, URL-адреса и функции представления............................................................56
Наконец-то! Мы на самом деле напишем прикладной код! ...............................................58
Файл urls.py..............................................................................................................................................59
Модульное тестирование представления....................................................................................62
Цикл «модульный-тест/программный-код»................................................................................64
Глава 4. И что же делать со всеми этими тестами (и рефакторизацией)? .........68
Программировать – все равно что поднимать ведро с водой из колодца ....................69
Использование Selenium для тестирования взаимодействий пользователя ...............71
Правило «Не тестировать константы» и шаблоны во спасение.........................................74
Перестройка программного кода для использования шаблона................................................75
Тестовый клиент Django ..............................................................................................................................79
О рефакторизации.................................................................................................................................81
Еще немного о главной странице ...................................................................................................83
Резюме: процесс TDD...........................................................................................................................85
Глава 5. Сохранение вводимых пользователем данных: тестирование
базы данных.................................................................................................................886 ? Оглавление
Подключение формы для отправки POST-запроса .................................................................89
Обработка POST-запроса на сервере............................................................................................92
Передача переменных Python для вывода в шаблоне..........................................................93
Если клюнуло трижды, рефакторизуй ...........................................................................................98
Django ORM и первая модель........................................................................................................ 100
Первая миграция базы данных............................................................................................................. 102
Тест продвинулся удивительно далеко .............................................................................................. 103
Новое поле означает новую миграцию ............................................................................................. 104
Сохранение POST-запроса в базу данных................................................................................ 105
Переадресация после POST-запроса.......................................................................................... 108
Лучшие приемы модульного тестирования: каждый тест должен проверять
одну единицу кода.......................................................................................................................... 109
Генерирование элементов в шаблоне........................................................................................ 110
Создание производственной базы данных при помощи команды migrate............... 112
Резюме..................................................................................................................................................... 115
Глава 6. Усовершенствование функциональных тестов: обеспечение
изоляции и удаление методов sleep ......................................................................118
Обеспечение изоляции в функциональных тестах............................................................... 118
Выполнение только модульных тестов ............................................................................................. 122
Ремарка: обновление Selenium и Geckodriver........................................................................ 123
О неявных и явных ожиданиях и методе time.sleep............................................................ 124
Глава 7. Работа в инкрементном режиме...............................................................130
Маломасштабные конструктивные изменения по мере необходимости.................... 130
В первую очередь маломасштабные конструктивные изменения ........................................ 131
Вам это никогда не понадобится! ........................................................................................................ 131
REST (-овский) подход.............................................................................................................................. 132
Инкрементная реализация новой структуры кода на основе TDD................................ 133
Обеспечение теста на наличие регрессии .............................................................................. 134
Итеративное движение в сторону новой структуры кода...................................................137
Первый самодостаточный шаг: один новый URL-адрес ..................................................... 139
Новый URL-адрес........................................................................................................................................ 140
Новая функция представления.............................................................................................................. 140
Зеленый? Рефакторизуй! ................................................................................................................. 142
Еще один шажок: отдельный шаблон для просмотра списков........................................ 143
Третий шажок: URL-адрес для добавления элементов списка ........................................ 146
Тестовый класс для создания нового списка................................................................................... 146
URL-адрес и представление для создания нового списка......................................................... 148
Удаление теперь уже избыточного кода и тестов.......................................................................... 149
Регрессия! Наведение форм на новый URL-адрес........................................................................ 149
Стиснув зубы: корректировка моделей ..................................................................................... 151
Связь по внешнему ключу ....................................................................................................................... 153
Адаптация остальной части мира к новым моделям ................................................................... 155
Каждому списку – свой URL-адрес...............................................................................................157
Извлечение параметров из URL-адресов ......................................................................................... 158
Адаптирование new_list к новому миру............................................................................................ 160Оглавление ? 7
Функциональные тесты обнаруживают еще одну регрессию .......................................... 161
Еще одно представление для добавления элементов в существующий список...... 162
Остерегайтесь «жадных» регулярных выражений!....................................................................... 163
Последний новый URL-адрес................................................................................................................. 164
Последнее новое представление......................................................................................................... 165
Тестирование контекстных объектов отклика напрямую........................................................... 166
Финальная рефакторизация с использованием URL-включений................................... 168
Часть II. Непременные условия веб-разработки ............................. 171
Глава 8. Придание привлекательного вида: макет, стилевое оформление
сайта и что тут тестировать ......................................................................................172
Что функционально тестируется в макете и стилевом оформлении............................. 172
Придание привлекательного вида: использование платформы CSS............................ 176
Наследование шаблонов в Django .............................................................................................. 178
Интеграция платформы Bootstrap ............................................................................................... 180
Строки и столбцы ........................................................................................................................................ 180
Статические файлы в Django.......................................................................................................... 182
Переход на StaticLiveServerTestCase.................................................................................................. 183
Использование компонентов Bootstrap для улучшения внешнего вида сайта........ 184
Класс jumbotron........................................................................................................................................... 184
Большие поля ввода .................................................................................................................................. 185
Стилистическое оформление таблицы............................................................................................... 185
Использование собственного CSS ............................................................................................... 185
О чем мы умолчали: collectstatic и другие статические каталоги...................................187
Несколько вещей, которые не удались...................................................................................... 190
Глава 9. Тестирование развертывания с использованием промежуточного
сайта.............................................................................................................................191
TDD и опасные зоны развертывания ......................................................................................... 192
Как всегда, начинайте с теста ........................................................................................................ 194
Получение доменного имени ........................................................................................................ 196
Ручное обеспечение работы сервера для размещения сайта......................................... 196
Выбор места размещения сайта........................................................................................................... 197
Запуск сервера............................................................................................................................................. 197
Учетные записи пользователей, SSH и полномочия..................................................................... 198
Инсталляция Nginx..................................................................................................................................... 198
Инсталляция Python 3.6............................................................................................................................ 200
Конфигурирование доменов для промежуточного и реального серверов........................ 200
Использование ФТ для подтверждения, что домен работает и Nginx выполняется...... 201
Развертывание исходного кода вручную.................................................................................. 201
Корректировка расположения базы данных................................................................................... 202
Создание Virtualenv вручную и использование requirements.txt........................................... 204
Простое конфигурирование Nginx...................................................................................................... 206
Создание базы данных при помощи команды migrate............................................................... 209
Победа! Наше хакерское развертывание работает............................................................. 2108 ? Оглавление
Глава 10. Переход к развертыванию, готовому к эксплуатации........................212
Переход на Gunicorn.......................................................................................................................... 212
Настройка Nginx для раздачи статических файлов ............................................................. 214
Переход на использование сокетов Unix................................................................................. 215
Присвоение DEBUG значения False и настройка ALLOWED_HOSTS ............................. 216
Применение Systemd для проверки, что Gunicorn запускается на начальной
загрузке............................................................................................................................................217
Сохранение изменений: добавление Gunicorn в файл requirements.txt............................. 218
Размышления об автоматизации.................................................................................................. 219
Сохранение шаблонов конфигурационных файлов этапа обеспечения работы ............ 219
Сохранение хода выполнения....................................................................................................... 222
Глава 11. Автоматизация развертывания с помощью Fabric .............................224
Описание частей сценария Fabric для развертывания....................................................... 225
Создание структуры каталогов.............................................................................................................. 226
Получение исходного кода из репозитория командой git........................................................ 226
Обновление файла settings.py............................................................................................................... 227
Обновление virtualenv.............................................................................................................................. 229
Миграция базы данных при необходимости................................................................................... 229
Испытание автоматизации.............................................................................................................. 230
Развертывание на работающем сайте ............................................................................................... 231
Конфигурирование Nginx и Gunicorn при помощи sed .............................................................. 234
Маркировка релиза командой git tag ....................................................................................... 235
Дополнительные материалы для чтения................................................................................... 236
Глава 12. Разделение тестов на многочисленные файлы и обобщенный
помощник ожидания.................................................................................................238
Начало с ФТ валидации данных: предотвращение пустых элементов ........................ 238
Пропуск теста................................................................................................................................................ 239
Разбиение функциональных тестов на несколько файлов........................................................ 241
Выполнение только одного файла с тестами .................................................................................. 244
Новый инструмент функционального тестирования: обобщенная
вспомогательная функция явного ожидания................................................................... 245
Завершение ФТ.................................................................................................................................... 249
Рефакторизация модульных тестов на несколько файлов ................................................ 251
Глава 13. Валидация на уровне базы данных.......................................................254
Валидация на уровне модели........................................................................................................ 255
Контекстный менеджер self.assertRaises ......................................................................................... 255
Причуда Django: сохранение модели не выполняет валидацию............................................ 256
Выведение на поверхность ошибок валидации модели в представлении .................257
Проверка, чтобы недопустимые входные данные не сохранялись в базе данных......... 261
Схема Django: обработка POST-запросов в том же представлении, которое
генерирует форму....................................................................................................................... 263
Рефакторизация: передача функциональности new_item в view_list................................... 264
Обеспечение валидации модели в view_list ................................................................................... 267
Рефакторизация: удаление жестко кодированных URL-адресов.................................... 269Оглавление ? 9
Тег {% url %} шаблона................................................................................................................................ 269
Использование get_absolute_url для переадресаций.................................................................. 270
Глава 14. Простая форма ..........................................................................................274
Перемещение программной логики валидации из формы .............................................. 274
Исследование API форм при помощи модульного теста............................................................ 275
Переход на Django ModelForm ............................................................................................................. 277
Тестирование и индивидуальная настройка валидации формы............................................. 278
Использование формы в представлениях................................................................................ 281
Использование формы в представлении с GET-запросом......................................................... 281
Глобальный поиск и замена.................................................................................................................... 282
Использование формы в представлении, принимающем POST-запросы .................. 285
Адаптация модульных тестов к представлению new_list ........................................................... 285
Использование формы в представлении.......................................................................................... 287
Использование формы для отображения ошибок в шаблоне................................................. 287
Использование формы в другом представлении.................................................................. 288
Вспомогательный метод для нескольких коротких тестов........................................................ 289
Неожиданное преимущество: бесплатная валидация на стороне клиента из HTML5.......291
Одобряющее похлопывание по спине....................................................................................... 293
Не потратили ли мы уйму времени впустую? ......................................................................... 294
Использование собственного для формы метода save ...................................................... 295
Глава 15. Более развитые формы ...........................................................................298
Еще один ФТ на наличие повторяющихся элементов......................................................... 298
Предотвращение дубликатов на уровне модели .......................................................................... 299
Небольшое отступление по поводу упорядочивания Queryset и представлений
строковых значений....................................................................................................................... 301
Новое написание старого теста модели ........................................................................................... 304
Некоторые ошибки целостности проявляются при сохранении............................................. 306
Экспериментирование с проверкой на наличие повторяющихся элементов
на уровне представлений.........................................................................................................307
Более сложная форма для проверки на наличие повторяющихся значений ........... 308
Использование существующей формы для элемента списка в представлении
для списка...................................................................................................................................... 310
Итоги: что мы узнали о тестировании Django......................................................................... 313
Глава 16 Пробуем окунуться, очень робко, в javascript......................................316
Начинаем с ФТ..................................................................................................................................... 316
Настройка элементарного исполнителя тестов на javascript........................................... 318
Использование элемента div для jQuery и фикстуры .......................................................... 320
Создание модульного теста на javascript для требуемой функциональности.......... 324
Фикстуры, порядок выполнения и глобальное состояние: ключевые проблемы
тестирования на JS...................................................................................................................... 326
console.log для отладочной распечатки............................................................................................ 326
Использование функции инициализации для большего контроля над временем
выполнения........................................................................................................................................ 328
Коломбо говорит: стереотипный код для onload и организация пространства10 ? Оглавление
имен.................................................................................................................................................. 330
Тестирование на javascript в цикле TDD................................................................................... 332
Несколько вещей, которые не удалось сделать...................................................................... 332
Глава 17. Развертывание нового программного кода .........................................334
Развертывание на промежуточном сервере ........................................................................... 334
Развертывание на реальном сервере ........................................................................................ 335
Что делать, если вы видите ошибку базы данных................................................................. 335
Итоги: маркировка нового релиза командой git tag ........................................................... 335
Часть III. Основы TDD и Django....................................................................... 337
Глава 18. Аутентификация пользователя, импульсное исследование
и внедрение его результатов...................................................................................338
Беспарольная аутентификация ..................................................................................................... 338
Разведочное программирование, или Импульсное исследование................................ 339
Открытие ветки для результатов импульсного исследования ................................................. 340
Авторизация на стороне клиента в пользовательском интерфейсе...................................... 341
Отправка электронных писем из Django .......................................................................................... 341
Использование переменных окружения для предотвращения секретов
в исходном коде .............................................................................................................................. 344
Хранение маркеров в базе данных..................................................................................................... 344
Индивидуализированные модели аутентификации..................................................................... 345
Завершение индивидуализированной авторизации в Django................................................ 346
Внедрение результатов импульсного исследования............................................................ 351
Возвращение импульсного исходного кода в прежний вид..................................................... 353
Минимальная индивидуализированная модель пользователя ....................................... 354
Тесты в качестве документирования .................................................................................................. 357
Модель маркера для соединения электронных адресов с уникальным
идентификатором ....................................................................................................................... 358
Глава 19. Использование имитаций для тестирования внешних
зависимостей или сокращения дублирования.....................................................362
Перед началом: получение базовой инфраструктуры ........................................................ 362
Создание имитаций вручную, или Обезьянья заплатка...................................................... 363
Библиотека Mock .................................................................................................................................367
Использование unittest.patch ................................................................................................................ 368
Продвижение ФТ чуть дальше вперед............................................................................................... 371
Тестирование инфраструктуры сообщений Django...................................................................... 371
Добавление сообщений в HTML........................................................................................................... 374
Начало с URL-адреса для входа в систему....................................................................................... 375
Подтверждение отправки пользователю ссылки с маркером ................................................. 376
Создание индивидуализированного серверного процессора аутентификации
на основе результатов импульсного исследования...................................................... 378
Еще один тест для каждого случая ...................................................................................................... 379
Метод get_user ............................................................................................................................................. 382Оглавление ? 11
Использование серверного процессора аутентификации в представлении
входа в систему................................................................................................................................ 384
Еще одна причина использовать имитации: устранение повторов............................... 385
Использование mock.return_value....................................................................................................... 388
Установка заплатки на уровне класса................................................................................................ 390
Момент истины: пройдет ли ФТ?.................................................................................................. 392
Теоретически – работает! Работает ли на практике?........................................................... 394
Завершение ФТ, тестирование выхода из системы ...................................................................... 396
Глава 20. Тестовые фикстуры и декоратор для явных ожиданий.....................399
Пропуск регистрации в системе путем предварительного создания сеанса............. 399
Проверка работоспособности решения ............................................................................................ 402
Финальный вспомогательный метод явного ожидания: декоратор ожидания......... 405
Глава 21. Отладка на стороне сервера ...................................................................410
Чтобы убедиться в пудинге, надо его попробовать: использование
предварительного сервера для отлавливания финальных дефектов................... 410
Настройка журналирования................................................................................................................... 411
Установка секретных переменных окружения на сервере ............................................... 413
Адаптация ФТ для тестирования реальных электронных писем POP3........................ 414
Управление тестовой базой данных на промежуточном сервере ................................ 418
Управляющая команда Django для создания сеансов................................................................. 418
Настройка ФТ для выполнения управляющей команды на сервере .................................... 420
Использование fabric напрямую из Python...................................................................................... 421
Резюме: создание сеансов локально по сравнению с промежуточным сервером......... 422
Внедрение программного кода журналирования................................................................. 424
Итоги ........................................................................................................................................................ 425
Глава 22. Завершение приложения «Мои списки»: TDD с подходом
«снаружи внутрь» ......................................................................................................427
Альтернатива: «изнутри наружу»...................................................................................................427
Почему «снаружи внутрь» предпочтительнее?....................................................................... 428
ФТ для «Моих списков».................................................................................................................... 428
Внешний уровень: презентация и шаблоны............................................................................ 431
Спуск на один уровень вниз к функциям представления (к контроллеру)................. 431
Еще один проход снаружи внутрь ............................................................................................... 433
Быстрая реструктуризация иерархии наследования шаблонов.............................................. 433
Конструирование API при помощи шаблона................................................................................... 434
Спуск к следующему уровню: что именно представление передает в шаблон................ 436
Следующее техническое требование из уровня представлений: новые списки
должны записывать владельца ..............................................................................................437
Момент принятия решения: перейти к следующему уровню с неработающим
тестом или нет................................................................................................................................... 438
Спуск к уровню модели.................................................................................................................... 439
Финальный шаг: подача .name API из шаблона............................................................................. 441
Глава 23. Изоляция тестов и «слушание своих тестов».......................................44412 ? Оглавление
Пересмотр точки принятия решения: уровень представлений зависит
от ненаписанного кода моделей .......................................................................................... 444
Первая попытка использования имитаций для изоляции................................................. 446
Использование имитации side_effects для проверки последовательности событий..... 447
Слушайте свои тесты: уродливые тесты сигнализируют о необходимости
рефакторизации .......................................................................................................................... 449
Написание тестов по-новому для представления, которое будет
полностью изолировано........................................................................................................... 450
Держите рядом старый комплект интегрированных тестов в качестве проверки
на токсичность.................................................................................................................................. 450
Новый комплект тестов с полной изоляцией .................................................................................. 451
Мышление с точки зрения взаимодействующих объектов ....................................................... 452
Спуск вниз на уровень форм...........................................................................................................457
Продолжайте слушать свои тесты: удаление программного кода ORM из нашего
приложения ...................................................................................................................................... 458
Наконец, спуск вниз на уровень моделей ................................................................................ 462
Назад к представлениям.......................................................................................................................... 464
Момент истины (и риски имитации)............................................................................................ 466
Точка зрения о взаимодействиях между уровнями как о контрактах...........................467
Идентификация неявных контрактов................................................................................................. 468
Исправление недосмотра........................................................................................................................ 469
Еще один тест........................................................................................................................................ 471
Наведение порядка: что следует убрать из комплекта интегрированных тестов.... 472
Удаление избыточного кода на уровне форм................................................................................. 472
Удаление старой реализации представления................................................................................. 473
Удаление избыточного кода на уровне форм................................................................................. 474
Выводы: когда писать изолированные тесты, а когда – интегрированные................. 475
Пусть вычислительная сложность будет вашим гидом................................................................ 476
Следует ли делать оба типа тестов?..................................................................................................... 477
Вперед!............................................................................................................................................................ 477
Глава 24. Непрерывная интеграция........................................................................479
Инсталляция сервера Jenkins......................................................................................................... 479
Конфигурирование сервера Jenkins............................................................................................ 481
Первоначальная разблокировка .......................................................................................................... 481
Набор плагинов на первое время........................................................................................................ 481
Конфигурирование пользователя-администратора ..................................................................... 482
Добавление плагинов ............................................................................................................................... 483
Указание серверу Jenkins, где искать Python 3 и Xvfb................................................................. 483
Завершение с HTTPS................................................................................................................................. 484
Настройка проекта ............................................................................................................................. 484
Первая сборка!..................................................................................................................................... 485
Установка виртуального дисплея, чтобы ФТ выполнялись бездисплейно ...................487
Взятие снимков экрана..................................................................................................................... 489
Если сомневаетесь – встряхните тайм-аут!.............................................................................. 492
Выполнение тестов javascript QUnit на Jenkins вместе с PhantomJS............................ 494
Установка node............................................................................................................................................. 494Оглавление ? 13
Добавление шагов сборки в Jenkins ................................................................................................... 495
Больше возможностей с CI-сервером ........................................................................................497
Глава 25. Cоциально зачимый кусок, шаблон проектирования
«Страница» и упражнение для читателя................................................................499
ФТ с многочисленными пользователями и addCleanup ..................................................... 499
Страничный шаблон проектирования........................................................................................ 501
Расширение ФТ до второго пользователя и страница «Мои списки»........................... 504
Упражнение для читателя................................................................................................................ 506
Глава 26. Быстрые тесты, медленные тесты и горячий поля .............................509
Тезис: модульные тесты сверхбыстры и к тому же хороши............................................... 511
Более быстрые тесты означают более быструю разработку..................................................... 511
Священное состояние потока................................................................................................................. 511
Медленные тесты не выполняются часто, что приводит к плохому коду............................. 512
Теперь у нас все в порядке, но интегрированные тесты со временем становятся
медленнее.......................................................................................................................................... 512
Не верьте мне............................................................................................................................................... 512
И модульные тесты управляют хорошей структурой кода......................................................... 512
Проблемы с «чистыми» модульными тестами ........................................................................ 512
Изолированные тесты труднее читать и писать ............................................................................. 512
Изолированные тесты не тестируют интеграцию автоматически........................................... 513
Модульные тесты редко отлавливают неожиданные дефекты ................................................ 513
Тесты с имитациями могут стать близко привязанными к реализации................................ 513
Но все эти проблемы могут быть преодолены ............................................................................... 514
Синтез: что мы хотим от всех наших тестов?........................................................................... 514
Правильность................................................................................................................................................ 514
Чистый код, удобный в сопровождении ........................................................................................... 514
Продуктивный поток операций............................................................................................................. 515
Оценивайте свои тесты относительно преимуществ, которые вы хотите
от них получить ............................................................................................................................... 515
Архитектурные решения.......................................................................................................................... 516
Порты и адаптеры/шестиугольная/чистая архитектура.............................................................. 516
Функциональное ядро, императивная оболочка........................................................................... 517
Заключение ........................................................................................................................................... 518
Дополнительные материалы для чтения........................................................................................... 518
Повинуйтесь Билли-тестировщику! ........................................................................521
Тестировать очень тяжело................................................................................................................ 521
Держите свои сборки CI-сервера на зеленом уровне................................................................. 521
Гордитесь своими тестами так же, как своим программным кодом....................................... 522
Не забудьте дать на чай персоналу заведения....................................................................... 522
Не пропадайте!.................................................................................................................................... 522
Приложение А. PythonAnywhere .............................................................................523
Выполнение сеансов Firefox Selenium при помощи Xvfb.................................................. 523
Настройка Django как веб-приложение PythonAnywhere................................................. 525
Очистка папки /tmp............................................................................................................................ 52614 ? Оглавление
Снимки экрана ..................................................................................................................................... 526
Глава о развертывании..................................................................................................................... 526
Приложение B. Представления на основе классов в Django..............................528
Обобщенные представления на основе классов ................................................................. 528
Домашняя страница как FormView.............................................................................................. 529
Использование form_valid для индивидуализации CreateView ...................................... 530
Более сложное представление для обработки просмотра и добавления
к списку........................................................................................................................................... 533
Сравните старую верию с новой .................................................................................................. 536
Лучшие приемы модульного тестирования обобщенных представлений
на основе классов........................................................................................................................537
Приложение C. Обеспечение работы серверной среды
при помощи Ansible...................................................................................................539
Установка системных пакетов и Nginx....................................................................................... 539
Конфигурирование Gunicorn и использование обработчиков для перезапуска
служб................................................................................................................................................ 541
Что делать дальше.............................................................................................................................. 542
Приложение D. Тестирование миграций базы данных........................................544
Попытка развертывания на промежуточном сервере......................................................... 544
Выполнение тестовой миграции локально............................................................................... 545
Вставка миграции данных............................................................................................................... 546
Совместное тестирование новых миграций .............................................................................547
Выводы.................................................................................................................................................... 548
Приложение E. Разработка на основе поведения (BDD).....................................550
Что такое BDD?..................................................................................................................................... 550
Базовые служебные операции...................................................................................................... 551
Написание ФТ как компонента при помощи синтаксиса языка Gherkin..................... 552
Программирование шаговых функций...................................................................................... 553
Определение первого шага............................................................................................................ 555
Эквиваленты setUp и tearDown в environment.py................................................................. 555
Еще один прогон................................................................................................................................. 556
Извлечение параметров в шагах ................................................................................................. 556
BDD по сравнению с ФТ с локальными комментариями ................................................... 559
BDD способствует написанию структурированного тестового кода.............................. 561
Страничный шаблон проектирования как альтернатива ................................................... 561
BDD может быть менее выразительным, чем локальные комментарии ...................... 563
Будут ли непрограммисты писать тесты? .................................................................................. 563
Некоторые предварительные выводы ....................................................................................... 564
Приложение F. Создание REST API: JSON, Ajax и имитирование
на javascript................................................................................................................565
Наш подход для этого раздела ..................................................................................................... 565
Выбор подхода к тестированию ................................................................................................... 566
Организация базовой конвейерной передачи....................................................................... 566
Получение фактического отклика................................................................................................ 568Оглавление ? 15
Добавление POST-метода................................................................................................................ 569
Тестирование клиентского Ajax при помощи Sinon.js......................................................... 570
Соединение всего в шаблоне, чтобы убедиться, что это реально работает ............... 574
Реализация Ajax POST-запроса, включая маркер CSRF ...................................................... 576
Имитация в javascript ....................................................................................................................... 578
Валидация данных. Упражнение для читателя ....................................................................... 582
Приложение G. Django-Rest-Framework.................................................................587
Инсталляция...........................................................................................................................................587
Сериализаторы (на самом деле – объекты ModelSerializer) ............................................. 588
Объекты Viewset (на самом деле – объекты ModelViewset) и объекты Router ......... 589
Другой URL для элемента с POST-запросом............................................................................ 592
Адаптирование на стороне клиента ........................................................................................... 593
Что дает инфраструктура Django-Rest-Framework................................................................ 595
Приложение H. Шпаргалка.......................................................................................599
Начальная настройка проекта....................................................................................................... 599
Основной поток операций TDD .................................................................................................... 599
Выход за пределы тестирования только на сервере разработки................................... 600
Общие приемы тестирования........................................................................................................ 601
Лучшие приемы на основе Selenium / функциональных тестов..................................... 601
«Снаружи внутрь», изоляция тестов против интегрированных тестов и имитация. 602
Приложение I. Что делать дальше ..........................................................................603
Уведомления – на сайте и по электронной почте................................................................. 603
Переходите на Postgres.................................................................................................................... 604
Выполняйте тесты относительно разных браузеров............................................................ 604
Тесты на коды состояния 404 и 500 ............................................................................................ 604
Сайт администратора Django......................................................................................................... 604
Напишите несколько тестов защищенности............................................................................ 605
Тест на мягкую деградацию............................................................................................................ 605
Кэширование и тестирование и производительности ........................................................ 605
MVC-инфраструктуры для javascript........................................................................................... 605
Async и протокол Websocket........................................................................................................... 606
Перейдите на использование py.test.......................................................................................... 606
Попробуйте coverage.py................................................................................................................... 606
Шифрование на стороне клиента................................................................................................ 606
Здесь место для ваших предложений.........................................................................................607
Приложение J. Примеры исходного кода..............................................................608
Полный список ссылок для каждой главы ............................................................................... 608
Использование Git для проверки вашего прогресса........................................................... 610
Скачивание ZIP-файла для главы................................................................................................. 611
Не позволяйте этому превращаться в костыль! ..................................................................... 611
Предметный указатель .............................................................................................612
Предисловие.................................................................................................................16
Предпосылки и предположения ...............................................................................21
Сопутствующее видео.................................................................................................30
Признательности..........................................................................................................31
Часть I. Основы TDD и Django ............................................................................ 33
Глава 1. Настройка Django с использованием функционального теста .............34
Повинуйтесь Билли-тестировщику! Ничего не делайте, пока у вас не будет теста ....34
Приведение Django в рабочее состояние ................................................................................... 37
Запуск репозитория Git.......................................................................................................................40
Глава 2. Расширение функционального теста при помощи
модуля unittest.............................................................................................................44
Использование функционального теста для определения минимального
дееспособного приложения ......................................................................................................44
Модуль unittest стандартной библиотеки Python .................................................................... 47
Фиксация...................................................................................................................................................50
Глава 3. Тестирование простой домашней страницы при помощи
модульных тестов........................................................................................................52
Первое приложение Django и первый модульный тест.........................................................53
Модульные тесты и их отличия от функциональных тестов.................................................53
Модульное тестирование в Django.................................................................................................55
MVC в Django, URL-адреса и функции представления............................................................56
Наконец-то! Мы на самом деле напишем прикладной код! ...............................................58
Файл urls.py..............................................................................................................................................59
Модульное тестирование представления....................................................................................62
Цикл «модульный-тест/программный-код»................................................................................64
Глава 4. И что же делать со всеми этими тестами (и рефакторизацией)? .........68
Программировать – все равно что поднимать ведро с водой из колодца ....................69
Использование Selenium для тестирования взаимодействий пользователя ...............71
Правило «Не тестировать константы» и шаблоны во спасение.........................................74
Перестройка программного кода для использования шаблона................................................75
Тестовый клиент Django ..............................................................................................................................79
О рефакторизации.................................................................................................................................81
Еще немного о главной странице ...................................................................................................83
Резюме: процесс TDD...........................................................................................................................85
Глава 5. Сохранение вводимых пользователем данных: тестирование
базы данных.................................................................................................................886 ? Оглавление
Подключение формы для отправки POST-запроса .................................................................89
Обработка POST-запроса на сервере............................................................................................92
Передача переменных Python для вывода в шаблоне..........................................................93
Если клюнуло трижды, рефакторизуй ...........................................................................................98
Django ORM и первая модель........................................................................................................ 100
Первая миграция базы данных............................................................................................................. 102
Тест продвинулся удивительно далеко .............................................................................................. 103
Новое поле означает новую миграцию ............................................................................................. 104
Сохранение POST-запроса в базу данных................................................................................ 105
Переадресация после POST-запроса.......................................................................................... 108
Лучшие приемы модульного тестирования: каждый тест должен проверять
одну единицу кода.......................................................................................................................... 109
Генерирование элементов в шаблоне........................................................................................ 110
Создание производственной базы данных при помощи команды migrate............... 112
Резюме..................................................................................................................................................... 115
Глава 6. Усовершенствование функциональных тестов: обеспечение
изоляции и удаление методов sleep ......................................................................118
Обеспечение изоляции в функциональных тестах............................................................... 118
Выполнение только модульных тестов ............................................................................................. 122
Ремарка: обновление Selenium и Geckodriver........................................................................ 123
О неявных и явных ожиданиях и методе time.sleep............................................................ 124
Глава 7. Работа в инкрементном режиме...............................................................130
Маломасштабные конструктивные изменения по мере необходимости.................... 130
В первую очередь маломасштабные конструктивные изменения ........................................ 131
Вам это никогда не понадобится! ........................................................................................................ 131
REST (-овский) подход.............................................................................................................................. 132
Инкрементная реализация новой структуры кода на основе TDD................................ 133
Обеспечение теста на наличие регрессии .............................................................................. 134
Итеративное движение в сторону новой структуры кода...................................................137
Первый самодостаточный шаг: один новый URL-адрес ..................................................... 139
Новый URL-адрес........................................................................................................................................ 140
Новая функция представления.............................................................................................................. 140
Зеленый? Рефакторизуй! ................................................................................................................. 142
Еще один шажок: отдельный шаблон для просмотра списков........................................ 143
Третий шажок: URL-адрес для добавления элементов списка ........................................ 146
Тестовый класс для создания нового списка................................................................................... 146
URL-адрес и представление для создания нового списка......................................................... 148
Удаление теперь уже избыточного кода и тестов.......................................................................... 149
Регрессия! Наведение форм на новый URL-адрес........................................................................ 149
Стиснув зубы: корректировка моделей ..................................................................................... 151
Связь по внешнему ключу ....................................................................................................................... 153
Адаптация остальной части мира к новым моделям ................................................................... 155
Каждому списку – свой URL-адрес...............................................................................................157
Извлечение параметров из URL-адресов ......................................................................................... 158
Адаптирование new_list к новому миру............................................................................................ 160Оглавление ? 7
Функциональные тесты обнаруживают еще одну регрессию .......................................... 161
Еще одно представление для добавления элементов в существующий список...... 162
Остерегайтесь «жадных» регулярных выражений!....................................................................... 163
Последний новый URL-адрес................................................................................................................. 164
Последнее новое представление......................................................................................................... 165
Тестирование контекстных объектов отклика напрямую........................................................... 166
Финальная рефакторизация с использованием URL-включений................................... 168
Часть II. Непременные условия веб-разработки ............................. 171
Глава 8. Придание привлекательного вида: макет, стилевое оформление
сайта и что тут тестировать ......................................................................................172
Что функционально тестируется в макете и стилевом оформлении............................. 172
Придание привлекательного вида: использование платформы CSS............................ 176
Наследование шаблонов в Django .............................................................................................. 178
Интеграция платформы Bootstrap ............................................................................................... 180
Строки и столбцы ........................................................................................................................................ 180
Статические файлы в Django.......................................................................................................... 182
Переход на StaticLiveServerTestCase.................................................................................................. 183
Использование компонентов Bootstrap для улучшения внешнего вида сайта........ 184
Класс jumbotron........................................................................................................................................... 184
Большие поля ввода .................................................................................................................................. 185
Стилистическое оформление таблицы............................................................................................... 185
Использование собственного CSS ............................................................................................... 185
О чем мы умолчали: collectstatic и другие статические каталоги...................................187
Несколько вещей, которые не удались...................................................................................... 190
Глава 9. Тестирование развертывания с использованием промежуточного
сайта.............................................................................................................................191
TDD и опасные зоны развертывания ......................................................................................... 192
Как всегда, начинайте с теста ........................................................................................................ 194
Получение доменного имени ........................................................................................................ 196
Ручное обеспечение работы сервера для размещения сайта......................................... 196
Выбор места размещения сайта........................................................................................................... 197
Запуск сервера............................................................................................................................................. 197
Учетные записи пользователей, SSH и полномочия..................................................................... 198
Инсталляция Nginx..................................................................................................................................... 198
Инсталляция Python 3.6............................................................................................................................ 200
Конфигурирование доменов для промежуточного и реального серверов........................ 200
Использование ФТ для подтверждения, что домен работает и Nginx выполняется...... 201
Развертывание исходного кода вручную.................................................................................. 201
Корректировка расположения базы данных................................................................................... 202
Создание Virtualenv вручную и использование requirements.txt........................................... 204
Простое конфигурирование Nginx...................................................................................................... 206
Создание базы данных при помощи команды migrate............................................................... 209
Победа! Наше хакерское развертывание работает............................................................. 2108 ? Оглавление
Глава 10. Переход к развертыванию, готовому к эксплуатации........................212
Переход на Gunicorn.......................................................................................................................... 212
Настройка Nginx для раздачи статических файлов ............................................................. 214
Переход на использование сокетов Unix................................................................................. 215
Присвоение DEBUG значения False и настройка ALLOWED_HOSTS ............................. 216
Применение Systemd для проверки, что Gunicorn запускается на начальной
загрузке............................................................................................................................................217
Сохранение изменений: добавление Gunicorn в файл requirements.txt............................. 218
Размышления об автоматизации.................................................................................................. 219
Сохранение шаблонов конфигурационных файлов этапа обеспечения работы ............ 219
Сохранение хода выполнения....................................................................................................... 222
Глава 11. Автоматизация развертывания с помощью Fabric .............................224
Описание частей сценария Fabric для развертывания....................................................... 225
Создание структуры каталогов.............................................................................................................. 226
Получение исходного кода из репозитория командой git........................................................ 226
Обновление файла settings.py............................................................................................................... 227
Обновление virtualenv.............................................................................................................................. 229
Миграция базы данных при необходимости................................................................................... 229
Испытание автоматизации.............................................................................................................. 230
Развертывание на работающем сайте ............................................................................................... 231
Конфигурирование Nginx и Gunicorn при помощи sed .............................................................. 234
Маркировка релиза командой git tag ....................................................................................... 235
Дополнительные материалы для чтения................................................................................... 236
Глава 12. Разделение тестов на многочисленные файлы и обобщенный
помощник ожидания.................................................................................................238
Начало с ФТ валидации данных: предотвращение пустых элементов ........................ 238
Пропуск теста................................................................................................................................................ 239
Разбиение функциональных тестов на несколько файлов........................................................ 241
Выполнение только одного файла с тестами .................................................................................. 244
Новый инструмент функционального тестирования: обобщенная
вспомогательная функция явного ожидания................................................................... 245
Завершение ФТ.................................................................................................................................... 249
Рефакторизация модульных тестов на несколько файлов ................................................ 251
Глава 13. Валидация на уровне базы данных.......................................................254
Валидация на уровне модели........................................................................................................ 255
Контекстный менеджер self.assertRaises ......................................................................................... 255
Причуда Django: сохранение модели не выполняет валидацию............................................ 256
Выведение на поверхность ошибок валидации модели в представлении .................257
Проверка, чтобы недопустимые входные данные не сохранялись в базе данных......... 261
Схема Django: обработка POST-запросов в том же представлении, которое
генерирует форму....................................................................................................................... 263
Рефакторизация: передача функциональности new_item в view_list................................... 264
Обеспечение валидации модели в view_list ................................................................................... 267
Рефакторизация: удаление жестко кодированных URL-адресов.................................... 269Оглавление ? 9
Тег {% url %} шаблона................................................................................................................................ 269
Использование get_absolute_url для переадресаций.................................................................. 270
Глава 14. Простая форма ..........................................................................................274
Перемещение программной логики валидации из формы .............................................. 274
Исследование API форм при помощи модульного теста............................................................ 275
Переход на Django ModelForm ............................................................................................................. 277
Тестирование и индивидуальная настройка валидации формы............................................. 278
Использование формы в представлениях................................................................................ 281
Использование формы в представлении с GET-запросом......................................................... 281
Глобальный поиск и замена.................................................................................................................... 282
Использование формы в представлении, принимающем POST-запросы .................. 285
Адаптация модульных тестов к представлению new_list ........................................................... 285
Использование формы в представлении.......................................................................................... 287
Использование формы для отображения ошибок в шаблоне................................................. 287
Использование формы в другом представлении.................................................................. 288
Вспомогательный метод для нескольких коротких тестов........................................................ 289
Неожиданное преимущество: бесплатная валидация на стороне клиента из HTML5.......291
Одобряющее похлопывание по спине....................................................................................... 293
Не потратили ли мы уйму времени впустую? ......................................................................... 294
Использование собственного для формы метода save ...................................................... 295
Глава 15. Более развитые формы ...........................................................................298
Еще один ФТ на наличие повторяющихся элементов......................................................... 298
Предотвращение дубликатов на уровне модели .......................................................................... 299
Небольшое отступление по поводу упорядочивания Queryset и представлений
строковых значений....................................................................................................................... 301
Новое написание старого теста модели ........................................................................................... 304
Некоторые ошибки целостности проявляются при сохранении............................................. 306
Экспериментирование с проверкой на наличие повторяющихся элементов
на уровне представлений.........................................................................................................307
Более сложная форма для проверки на наличие повторяющихся значений ........... 308
Использование существующей формы для элемента списка в представлении
для списка...................................................................................................................................... 310
Итоги: что мы узнали о тестировании Django......................................................................... 313
Глава 16 Пробуем окунуться, очень робко, в javascript......................................316
Начинаем с ФТ..................................................................................................................................... 316
Настройка элементарного исполнителя тестов на javascript........................................... 318
Использование элемента div для jQuery и фикстуры .......................................................... 320
Создание модульного теста на javascript для требуемой функциональности.......... 324
Фикстуры, порядок выполнения и глобальное состояние: ключевые проблемы
тестирования на JS...................................................................................................................... 326
console.log для отладочной распечатки............................................................................................ 326
Использование функции инициализации для большего контроля над временем
выполнения........................................................................................................................................ 328
Коломбо говорит: стереотипный код для onload и организация пространства10 ? Оглавление
имен.................................................................................................................................................. 330
Тестирование на javascript в цикле TDD................................................................................... 332
Несколько вещей, которые не удалось сделать...................................................................... 332
Глава 17. Развертывание нового программного кода .........................................334
Развертывание на промежуточном сервере ........................................................................... 334
Развертывание на реальном сервере ........................................................................................ 335
Что делать, если вы видите ошибку базы данных................................................................. 335
Итоги: маркировка нового релиза командой git tag ........................................................... 335
Часть III. Основы TDD и Django....................................................................... 337
Глава 18. Аутентификация пользователя, импульсное исследование
и внедрение его результатов...................................................................................338
Беспарольная аутентификация ..................................................................................................... 338
Разведочное программирование, или Импульсное исследование................................ 339
Открытие ветки для результатов импульсного исследования ................................................. 340
Авторизация на стороне клиента в пользовательском интерфейсе...................................... 341
Отправка электронных писем из Django .......................................................................................... 341
Использование переменных окружения для предотвращения секретов
в исходном коде .............................................................................................................................. 344
Хранение маркеров в базе данных..................................................................................................... 344
Индивидуализированные модели аутентификации..................................................................... 345
Завершение индивидуализированной авторизации в Django................................................ 346
Внедрение результатов импульсного исследования............................................................ 351
Возвращение импульсного исходного кода в прежний вид..................................................... 353
Минимальная индивидуализированная модель пользователя ....................................... 354
Тесты в качестве документирования .................................................................................................. 357
Модель маркера для соединения электронных адресов с уникальным
идентификатором ....................................................................................................................... 358
Глава 19. Использование имитаций для тестирования внешних
зависимостей или сокращения дублирования.....................................................362
Перед началом: получение базовой инфраструктуры ........................................................ 362
Создание имитаций вручную, или Обезьянья заплатка...................................................... 363
Библиотека Mock .................................................................................................................................367
Использование unittest.patch ................................................................................................................ 368
Продвижение ФТ чуть дальше вперед............................................................................................... 371
Тестирование инфраструктуры сообщений Django...................................................................... 371
Добавление сообщений в HTML........................................................................................................... 374
Начало с URL-адреса для входа в систему....................................................................................... 375
Подтверждение отправки пользователю ссылки с маркером ................................................. 376
Создание индивидуализированного серверного процессора аутентификации
на основе результатов импульсного исследования...................................................... 378
Еще один тест для каждого случая ...................................................................................................... 379
Метод get_user ............................................................................................................................................. 382Оглавление ? 11
Использование серверного процессора аутентификации в представлении
входа в систему................................................................................................................................ 384
Еще одна причина использовать имитации: устранение повторов............................... 385
Использование mock.return_value....................................................................................................... 388
Установка заплатки на уровне класса................................................................................................ 390
Момент истины: пройдет ли ФТ?.................................................................................................. 392
Теоретически – работает! Работает ли на практике?........................................................... 394
Завершение ФТ, тестирование выхода из системы ...................................................................... 396
Глава 20. Тестовые фикстуры и декоратор для явных ожиданий.....................399
Пропуск регистрации в системе путем предварительного создания сеанса............. 399
Проверка работоспособности решения ............................................................................................ 402
Финальный вспомогательный метод явного ожидания: декоратор ожидания......... 405
Глава 21. Отладка на стороне сервера ...................................................................410
Чтобы убедиться в пудинге, надо его попробовать: использование
предварительного сервера для отлавливания финальных дефектов................... 410
Настройка журналирования................................................................................................................... 411
Установка секретных переменных окружения на сервере ............................................... 413
Адаптация ФТ для тестирования реальных электронных писем POP3........................ 414
Управление тестовой базой данных на промежуточном сервере ................................ 418
Управляющая команда Django для создания сеансов................................................................. 418
Настройка ФТ для выполнения управляющей команды на сервере .................................... 420
Использование fabric напрямую из Python...................................................................................... 421
Резюме: создание сеансов локально по сравнению с промежуточным сервером......... 422
Внедрение программного кода журналирования................................................................. 424
Итоги ........................................................................................................................................................ 425
Глава 22. Завершение приложения «Мои списки»: TDD с подходом
«снаружи внутрь» ......................................................................................................427
Альтернатива: «изнутри наружу»...................................................................................................427
Почему «снаружи внутрь» предпочтительнее?....................................................................... 428
ФТ для «Моих списков».................................................................................................................... 428
Внешний уровень: презентация и шаблоны............................................................................ 431
Спуск на один уровень вниз к функциям представления (к контроллеру)................. 431
Еще один проход снаружи внутрь ............................................................................................... 433
Быстрая реструктуризация иерархии наследования шаблонов.............................................. 433
Конструирование API при помощи шаблона................................................................................... 434
Спуск к следующему уровню: что именно представление передает в шаблон................ 436
Следующее техническое требование из уровня представлений: новые списки
должны записывать владельца ..............................................................................................437
Момент принятия решения: перейти к следующему уровню с неработающим
тестом или нет................................................................................................................................... 438
Спуск к уровню модели.................................................................................................................... 439
Финальный шаг: подача .name API из шаблона............................................................................. 441
Глава 23. Изоляция тестов и «слушание своих тестов».......................................44412 ? Оглавление
Пересмотр точки принятия решения: уровень представлений зависит
от ненаписанного кода моделей .......................................................................................... 444
Первая попытка использования имитаций для изоляции................................................. 446
Использование имитации side_effects для проверки последовательности событий..... 447
Слушайте свои тесты: уродливые тесты сигнализируют о необходимости
рефакторизации .......................................................................................................................... 449
Написание тестов по-новому для представления, которое будет
полностью изолировано........................................................................................................... 450
Держите рядом старый комплект интегрированных тестов в качестве проверки
на токсичность.................................................................................................................................. 450
Новый комплект тестов с полной изоляцией .................................................................................. 451
Мышление с точки зрения взаимодействующих объектов ....................................................... 452
Спуск вниз на уровень форм...........................................................................................................457
Продолжайте слушать свои тесты: удаление программного кода ORM из нашего
приложения ...................................................................................................................................... 458
Наконец, спуск вниз на уровень моделей ................................................................................ 462
Назад к представлениям.......................................................................................................................... 464
Момент истины (и риски имитации)............................................................................................ 466
Точка зрения о взаимодействиях между уровнями как о контрактах...........................467
Идентификация неявных контрактов................................................................................................. 468
Исправление недосмотра........................................................................................................................ 469
Еще один тест........................................................................................................................................ 471
Наведение порядка: что следует убрать из комплекта интегрированных тестов.... 472
Удаление избыточного кода на уровне форм................................................................................. 472
Удаление старой реализации представления................................................................................. 473
Удаление избыточного кода на уровне форм................................................................................. 474
Выводы: когда писать изолированные тесты, а когда – интегрированные................. 475
Пусть вычислительная сложность будет вашим гидом................................................................ 476
Следует ли делать оба типа тестов?..................................................................................................... 477
Вперед!............................................................................................................................................................ 477
Глава 24. Непрерывная интеграция........................................................................479
Инсталляция сервера Jenkins......................................................................................................... 479
Конфигурирование сервера Jenkins............................................................................................ 481
Первоначальная разблокировка .......................................................................................................... 481
Набор плагинов на первое время........................................................................................................ 481
Конфигурирование пользователя-администратора ..................................................................... 482
Добавление плагинов ............................................................................................................................... 483
Указание серверу Jenkins, где искать Python 3 и Xvfb................................................................. 483
Завершение с HTTPS................................................................................................................................. 484
Настройка проекта ............................................................................................................................. 484
Первая сборка!..................................................................................................................................... 485
Установка виртуального дисплея, чтобы ФТ выполнялись бездисплейно ...................487
Взятие снимков экрана..................................................................................................................... 489
Если сомневаетесь – встряхните тайм-аут!.............................................................................. 492
Выполнение тестов javascript QUnit на Jenkins вместе с PhantomJS............................ 494
Установка node............................................................................................................................................. 494Оглавление ? 13
Добавление шагов сборки в Jenkins ................................................................................................... 495
Больше возможностей с CI-сервером ........................................................................................497
Глава 25. Cоциально зачимый кусок, шаблон проектирования
«Страница» и упражнение для читателя................................................................499
ФТ с многочисленными пользователями и addCleanup ..................................................... 499
Страничный шаблон проектирования........................................................................................ 501
Расширение ФТ до второго пользователя и страница «Мои списки»........................... 504
Упражнение для читателя................................................................................................................ 506
Глава 26. Быстрые тесты, медленные тесты и горячий поля .............................509
Тезис: модульные тесты сверхбыстры и к тому же хороши............................................... 511
Более быстрые тесты означают более быструю разработку..................................................... 511
Священное состояние потока................................................................................................................. 511
Медленные тесты не выполняются часто, что приводит к плохому коду............................. 512
Теперь у нас все в порядке, но интегрированные тесты со временем становятся
медленнее.......................................................................................................................................... 512
Не верьте мне............................................................................................................................................... 512
И модульные тесты управляют хорошей структурой кода......................................................... 512
Проблемы с «чистыми» модульными тестами ........................................................................ 512
Изолированные тесты труднее читать и писать ............................................................................. 512
Изолированные тесты не тестируют интеграцию автоматически........................................... 513
Модульные тесты редко отлавливают неожиданные дефекты ................................................ 513
Тесты с имитациями могут стать близко привязанными к реализации................................ 513
Но все эти проблемы могут быть преодолены ............................................................................... 514
Синтез: что мы хотим от всех наших тестов?........................................................................... 514
Правильность................................................................................................................................................ 514
Чистый код, удобный в сопровождении ........................................................................................... 514
Продуктивный поток операций............................................................................................................. 515
Оценивайте свои тесты относительно преимуществ, которые вы хотите
от них получить ............................................................................................................................... 515
Архитектурные решения.......................................................................................................................... 516
Порты и адаптеры/шестиугольная/чистая архитектура.............................................................. 516
Функциональное ядро, императивная оболочка........................................................................... 517
Заключение ........................................................................................................................................... 518
Дополнительные материалы для чтения........................................................................................... 518
Повинуйтесь Билли-тестировщику! ........................................................................521
Тестировать очень тяжело................................................................................................................ 521
Держите свои сборки CI-сервера на зеленом уровне................................................................. 521
Гордитесь своими тестами так же, как своим программным кодом....................................... 522
Не забудьте дать на чай персоналу заведения....................................................................... 522
Не пропадайте!.................................................................................................................................... 522
Приложение А. PythonAnywhere .............................................................................523
Выполнение сеансов Firefox Selenium при помощи Xvfb.................................................. 523
Настройка Django как веб-приложение PythonAnywhere................................................. 525
Очистка папки /tmp............................................................................................................................ 52614 ? Оглавление
Снимки экрана ..................................................................................................................................... 526
Глава о развертывании..................................................................................................................... 526
Приложение B. Представления на основе классов в Django..............................528
Обобщенные представления на основе классов ................................................................. 528
Домашняя страница как FormView.............................................................................................. 529
Использование form_valid для индивидуализации CreateView ...................................... 530
Более сложное представление для обработки просмотра и добавления
к списку........................................................................................................................................... 533
Сравните старую верию с новой .................................................................................................. 536
Лучшие приемы модульного тестирования обобщенных представлений
на основе классов........................................................................................................................537
Приложение C. Обеспечение работы серверной среды
при помощи Ansible...................................................................................................539
Установка системных пакетов и Nginx....................................................................................... 539
Конфигурирование Gunicorn и использование обработчиков для перезапуска
служб................................................................................................................................................ 541
Что делать дальше.............................................................................................................................. 542
Приложение D. Тестирование миграций базы данных........................................544
Попытка развертывания на промежуточном сервере......................................................... 544
Выполнение тестовой миграции локально............................................................................... 545
Вставка миграции данных............................................................................................................... 546
Совместное тестирование новых миграций .............................................................................547
Выводы.................................................................................................................................................... 548
Приложение E. Разработка на основе поведения (BDD).....................................550
Что такое BDD?..................................................................................................................................... 550
Базовые служебные операции...................................................................................................... 551
Написание ФТ как компонента при помощи синтаксиса языка Gherkin..................... 552
Программирование шаговых функций...................................................................................... 553
Определение первого шага............................................................................................................ 555
Эквиваленты setUp и tearDown в environment.py................................................................. 555
Еще один прогон................................................................................................................................. 556
Извлечение параметров в шагах ................................................................................................. 556
BDD по сравнению с ФТ с локальными комментариями ................................................... 559
BDD способствует написанию структурированного тестового кода.............................. 561
Страничный шаблон проектирования как альтернатива ................................................... 561
BDD может быть менее выразительным, чем локальные комментарии ...................... 563
Будут ли непрограммисты писать тесты? .................................................................................. 563
Некоторые предварительные выводы ....................................................................................... 564
Приложение F. Создание REST API: JSON, Ajax и имитирование
на javascript................................................................................................................565
Наш подход для этого раздела ..................................................................................................... 565
Выбор подхода к тестированию ................................................................................................... 566
Организация базовой конвейерной передачи....................................................................... 566
Получение фактического отклика................................................................................................ 568Оглавление ? 15
Добавление POST-метода................................................................................................................ 569
Тестирование клиентского Ajax при помощи Sinon.js......................................................... 570
Соединение всего в шаблоне, чтобы убедиться, что это реально работает ............... 574
Реализация Ajax POST-запроса, включая маркер CSRF ...................................................... 576
Имитация в javascript ....................................................................................................................... 578
Валидация данных. Упражнение для читателя ....................................................................... 582
Приложение G. Django-Rest-Framework.................................................................587
Инсталляция...........................................................................................................................................587
Сериализаторы (на самом деле – объекты ModelSerializer) ............................................. 588
Объекты Viewset (на самом деле – объекты ModelViewset) и объекты Router ......... 589
Другой URL для элемента с POST-запросом............................................................................ 592
Адаптирование на стороне клиента ........................................................................................... 593
Что дает инфраструктура Django-Rest-Framework................................................................ 595
Приложение H. Шпаргалка.......................................................................................599
Начальная настройка проекта....................................................................................................... 599
Основной поток операций TDD .................................................................................................... 599
Выход за пределы тестирования только на сервере разработки................................... 600
Общие приемы тестирования........................................................................................................ 601
Лучшие приемы на основе Selenium / функциональных тестов..................................... 601
«Снаружи внутрь», изоляция тестов против интегрированных тестов и имитация. 602
Приложение I. Что делать дальше ..........................................................................603
Уведомления – на сайте и по электронной почте................................................................. 603
Переходите на Postgres.................................................................................................................... 604
Выполняйте тесты относительно разных браузеров............................................................ 604
Тесты на коды состояния 404 и 500 ............................................................................................ 604
Сайт администратора Django......................................................................................................... 604
Напишите несколько тестов защищенности............................................................................ 605
Тест на мягкую деградацию............................................................................................................ 605
Кэширование и тестирование и производительности ........................................................ 605
MVC-инфраструктуры для javascript........................................................................................... 605
Async и протокол Websocket........................................................................................................... 606
Перейдите на использование py.test.......................................................................................... 606
Попробуйте coverage.py................................................................................................................... 606
Шифрование на стороне клиента................................................................................................ 606
Здесь место для ваших предложений.........................................................................................607
Приложение J. Примеры исходного кода..............................................................608
Полный список ссылок для каждой главы ............................................................................... 608
Использование Git для проверки вашего прогресса........................................................... 610
Скачивание ZIP-файла для главы................................................................................................. 611
Не позволяйте этому превращаться в костыль! ..................................................................... 611
Предметный указатель .............................................................................................612
Название: Python. Разработка на основе тестирования
Автор: Персиваль Г.
Год: 2018
Жанр: программирование
Издательство: ДМК Пресс
Язык: Русский
Формат: pdf
Качество: eBook
Страниц: 624
Размер: 10 MB
Скачать Персиваль Г. - Python. Разработка на основе тестирования (2018)
Наш сайт не предоставляет ссылки на скачивание |
Наш сайт не предоставляет ссылки на скачивание |
Наш сайт не предоставляет ссылки на скачивание |
Ключевые теги: программирование, книги, Python, Разработка на основе тестирования
Другие новости по теме:
Панель управления
Реклама
Архив сайта
Октябрь 2023 (1)Сентябрь 2023 (15)
Ноябрь 2022 (9)
Октябрь 2022 (27)
Сентябрь 2022 (53)
Июль 2022 (70)
Июнь 2022 (100)
Май 2022 (198)
Апрель 2022 (63)
Март 2022 (5)
Февраль 2022 (82)
Январь 2022 (191)
Декабрь 2021 (101)
Ноябрь 2021 (13)
Октябрь 2021 (28)
Сентябрь 2021 (16)
Август 2021 (18)
Июль 2021 (24)
Июнь 2021 (5)
Апрель 2021 (12)
Март 2021 (11)
Февраль 2021 (1)
Январь 2021 (14)
Декабрь 2020 (11)
Ноябрь 2020 (68)
Октябрь 2020 (102)
Сентябрь 2020 (267)
Август 2020 (273)
Июль 2020 (204)
Июнь 2020 (278)
Май 2020 (420)
Апрель 2020 (302)
Март 2020 (85)
Февраль 2020 (78)
Январь 2020 (272)
Декабрь 2019 (143)
Ноябрь 2019 (209)
Октябрь 2019 (296)
Сентябрь 2019 (340)
Август 2019 (288)
Июль 2019 (338)
Июнь 2019 (298)
Май 2019 (125)
Апрель 2019 (461)
Март 2019 (471)
Февраль 2019 (343)
Январь 2019 (298)
Декабрь 2018 (279)
Ноябрь 2018 (170)
Октябрь 2018 (216)
Сентябрь 2018 (142)
Август 2018 (70)
Июль 2018 (110)
Июнь 2018 (141)
Май 2018 (215)
Апрель 2018 (178)
Март 2018 (203)
Февраль 2018 (132)
Январь 2018 (179)
Декабрь 2017 (317)
Ноябрь 2017 (320)
Октябрь 2017 (109)
Сентябрь 2017 (163)
Август 2017 (218)
Июль 2017 (295)
Июнь 2017 (231)
Май 2017 (219)
Апрель 2017 (174)
Март 2017 (414)
Февраль 2017 (593)
Январь 2017 (1129)
Декабрь 2016 (912)
Ноябрь 2016 (962)
Октябрь 2016 (913)
Сентябрь 2016 (651)
Август 2016 (392)
Июль 2016 (496)
Июнь 2016 (483)
Май 2016 (693)
Апрель 2016 (961)
Март 2016 (573)
Февраль 2016 (1035)
Январь 2016 (373)
Декабрь 2015 (198)
Ноябрь 2015 (91)
Октябрь 2015 (4)
Сентябрь 2015 (237)
Август 2015 (8)
Июль 2015 (799)
Июнь 2015 (1668)
Май 2015 (856)
Апрель 2015 (1845)
Март 2015 (1235)
Февраль 2015 (1)
Декабрь 2014 (6)
Ноябрь 2014 (11)
Октябрь 2014 (8)
Сентябрь 2014 (254)
Август 2014 (17692)
Июль 2014 (18437)
Июнь 2014 (19800)
Май 2014 (20722)
Апрель 2014 (19219)
Март 2014 (18764)
Февраль 2014 (17891)
Январь 2014 (23195)
Декабрь 2013 (16543)
Ноябрь 2013 (354)
Октябрь 2013 (475)
Сентябрь 2013 (408)
Август 2013 (243)
Июль 2013 (160)
Июнь 2013 (727)
Май 2013 (700)
Апрель 2013 (614)
Март 2013 (732)
Февраль 2013 (500)
Январь 2013 (584)
Декабрь 2012 (549)
Ноябрь 2012 (1154)
Октябрь 2012 (783)
Сентябрь 2012 (1154)
Август 2012 (624)
Июль 2012 (1114)
Июнь 2012 (1246)
Май 2012 (2941)
Апрель 2012 (3200)
Март 2012 (1359)
Январь 2012 (484)
Ноябрь 2011 (1692)
Октябрь 2011 (3643)
Сентябрь 2011 (2220)
Август 2011 (1770)
Июль 2011 (3102)
Июнь 2011 (1511)
Май 2011 (528)
Апрель 2011 (538)
Март 2011 (607)
Февраль 2011 (106)
Январь 2011 (2)
Октябрь 2010 (43)
Сентябрь 2010 (130)
Август 2010 (38)
Июль 2010 (44)
Март 2010 (63)
Февраль 2010 (192)
Январь 2010 (92)
Декабрь 2009 (110)
Май 2022 (198)
Апрель 2022 (63)
Март 2022 (5)
Февраль 2022 (82)
Январь 2022 (191)
Декабрь 2021 (101)
Ноябрь 2021 (13)
Октябрь 2021 (28)
Сентябрь 2021 (16)
Август 2021 (18)
Июль 2021 (24)
Июнь 2021 (5)
Апрель 2021 (12)
Март 2021 (11)
Февраль 2021 (1)
Январь 2021 (14)
Декабрь 2020 (11)
Ноябрь 2020 (68)
Октябрь 2020 (102)
Сентябрь 2020 (267)
Август 2020 (273)
Июль 2020 (204)
Июнь 2020 (278)
Май 2020 (420)
Апрель 2020 (302)
Март 2020 (85)
Февраль 2020 (78)
Январь 2020 (272)
Декабрь 2019 (143)
Ноябрь 2019 (209)
Октябрь 2019 (296)
Сентябрь 2019 (340)
Август 2019 (288)
Июль 2019 (338)
Июнь 2019 (298)
Май 2019 (125)
Апрель 2019 (461)
Март 2019 (471)
Февраль 2019 (343)
Январь 2019 (298)
Декабрь 2018 (279)
Ноябрь 2018 (170)
Октябрь 2018 (216)
Сентябрь 2018 (142)
Август 2018 (70)
Июль 2018 (110)
Июнь 2018 (141)
Май 2018 (215)
Апрель 2018 (178)
Март 2018 (203)
Февраль 2018 (132)
Январь 2018 (179)
Декабрь 2017 (317)
Ноябрь 2017 (320)
Октябрь 2017 (109)
Сентябрь 2017 (163)
Август 2017 (218)
Июль 2017 (295)
Июнь 2017 (231)
Май 2017 (219)
Апрель 2017 (174)
Март 2017 (414)
Февраль 2017 (593)
Январь 2017 (1129)
Декабрь 2016 (912)
Ноябрь 2016 (962)
Октябрь 2016 (913)
Сентябрь 2016 (651)
Август 2016 (392)
Июль 2016 (496)
Июнь 2016 (483)
Май 2016 (693)
Апрель 2016 (961)
Март 2016 (573)
Февраль 2016 (1035)
Январь 2016 (373)
Декабрь 2015 (198)
Ноябрь 2015 (91)
Октябрь 2015 (4)
Сентябрь 2015 (237)
Август 2015 (8)
Июль 2015 (799)
Июнь 2015 (1668)
Май 2015 (856)
Апрель 2015 (1845)
Март 2015 (1235)
Февраль 2015 (1)
Декабрь 2014 (6)
Ноябрь 2014 (11)
Октябрь 2014 (8)
Сентябрь 2014 (254)
Август 2014 (17692)
Июль 2014 (18437)
Июнь 2014 (19800)
Май 2014 (20722)
Апрель 2014 (19219)
Март 2014 (18764)
Февраль 2014 (17891)
Январь 2014 (23195)
Декабрь 2013 (16543)
Ноябрь 2013 (354)
Октябрь 2013 (475)
Сентябрь 2013 (408)
Август 2013 (243)
Июль 2013 (160)
Июнь 2013 (727)
Май 2013 (700)
Апрель 2013 (614)
Март 2013 (732)
Февраль 2013 (500)
Январь 2013 (584)
Декабрь 2012 (549)
Ноябрь 2012 (1154)
Октябрь 2012 (783)
Сентябрь 2012 (1154)
Август 2012 (624)
Июль 2012 (1114)
Июнь 2012 (1246)
Май 2012 (2941)
Апрель 2012 (3200)
Март 2012 (1359)
Январь 2012 (484)
Ноябрь 2011 (1692)
Октябрь 2011 (3643)
Сентябрь 2011 (2220)
Август 2011 (1770)
Июль 2011 (3102)
Июнь 2011 (1511)
Май 2011 (528)
Апрель 2011 (538)
Март 2011 (607)
Февраль 2011 (106)
Январь 2011 (2)
Октябрь 2010 (43)
Сентябрь 2010 (130)
Август 2010 (38)
Июль 2010 (44)
Март 2010 (63)
Февраль 2010 (192)
Январь 2010 (92)
Декабрь 2009 (110)