- •Об авторе
- •О группе редакторов
- •Предисловие
- •Введение
- •Как использовать эту книгу
- •Загрузка исходного кода CPython
- •Что в исходном коде?
- •Настройка среды разработки
- •IDE или редактор?
- •Настройка Visual Studio
- •Настройка Visual Studio Code
- •Настройка Vim
- •Выводы
- •Компиляция CPython
- •Компиляция CPython на macOS
- •Компиляция CPython на Linux
- •Установка специализированной версии
- •Знакомство с Make
- •Make-цели CPython
- •Компиляция CPython на Windows
- •Профильная оптимизация
- •Выводы
- •Грамматика и язык Python
- •Спецификация языка Python
- •Генератор парсеров
- •Повторное генерирование грамматики
- •Выводы
- •Конфигурация и ввод
- •Конфигурация состояния
- •Структура данных конфигурации среды выполнения
- •Конфигурация сборки
- •Сборка модуля из входных данных
- •Выводы
- •Генерирование конкретного синтаксического дерева
- •Парсер/токенизатор CPython
- •Абстрактные синтаксические деревья
- •Важные термины
- •Пример: добавление оператора «почти равно»
- •Выводы
- •Компилятор
- •Исходные файлы
- •Важные термины
- •Создание экземпляра компилятора
- •Флаги будущей функциональности и флаги компилятора
- •Таблицы символических имен
- •Основная компиляция
- •Ассемблер
- •Создание объекта кода
- •Использование Instaviz для вывода объекта кода
- •Пример: реализация оператора «почти равно»
- •Выводы
- •Цикл вычисления
- •Исходные файлы
- •Важные термины
- •Построение состояния потока
- •Построение объектов кадров
- •Выполнение кадра
- •Стек значений
- •Пример: добавление элемента в список
- •Выводы
- •Управление памятью
- •Выделение памяти в C
- •Проектирование системы управления памятью Python
- •Аллокаторы памяти CPython
- •Область выделения объектной памяти и PyMem
- •Область выделения сырой памяти
- •Нестандартные области выделения памяти
- •Санитайзеры выделенной памяти
- •Арена памяти PyArena
- •Подсчет ссылок
- •Сборка мусора
- •Выводы
- •Параллелизм и конкурентность
- •Модели параллелизма и конкурентности
- •Структура процесса
- •Многопроцессорный параллелизм
- •Многопоточность
- •Асинхронное программирование
- •Генераторы
- •Сопрограммы
- •Асинхронные генераторы
- •Субинтерпретаторы
- •Выводы
- •Объекты и типы
- •Примеры этой главы
- •Встроенные типы
- •Типы объектов
- •Тип type
- •Типы bool и long
- •Тип строки Юникода
- •Словари
- •Выводы
- •Стандартная библиотека
- •Модули Python
- •Модули Python и C
- •Набор тестов
- •Запуск набора тестов в Windows
- •Запуск набора тестов в Linux или macOS
- •Флаги тестирования
- •Запуск конкретных тестов
- •Модули тестирования
- •Вспомогательные средства тестирования
- •Выводы
- •Отладка
- •Обработчик сбоев
- •Компиляция поддержки отладки
- •LLDB для macOS
- •Отладчик Visual Studio
- •Отладчик CLion
- •Выводы
- •Бенчмаркинг, профилирование и трассировка
- •Использование timeit для микробенчмарка
- •Использование набора тестов производительности Python
- •Профилирование кода Python с использованием cProfile
- •Выводы
- •Что дальше?
- •Создание расширений C для CPython
- •Улучшение приложений Python
- •Участие в проекте CPython
- •Дальнейшее обучение
- •Препроцессор C
- •Базовый синтаксис C
- •Выводы
- •Благодарности
Набор тестов
CPython содержит надежный набор тестов для базового интерпретатора, инструментов, стандартной библиотеки и дистрибутивов для Windows, Linux и macOS. Они находятся в каталоге Lib test и написаны большей частью на Python.
Полный набор тестов находится в пакете Python, и его можно запустить с помощью только что скомпилированного интерпретатора Python.
ЗАПУСК НАБОРА ТЕСТОВ В WINDOWS
ВWindows для запуска тестов используется скрипт rt.bat из папки PCBuild.
Вследующем примере тесты запускаются в быстром режиме для отладочной конфигурации на архитектуре x64:
>cd PCbuild
>rt.bat -q -d -x64
==CPython 3.9
==Windows-10-10.0.17134-SP0 little-endian
==cwd: C:\repos\cpython\build\test_python_2784
==CPU count: 2
==encodings: locale=cp1252, FS=utf-8
Run tests sequentially 0:00:00 [ 1/420] test_grammar 0:00:00 [ 2/420] test_opcodes 0:00:00 [ 3/420] test_dict 0:00:00 [ 4/420] test_builtin
...
Чтобы выполнить набор регрессионных тестов для рабочей конфигурации, удалите флаг -d из командной строки.
Книги для программистов: https://t.me/booksforits
294 Набор тестов
ЗАПУСК НАБОРА ТЕСТОВ В LINUX ИЛИ MACOS
В Linux и macOS выполните команду make test, чтобы скомпилировать и запустить тесты:
$ make test
==CPython 3.9
==macOS-10.14.3-x86_64-i386-64bit little-endian
==cwd: /Users/anthonyshaw/cpython/build/test_python_23399
==CPU count: 4
==encodings: locale=UTF-8, FS=utf-8
0:00:00 load avg: 2.14 [ 1/420] test_opcodes passed 0:00:00 load avg: 2.14 [ 2/420] test_grammar passed
...
Также можно использовать путь к скомпилированному двоичному файлу python или python.exe с пакетом test:
$ ./python -m test
==CPython 3.9
==macOS-10.14.3-x86_64-i386-64bit little-endian
==cwd: /Users/anthonyshaw/cpython/build/test_python_23399
==CPU count: 4
==encodings: locale=UTF-8, FS=utf-8
0:00:00 load avg: 2.14 [ 1/420] test_opcodes passed 0:00:00 load avg: 2.14 [ 2/420] test_grammar passed
...
Дополнительные make-цели для тестирования:
ЦЕЛЬ |
НАЗНАЧЕНИЕ |
test |
Выполнение основного набора регрессионных тестов |
testall |
Двукратное выполнение полного набора тестов: один раз без |
|
файлов .pyc и один — с ними |
quicktest |
Выполнение набора более быстрых регрессионных тестов с ис- |
|
ключением тестов, занимающих много времени |
testuniversal |
Выполнение набора тестов для обеих архитектур в универсаль- |
|
ной сборке для OSX |
coverage |
Компиляция и запуск тестов с gcov |
coverage-lcov |
Создание HTML-отчетов о покрытии |
Книги для программистов: https://t.me/booksforits
Запуск конкретных тестов 295
ФЛАГИ ТЕСТИРОВАНИЯ
Для некоторых тестов нужно установить специальные флаги, иначе тесты пропускаются. Например, многим тестам IDLE требуется графический интерфейс (GUI).
Чтобы увидеть список наборов тестов в конфигурации, передайте флаг
--list-tests:
$ ./python -m test --list-tests
test_grammar test_opcodes test_dict test_builtin test_exceptions
...
ЗАПУСК КОНКРЕТНЫХ ТЕСТОВ
Чтобы запустить конкретные тесты, укажите набор тестов в первом аргументе.
Пример для Linux или macOS:
$ ./python -m test test_webbrowser
Run tests sequentially
0:00:00 load avg: 2.74 [1/1] test_webbrowser
== Tests result: SUCCESS ==
1 test OK.
Total duration: 117 ms
Tests result: SUCCESS
Пример для Windows:
> rt.bat -q -d -x64 test_webbrowser
Также вместе с результатом можно получить подробный список выполненных тестов. Для этого используется аргумент -v:
$ ./python -m test test_webbrowser -v
==CPython 3.9
==macOS-10.14.3-x86_64-i386-64bit little-endian
==cwd: /Users/anthonyshaw/cpython/build/test_python_24562
Книги для программистов: https://t.me/booksforits
296 Набор тестов
==CPU count: 4
==encodings: locale=UTF-8, FS=utf-8 Run tests sequentially
0:00:00 load avg: 2.36 [1/1] test_webbrowser
test_open (test.test_webbrowser.BackgroundBrowserCommandTest) ...ok test_register (test.test_webbrowser.BrowserRegistrationTest) ...ok test_register_default (test.test_webbrowser.BrowserRegistrationTest) ...ok test_register_preferred (test.test_webbrowser.BrowserRegistrationTest) ...ok test_open (test.test_webbrowser.ChromeCommandTest) ...ok
test_open_new (test.test_webbrowser.ChromeCommandTest) ...ok
...
test_open_with_autoraise_false (test.test_webbrowser.OperaCommandTest) ...ok
----------------------------------------------------------------------
Ran 34 tests in 0.056s
OK (skipped=2)
== Tests result: SUCCESS ==
1 test OK.
Total duration: 134 ms
Tests result: SUCCESS
Если вы захотите внести изменения в CPython, очень важно понимать, как использовать наборы тестов и проверять состояние скомпилированной версии. Прежде чем вносить изменения, запустите все тесты и убедитесь в том, что они проходят.
МОДУЛИ ТЕСТИРОВАНИЯ
Расширения C и модули Python можно импортировать и протестировать при помощи модуля unittest. Тесты группируются по модулям или пакетам.
Например, тесты для типа строки Юникода в Python находятся в файле
Lib test test_unicode.py, а для пакета asyncio — в Lib test test_asyncio.
СМ. ТАКЖЕ
Если увас еще нет опыта работы сunittest или тестированием вPython,об ратитеськстатье«GettingStartedWithTestinginPython»1 насайтеRealPython.
1 https://realpython.com/python-testing/.
Книги для программистов: https://t.me/booksforits