Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Базовая структура: где хранить тесты
project_structure_basics

Базовая структура: где хранить тесты

tests/ директория, именование test_*.py, импорты из src/, pytest discovery

В первом уроке вы запустили тест прямо в корне проекта. Но в реальных проектах тесты хранятся отдельно от кода.

Цель: научиться правильно организовывать тесты, чтобы проект был понятен вам и вашей команде.

Проблема: тесты в корне проекта

Плохая структура:

my-project/
├── test_user.py
├── test_auth.py
├── test_api.py
├── user.py
├── auth.py
└── api.py

Проблемы:

  • ❌ Тесты смешаны с кодом
  • ❌ Сложно найти нужный тест
  • ❌ При деплое тесты попадут в production

Правильная структура: tests/ директория

Создайте структуру

cd pytest-tutorial mkdir src mkdir tests # pytest-tutorial/ # ├── src/ # Код приложения # ├── tests/ # Тесты # └── .venv/ # Виртуальное окружение

Создайте код приложения

# src/calculator.py def add(a, b): """Складывает два числа""" return a + b def subtract(a, b): """Вычитает второе число из первого""" return a - b def multiply(a, b): """Умножает два числа""" return a * b

Создайте тест

# tests/test_calculator.py from src.calculator import add, subtract, multiply def test_add(): """Тест сложения""" assert add(2, 3) == 5 assert add(-1, 1) == 0 def test_subtract(): """Тест вычитания""" assert subtract(5, 3) == 2 assert subtract(0, 5) == -5 def test_multiply(): """Тест умножения""" assert multiply(3, 4) == 12 assert multiply(-2, 3) == -6

Запуск тестов

Из корня проекта

pytest tests/ -v

Ожидаемый результат:

============================ test session starts ============================
collected 3 items

tests/test_calculator.py::test_add PASSED                            [ 33%]
tests/test_calculator.py::test_subtract PASSED                       [ 66%]
tests/test_calculator.py::test_multiply PASSED                       [100%]

============================= 3 passed in 0.02s =============================

✅ Pytest автоматически нашёл все тесты в tests/ директории!

Запуск одного файла

pytest tests/test_calculator.py -v

Запуск одного теста

pytest tests/test_calculator.py::test_add -v

Правила именования pytest

Pytest автоматически находит тесты по правилам именования:

Правило #1: файлы

# ✅ ХОРОШО — pytest найдёт test_*.py # test_calculator.py, test_user.py *_test.py # calculator_test.py, user_test.py # ❌ ПЛОХО — pytest НЕ найдёт calculator.py # Нет префикса test_ my_tests.py # Нет префикса test_

Рекомендация: используйте test_*.py (стандарт в Python-сообществе).

Правило #2: функции

# ✅ ХОРОШО — pytest найдёт def test_addition(): pass def test_user_creation(): pass # ❌ ПЛОХО — pytest НЕ найдёт def addition_test(): # Нет префикса test_ pass

Правило #3: классы (опционально)

# ✅ ХОРОШО — pytest найдёт class TestCalculator: def test_add(self): pass # ❌ ПЛОХО — pytest НЕ найдёт class Calculator: # Нет префикса Test def test_add(self): pass

Pytest Discovery: как pytest находит тесты

Когда вы запускаете pytest, он:

  1. Ищет директории — заходит в tests/, игнорирует src/ и .venv/
  2. Ищет файлы — находит test_calculator.py, игнорирует helpers.py
  3. Ищет функции — находит def test_add(), игнорирует def helper_function()

Проверка: что pytest нашёл

# Покажет список всех найденных тестов БЕЗ запуска pytest --collect-only

Результат:

<Module tests/test_calculator.py>
  <Function test_add>
  <Function test_subtract>
  <Function test_multiply>

Организация больших проектов (бонус)

Для сложных проектов используется зеркальная структура: tests/ повторяет структуру src/ для удобства навигации.

pytest-tutorial/
├── src/
│   ├── user/
│   │   ├── models.py
│   │   └── services.py
│   └── auth/
│       └── handlers.py
├── tests/
│   ├── user/
│   │   ├── test_models.py
│   │   └── test_services.py
│   └── auth/
│       └── test_handlers.py
└── pytest.ini

Типичные ошибки

Ошибка #1: ModuleNotFoundError

# tests/test_calculator.py from calculator import add # ❌ ПЛОХО
ModuleNotFoundError: No module named 'calculator'

Исправление:

from src.calculator import add # ✅ ХОРОШО

Ошибка #2: тесты не в tests/

my-project/
├── src/
└── my_tests/      ← ❌ pytest не найдёт (неправильное имя)
    └── test_user.py

Исправление: переименуйте my_tests/ в tests/.

Ошибка #3: забыли __init__.py (Python < 3.3)

Для старых проектов может потребоваться touch src/__init__.py и touch tests/__init__.py. Но для современных проектов (Python 3.3+) это не обязательно!

Что вы изучили

  • Создали tests/ директорию для организации файлов
  • Импортировали код из src/ в тесты
  • Поняли правила именования test_*.py и def test_*()
  • Узнали про pytest discovery — автоматический поиск тестов
  • Запускали тесты разными способами (все, один файл, один тест)

Устранение неисправностей

Проверьте свои знания

Вопросы ещё не добавлены

Вопросы для этой подтемы ещё не добавлены.

Далее: Тестируем классы и ошибки