Установка и запуск =========================== **Pythons**: Python 3.5, 3.6, 3.7, PyPy3 **Платформы**: Linux и Windows **Имя пакета PyPI**: `pytest `_ **Документация в PDF**: `download latest `_ ``pytest`` - это фреймворк, который позволяет легко создавать как простые, так и расширяемые тесты. Тесты выразительны и легко читаются — не нужно никаких шаблонов. Начните работу в считанные минуты с небольшого модульного или сложного функционального теста для вашего приложения или библиотеки. .. _`getstarted`: .. _`installation`: Установка ``pytest`` ---------------------------------------- 1. Выполните в командной строке: .. code-block:: bash pip install -U pytest 2. Убедитесь, что установили нужную версию: .. code-block:: bash $ pytest --version This is pytest version 5.x.y, imported from $PYTHON_PREFIX/lib/python3.6/site-packages/pytest/__init__.py .. _`simpletest`: Создание первого теста -------------------------- Создайте простой тест всего лишь из четырех строк кода: .. code-block:: python # content of test_sample.py def func(x): return x + 1 def test_answer(): assert func(3) == 5 Готово. Теперь можно запустить тест: .. code-block:: pytest $ pytest =========================== test session starts ============================ platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y cachedir: $PYTHON_PREFIX/.pytest_cache rootdir: $REGENDOC_TMPDIR collected 1 item test_sample.py F [100%] ================================= FAILURES ================================= _______________________________ test_answer ________________________________ def test_answer(): > assert func(3) == 5 E assert 4 == 5 E + where 4 = func(3) test_sample.py:6: AssertionError ============================ 1 failed in 0.12s ============================= Поскольку ``func(3)`` возвращает вовсе не ``5``, тест вернул отчет о падении. .. note:: Для проверки ожидаемого результата можно использовать простой оператор ``assert``. Встроенный в ``pytest`` `подробный анализ assert `_ распишет вам промежуточные значения выражений ``assert``, так что вам не нужно использовать множество имен `унаследованных от JUnit методов `_. Запуск множества тестов --------------------------- Команда ``pytest`` запускает все файлы с именами в формате ``test_*.py`` или ``\*_test.py`` в текущей папке и ее подпапках. В целом, тесты ищутся по :ref:`стандартным правилам поиска тестов `. Проверка брошенного исключения -------------------------------------------------------------- Используйте :ref:`проверку ожидаемых исключений `, чтобы убедиться, что код бросает ожидаемое искючение: .. code-block:: python # content of test_sysexit.py import pytest def f(): raise SystemExit(1) def test_mytest(): with pytest.raises(SystemExit): f() Запустите этот тест с опцией “quiet” (``-q`` - указывает, что нужно опустить имя файла в отчете): .. code-block:: pytest $ pytest -q test_sysexit.py . [100%] 1 passed in 0.12s Группировка тестовых функций в класс ------------------------------------------ Если тестов много, вы можете захотеть создать тестовый класс. ``pytest`` облегчает создание классов с множеством тестов: .. code-block:: python # content of test_class.py class TestClass: def test_one(self): x = "this" assert "h" in x def test_two(self): x = "hello" assert hasattr(x, "check") ``pytest`` ищет тесты для запуска по :ref:`правилам Python по поиску тестов `, так что найдет обе функции с префиксом ``test_``. Никаких подклассов создавать не нужно, просто убедитесь, что имя вашего класса начинается с ``Test``, иначе класс будет пропущен. Мы можем запустить именно этот модуль, просто указав его имя: .. code-block:: pytest $ pytest -q test_class.py .F [100%] ================================= FAILURES ================================= ____________________________ TestClass.test_two ____________________________ self = def test_two(self): x = "hello" > assert hasattr(x, "check") E AssertionError: assert False E + where False = hasattr('hello', 'check') test_class.py:8: AssertionError 1 failed, 1 passed in 0.12s Первый тест пройдет (``pass``), а второй упадет (``fail``). Поскольку ``pytest`` выводит промежуточные значения ``assert``, вам будет проще понять причину сбоя. Запрос временного каталога для функциональных тестов -------------------------------------------------------------- ``pytest`` представляет :ref:`встроенные фикстуры ` для запроса произвольных ресурсов, например, для создания уникального каталога временных файлов: .. code-block:: python # content of test_tmpdir.py def test_needsfiles(tmpdir): print(tmpdir) assert 0 Укажите ``tmpdir`` в описании тестовой функции, и ``pytest`` найдет и запустит соответствующую фикстуру для создания нужного ресурса до вызова самой функции. В данном случае перед запуском теста ``pytest`` создаст уникальный (для каждого вызова тестовой фунции) каталог временных файлов: .. code-block:: pytest $ pytest -q test_tmpdir.py F [100%] ================================= FAILURES ================================= _____________________________ test_needsfiles ______________________________ tmpdir = local('PYTEST_TMPDIR/test_needsfiles0') def test_needsfiles(tmpdir): print(tmpdir) > assert 0 E assert 0 test_tmpdir.py:3: AssertionError --------------------------- Captured stdout call --------------------------- PYTEST_TMPDIR/test_needsfiles0 1 failed in 0.12s Подробнее об обработке параметра ``tmpdir`` см.: :ref:`Временные каталоги и файлы `. Получить список встроенных в ``pytest`` :ref:`фикстур ` можно, выполнив команду: .. code-block:: bash pytest --fixtures # выводит список встроенных и пользовательских фикстур Обратите внимание, что если не добавить опцию ``-v`` , фикстуры с префиксом ``_`` не попадут в список. Читайте дальше ------------------------------------- Посмотрите дополнительные ресурсы по ``pytest``, которые помогут вам настроить тесты для вашего уникального рабочего процесса: * ":ref:`cmdline`" - примеры вызова из командной строки * ":ref:`existingtestsuite`" - работа с уже существующими тестами * ":ref:`mark`" - маркировка тестов (``pytest.mark``) * ":ref:`fixtures`" - обеспечение функциональной основы тестов * ":ref:`plugins`" - написание плагинов и управление ими * ":ref:`goodpractices`" - виртуальное окружение и оформление тестов .. include:: links.inc