Короткий ответ
Pytest автоматически находит файлы вида test_*.py или *_test.py и функции с префиксом test_, а проверки внутри теста делаются обычным оператором assert без дополнительных методов.
Как это работает подробнее
При запуске команды pytest рекурсивно обходит каталоги, собирает файлы и функции по соглашению об именовании (test_*.py, функции test_*, классы Test* без __init__), не требуя явной регистрации тестов где-либо ещё. Внутри теста используется встроенный assert — pytest переписывает его байткод (assertion rewriting), чтобы при падении показать подробную разницу значений (например, конкретные различающиеся элементы списков или словарей), а не просто AssertionError.
Пример кода
testing_example_292.py
# test_math_utils.py
def add(a, b):
return a + b
def test_add_returns_sum_of_two_numbers():
result = add(2, 3)
assert result == 5 # при падении pytest покажет: assert 4 == 5Что использовать на практике
- Практика. Для изменения правил поиска используют testpaths, python_files, python_functions в pytest.ini или pyproject.toml, например, если в проекте используются другие соглашения именования. Тесты обычно кладут в отдельную директорию tests/, зеркалирующую структуру пакета приложения, чтобы было понятно, какой тестовый файл относится к какому модулю исходного кода.
Подводные камни
- Риск. Забывать префикс test_ у функции — тогда pytest её просто не запустит и это не будет ошибкой; разработчик решит, что тест прошёл, хотя он вообще не выполнялся при прогоне. Также путают return значения в тесте с assert — return True ничего не проверяет, тест будет зелёным при любом поведении кода, что создаёт ложное чувство покрытости.