(Сюда необходимо вставить реальный бейдж статуса сборки из вашего репозитория)
Добро пожаловать в проект интернет-магазина! Вам предоставлен готовый код бизнес-логики (backend) небольшой E-commerce системы. Код компилируется и работает, но в нём отсутствуют тесты. Ваша задача — спроектировать и написать набор Unit- и интеграционных тестов, настроить непрерывную интеграцию (CI) и оценить качество покрытия кода.
Стек технологий: Python 3.12, Pytest, unittest.mock, pytest-cov.
Исходный код приложения находится в директории src/shop/. Проект спроектирован по принципу разделения на логические модули. Это поможет вам понять, какие виды тестов применять к конкретным файлам:
- 📦
models.py— Сущности (пользователи, товары, статусы заказов). - 🔌
interfaces.py— Интерфейсы (Protocols) внешних систем: Склад (InventoryService) и Платежный шлюз (PaymentGateway). - 🧮
pricing.py— Ценообразование (Чистая логика). Здесь лежатDiscountCalculatorиDeliveryCalculator. Это идеальные кандидаты для классических Unit-тестов, параметризованных тестов и тестов с подменой времени. - ⚙️
order_processor.py— Оркестратор заказов. КлассOrderProcessorсвязывает калькуляторы, банк и склад. Здесь вам потребуются Интеграционные тесты с использованиемMagicMockдля создания заглушек (моков) внешних систем.
Ваши тесты должны располагаться в зеркальной директории tests/ (например, tests/test_pricing.py).
Вам необходимо покрыть предоставленный код автотестами с помощью фреймворка pytest.
⚠️ ВНИМАНИЕ: О предоставленном примере кода! В репозитории может находиться один демонстрационный тест. Это исключительно пример синтаксиса использования Pytest, фикстур и моков. Вы самостоятельно решаете:
- Какие классы эквивалентности и граничные значения проверять.
- Какие негативные сценарии обрабатывать (
pytest.raises).- Какие тестовые функции и фикстуры создавать.
Ваши тесты должны демонстрировать понимание следующих техник:
- Обычные модульные тесты (проверка логики).
- Параметризованные тесты с помощью декоратора
@pytest.mark.parametrize. - Управление временем в тестах (мокирование функции, возвращающей
date.today()). - Использование Фикстур (
@pytest.fixture) для внедрения зависимостей (Dependency Injection) и избежания дублирования кода. - Создание Stub-объектов (заглушек) через
MagicMock. Умение задавать им возвращаемые значения (mock.return_value = ...) или ошибки (mock.side_effect = Exception(...)). - Проверка взаимодействия (Verification) — проверка того, что методы мока вызывались (
assert_called_with) или не вызывались вообще (assert_not_called).
Количество тестов не регламентировано — главное продемонстировать соответствующие навыки.
Ваш код должен автоматически собираться и тестироваться при каждом коммите.
- Создайте в корне репозитория директорию
.github/workflows/. - Добавьте туда YAML-файл (например,
python-app.yml) с конфигурацией GitHub Actions. - Настройте шаги: установка зависимостей (
pip install -r requirements.txt) и запуск тестов командойpytest. - Получите markdown-ссылку на бейдж статуса сборки (Status Badge) и вставьте её в самое начало этого
README.md.
Подсказка: GitHub может сгенерировать базовый workflow для Python автоматически, если вы перейдете во вкладку "Actions" в вашем репозитории.
Написать тесты — половина дела. Нужно понять, какую часть кода они проверяют.
Вам необходимо собрать метрики покрытия. Для этого используется плагин pytest-cov (убедитесь, что он есть в вашем requirements.txt).
Как это сделать:
- Вариант А (IDE): Использовать встроенные инструменты вашей среды. В PyCharm Professional можно нажать правой кнопкой мыши на папку
testsи выбрать «Run with Coverage». Сделайте скриншот отчета. - Вариант Б (Консоль и HTML-отчет): Выполните в терминале команду:
Pytest прогонит тесты и сгенерирует красивый интерактивный HTML-отчет в папке
pytest --cov=src/shop --cov-report=html
htmlcov/. Откройте файлhtmlcov/index.htmlв браузере, сделайте скриншот и приложите к сдаче работы.
- Написать в ЛС, указать ФИО и ссылку на PR в ветку feedback
- Продемонстрировать полученные навыки на защите в формате объяснения принятых решений и ответов на вопросы
(Ниже представлены ссылки, которые помогут вам в выполнении лабораторной работы)
- Официальная документация Pytest
- Документация по unittest.mock (MagicMock)
- GitHub Actions: Building and testing Python
Не полагайтесь только на них, умение гуглить все непонятное — основа решения всех проблем.