Тестирование Pytest

Соглашения именования
1) Тестовые файлы должны быть названы test_<name>.py или <name>_test.py.

2) Методы и функции тестирования должны быть названы test_<name>.

3) Тестовые классы должны быть названы Test<Name>.
Пример лога после запуска тестов

================================================== test session starts ==================================================
platform win32 -- Python 3.8.5, pytest-6.2.4, py-1.11.0, pluggy-0.13.1 -- c:\dev\practicum\api_yatube\venv\scripts\python.exe
django: settings: yatube_api.settings (from ini)
rootdir: C:\DEV\practicum\api_yatube\api_yatube, configfile: pytest.ini, testpaths: tests/
plugins: django-4.4.0, pythonpath-0.7.3
collected 26 items

tests/test_auth.py::TestAuthAPI::test_auth <- ..\..\..\api_yatube\api_yatube\tests\test_auth.py PASSED             [  3%]
tests/test_comment.py::TestPostAPI::test_comments_not_found <- ..\..\..\api_yatube\api_yatube\tests\test_comment.py PASSED [  7%]
tests/test_comment.py::TestPostAPI::test_comments_get_unauth <- ..\..\..\api_yatube\api_yatube\tests\test_comment.py PASSED [ 11%]
tests/test_comment.py::TestPostAPI::test_comments_get <- ..\..\..\api_yatube\api_yatube\tests\test_comment.py PASSED [ 15%]
tests/test_comment.py::TestPostAPI::test_comments_create <- ..\..\..\api_yatube\api_yatube\tests\test_comment.py PASSED [ 
19%]
результаты выполнения теста
PASSED (.) Тест выполнен успешно.

FAILED (F) Тест не выполнен успешно.

SKIPPED (s): Тест был пропущен. Вы можете заставить pytest пропустить тест, используя декораторы @pytest.mark.skip() или pytest.mark.skipif().

XFAIL(x): Тест не должен был пройти, был запущен и провалился. Вы можете принудительно указать pytest, что тест должен завершиться неудачей, используя декоратор @pytest.mark.xfail().

XPASS (X): Тест не должен был пройти, был запущен и прошел.

ERROR (E): Исключение произошло за пределами функции тестирования.
использование опций при запуске pytest
Ознакомиться с полным списком вы можете с помощью опции pytest --help

- v предоставляет более развернутую информацию по итогам
- q предоставляет сокращенную информацию по итогам
--collect-only - отображает перечень тестов на выполнение
-k "<name>" - позволяет запустить только указанные тесты
-m "<name>" - запуск тестов, у которых указан декоратор <name>

Пример теста

def test_on_range():
    assert get_stat(range(10), 3) ==  2

def test_on_shuffled():
    l=list(range(10))
    random.shuffle(l)
    assert get_stat(l,3) ==  2
принцип работы
pytest парсит исходный код тестов и подменяет вызов assert в тестах на функцию, которая добавляет возможность интроспекции (отслеживания).
Fixtures - функции предзапуска
Fixture - это функции, которые запускаются перед запуском тестов. Необходимо для создания необходимого окружения для тестирования кода. Создает объекты необходимые для тестирования функции или класса.
Оформляется в виде декоратора для функции.
Пример использования fixture

@pytest.fixture
def exp1():
    print('basic options')

def exp2(exp1):
    print('program code')

файл conftest.py
В библиотеке можно применять специальный файл, который будет подгружаться самостоятельно. В файле прописывают fixture. В данном случае можно импорты не указывать.
Данная технология использует неявное указания fixture, поэтому будьте внимательны и помните о файле conftest.py.
параметризация тестов
Используется декоратор @pytest.mark.parametrize(...). используется для написания одной функции с указанием нескольких параметров.
Пример параметризации

@pytest.mark.parametrize(
    ('value', 'state', expected), [
        ([1], 1, 1),
        ([1, 1, 1, 1], 4, 1),
        (range(100), 4 ,3), ])
def test_on_range(value, state, expected):
    assert func_state(value, state) == expected
файл параметров pytest.ini
Используйте конфигурационный файл для изменения поведения запуска тестов.
плагины pytest
Для написания тестов в различных фреймворках используются плагины. Например:

- flake8
- coverage
-django
-flask
- и т. д.