Skip to content

Latest commit

 

History

History
91 lines (60 loc) · 8.19 KB

File metadata and controls

91 lines (60 loc) · 8.19 KB

🛒 Лабораторная работа: Тестирование системы обработки заказов

Java CI with Gradle (Сюда необходимо вставить реальный бейдж статуса сборки из вашего репозитория)

Добро пожаловать в проект интернет-магазина! Вам предоставлен готовый код бизнес-логики (backend) небольшой E-commerce системы. Код компилируется и работает, но в нём отсутствуют тесты. Ваша задача — спроектировать и написать набор Unit- и интеграционных тестов, настроить непрерывную интеграцию (CI) и оценить качество покрытия кода.

Стек технологий: Python 3.12, Pytest, unittest.mock, pytest-cov.


⏱️ Мягкий дедлайн для защиты: 01.05.2026

🏗 Структура проекта (Домены)

Исходный код приложения находится в директории src/shop/. Проект спроектирован по принципу разделения на логические модули. Это поможет вам понять, какие виды тестов применять к конкретным файлам:

  • 📦 models.py — Сущности (пользователи, товары, статусы заказов).
  • 🔌 interfaces.py — Интерфейсы (Protocols) внешних систем: Склад (InventoryService) и Платежный шлюз (PaymentGateway).
  • 🧮 pricing.pyЦенообразование (Чистая логика). Здесь лежат DiscountCalculator и DeliveryCalculator. Это идеальные кандидаты для классических Unit-тестов, параметризованных тестов и тестов с подменой времени.
  • ⚙️ order_processor.pyОркестратор заказов. Класс OrderProcessor связывает калькуляторы, банк и склад. Здесь вам потребуются Интеграционные тесты с использованием MagicMock для создания заглушек (моков) внешних систем.

Ваши тесты должны располагаться в зеркальной директории tests/ (например, tests/test_pricing.py).


🎯 Ваше задание

1. Проектирование и написание автотестов

Вам необходимо покрыть предоставленный код автотестами с помощью фреймворка 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).

Количество тестов не регламентировано — главное продемонстировать соответствующие навыки.

2. Настройка GitHub CI

Ваш код должен автоматически собираться и тестироваться при каждом коммите.

  1. Создайте в корне репозитория директорию .github/workflows/.
  2. Добавьте туда YAML-файл (например, python-app.yml) с конфигурацией GitHub Actions.
  3. Настройте шаги: установка зависимостей (pip install -r requirements.txt) и запуск тестов командой pytest.
  4. Получите markdown-ссылку на бейдж статуса сборки (Status Badge) и вставьте её в самое начало этого README.md.

Подсказка: GitHub может сгенерировать базовый workflow для Python автоматически, если вы перейдете во вкладку "Actions" в вашем репозитории.

3. Advanced: Оценка покрытия кода (Code Coverage) (Опционально)

Написать тесты — половина дела. Нужно понять, какую часть кода они проверяют. Вам необходимо собрать метрики покрытия. Для этого используется плагин pytest-cov (убедитесь, что он есть в вашем requirements.txt).

Как это сделать:

  • Вариант А (IDE): Использовать встроенные инструменты вашей среды. В PyCharm Professional можно нажать правой кнопкой мыши на папку tests и выбрать «Run with Coverage». Сделайте скриншот отчета.
  • Вариант Б (Консоль и HTML-отчет): Выполните в терминале команду:
    pytest --cov=src/shop --cov-report=html
    Pytest прогонит тесты и сгенерирует красивый интерактивный HTML-отчет в папке htmlcov/. Откройте файл htmlcov/index.html в браузере, сделайте скриншот и приложите к сдаче работы.

❗Порядок сдачи

  • Написать в ЛС, указать ФИО и ссылку на PR в ветку feedback
  • Продемонстрировать полученные навыки на защите в формате объяснения принятых решений и ответов на вопросы

📚 Полезные ссылки и материалы

(Ниже представлены ссылки, которые помогут вам в выполнении лабораторной работы)

Не полагайтесь только на них, умение гуглить все непонятное — основа решения всех проблем.