Установка и запуск¶
Pythons: Python 3.5, 3.6, 3.7, PyPy3
Платформы: Linux и Windows
Имя пакета PyPI: pytest
Документация в PDF: download latest
pytest
- это фреймворк, который позволяет легко создавать как простые, так и расширяемые
тесты. Тесты выразительны и легко читаются — не нужно никаких шаблонов.
Начните работу в считанные минуты с небольшого модульного или сложного функционального
теста для вашего приложения или библиотеки.
Установка pytest
¶
Выполните в командной строке:
pip install -U pytest
Убедитесь, что установили нужную версию:
$ pytest --version
This is pytest version 5.x.y, imported from $PYTHON_PREFIX/lib/python3.6/site-packages/pytest/__init__.py
Создание первого теста¶
Создайте простой тест всего лишь из четырех строк кода:
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
Готово. Теперь можно запустить тест:
$ 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
, тест вернул отчет о падении.
Примечание
Для проверки ожидаемого результата можно использовать простой оператор assert
.
Встроенный в pytest
подробный анализ assert
распишет вам промежуточные значения выражений assert
, так что вам не нужно
использовать множество имен унаследованных от JUnit методов.
Запуск множества тестов¶
Команда pytest
запускает все файлы с именами в формате test_*.py
или \*_test.py
в текущей папке и ее подпапках. В целом, тесты ищутся по стандартным правилам поиска тестов.
Проверка брошенного исключения¶
Используйте проверку ожидаемых исключений, чтобы убедиться, что код бросает ожидаемое искючение:
# content of test_sysexit.py
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
Запустите этот тест с опцией “quiet” (-q
- указывает, что нужно опустить имя файла в отчете):
$ pytest -q test_sysexit.py
. [100%]
1 passed in 0.12s
Группировка тестовых функций в класс¶
Если тестов много, вы можете захотеть создать тестовый класс. pytest
облегчает
создание классов с множеством тестов:
# 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
ищет тесты для запуска по правилам Python по поиску тестов,
так что найдет обе функции с префиксом test_
. Никаких подклассов создавать не нужно,
просто убедитесь, что имя вашего класса начинается с Test
, иначе класс будет пропущен.
Мы можем запустить именно этот модуль, просто указав его имя:
$ pytest -q test_class.py
.F [100%]
================================= FAILURES =================================
____________________________ TestClass.test_two ____________________________
self = <test_class.TestClass object at 0xdeadbeef>
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
представляет встроенные фикстуры
для запроса произвольных ресурсов, например, для создания уникального каталога
временных файлов:
# content of test_tmpdir.py
def test_needsfiles(tmpdir):
print(tmpdir)
assert 0
Укажите tmpdir
в описании тестовой функции, и pytest
найдет и запустит
соответствующую фикстуру для создания нужного ресурса до вызова самой функции.
В данном случае перед запуском теста 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
см.: Временные каталоги и файлы.
Получить список встроенных в pytest
фикстур можно, выполнив команду:
pytest --fixtures # выводит список встроенных и пользовательских фикстур
Обратите внимание, что если не добавить опцию -v
, фикстуры с префиксом _
не попадут в список.
Читайте дальше¶
Посмотрите дополнительные ресурсы по pytest
, которые помогут вам
настроить тесты для вашего уникального рабочего процесса:
«Вызов pytest с помощью python -m pytest» - примеры вызова из командной строки
«Использование pytest с существующими наборами тестов» - работа с уже существующими тестами
«Маркировка тестов» - маркировка тестов (
pytest.mark
)«Фикстуры pytest: явные, модальные, расширяемые» - обеспечение функциональной основы тестов
«Написание плагинов» - написание плагинов и управление ими
«Рекомендации по интеграции» - виртуальное окружение и оформление тестов