/
elrdn
/
python_syntax_practice
Обзор
Документация
Войти
/
elrdn
/
python_syntax_practice
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
19_pytest_testing/tasks.py
278 строк
12 KB
Elraden
Add pytest testing section
15 июн 2026, 09:01
15 июн 2026, 09:01
e265308
Код
Авторство
О чём код?
""" Раздел 19. Тестирование проекта магазина одежды на pytest Цель: покрыть автоматическими тестами проект из раздела 17: доменные модели, репозитории, сервисы, корзину, заказы, скидки и ключевые пользовательские сценарии. Тесты не нужно писать в этом файле. Создайте отдельную папку tests/ в корне проекта и размещайте тесты там. """ # Задание 1 # Подготовьте pytest. # Установите pytest, создайте папку tests/ и проверьте, что команда # python -m pytest запускается из корня проекта. # # Рекомендуемая структура: # # tests/ # test_domain_models.py # test_catalog_service.py # test_cart.py # test_discounts.py # test_repositories.py # test_orders.py # test_full_scenario.py # TODO: подготовить структуру тестов # Задание 2 # Напишите unit-тесты для доменных моделей из 17_clothing_store_project/01_domain_models. # Проверьте happy path: # - категория создается с корректными данными; # - товар создается с корректными данными; # - остаток товара по размеру создается с корректными данными; # - покупатель создается с корректными данными; # - цена товара меняется; # - товар активируется и деактивируется; # - остаток товара уменьшается и увеличивается. # # Проверьте negative path: # - отрицательный идентификатор; # - пустое название; # - отрицательная цена; # - неизвестный размер; # - отрицательное количество; # - попытка списать больше товара, чем есть на складе. # TODO: добавить tests/test_domain_models.py # Задание 3 # Добавьте параметризованные тесты. # Используйте @pytest.mark.parametrize для похожих проверок: # - пустые строковые поля товара; # - недопустимые размеры одежды; # - некорректные количества; # - некорректные email покупателя, если такая проверка есть в вашей модели. # TODO: добавить параметризацию в тесты моделей # Задание 4 # Напишите unit-тесты для сервиса каталога. # Если сервис зависит от репозиториев, используйте fake-репозитории на списках. # # Проверьте: # - выдаются только активные товары; # - поиск по названию не зависит от регистра; # - фильтрация по категории; # - фильтрация по цвету; # - фильтрация по размеру учитывает наличие остатка; # - фильтрация по диапазону цены; # - сортировка по цене; # - сортировка по названию; # - пустой результат возвращается как пустой список. # TODO: добавить tests/test_catalog_service.py # Задание 5 # Напишите unit-тесты для корзины. # # Проверьте happy path: # - добавление товара в корзину; # - повторное добавление того же товара и размера увеличивает количество; # - разные размеры одного товара хранятся как разные позиции; # - изменение количества; # - удаление позиции; # - расчет итоговой суммы; # - очистка корзины. # # Проверьте negative path: # - нельзя добавить нулевое количество; # - нельзя добавить отрицательное количество; # - нельзя добавить больше, чем есть на складе; # - нельзя изменить количество на недопустимое значение; # - удаление несуществующей позиции обрабатывается предсказуемо. # TODO: добавить tests/test_cart.py # Задание 6 # Напишите unit-тесты для пользователей, адресов и скидок. # # Проверьте: # - адрес создается с корректными данными; # - промокод применяется, если он активен и сумма достаточная; # - неактивный промокод не применяется; # - неизвестный промокод не применяется; # - промокод не применяется, если сумма меньше минимальной; # - итоговая сумма после скидки считается правильно; # - итоговая сумма не становится отрицательной. # TODO: добавить tests/test_discounts.py # Задание 7 # Подготовьте тестовую PostgreSQL-базу для интеграционных тестов репозиториев. # Не используйте рабочую базу проекта. # # Рекомендуется: # - создать отдельную базу clothing_store_test; # - хранить строку подключения в переменной окружения TEST_DATABASE_URL; # - перед тестами очищать таблицы или пересоздавать схему; # - не зависеть от данных, созданных вручную. # TODO: подготовить тестовую базу и фикстуры подключения # Задание 8 # Напишите интеграционные тесты репозиториев. # # Покройте репозитории: # - категорий; # - товаров; # - остатков по размерам; # - покупателей; # - адресов, если они есть; # - промокодов, если они есть; # - заказов. # # Для каждого основного репозитория проверьте: # - add; # - get_by_id; # - get_all или аналогичный метод списка; # - update, если метод есть; # - delete, если метод есть; # - поведение при несуществующем идентификаторе. # TODO: добавить tests/test_repositories.py # Задание 9 # Напишите тесты для сервиса заказов. # # Проверьте happy path: # - заказ создается из непустой корзины; # - позиции заказа содержат товар, размер, цену и количество; # - итоговая сумма считается правильно; # - остатки уменьшаются именно по выбранным размерам; # - заказ сохраняется в репозитории; # - после успешного заказа корзина очищается, если это предусмотрено вашей логикой. # # Проверьте negative path: # - пустая корзина; # - неизвестный покупатель; # - неизвестный товар; # - нехватка товара на складе; # - ошибка сохранения заказа; # - ошибка списания остатка. # TODO: добавить tests/test_orders.py # Задание 10 # Проверьте транзакционность оформления заказа. # # Смоделируйте ситуацию, где оформление заказа начинается успешно, # но затем происходит ошибка: # - не хватает второго товара; # - репозиторий заказа падает с исключением; # - списание остатка падает с исключением. # # После ошибки проверьте: # - заказ не сохранен частично; # - позиции заказа не сохранены частично; # - остатки товаров не уменьшились частично; # - корзина не очищена, если заказ не был оформлен. # TODO: добавить тесты отката транзакции # Задание 11 # Напишите тест полного пользовательского сценария. # # Сценарий: # 1. Создать тестовые категории, товары, остатки и покупателя. # 2. Получить активные товары каталога. # 3. Найти товар по названию. # 4. Добавить товар нужного размера в корзину. # 5. Изменить количество. # 6. Применить промокод, если скидки реализованы. # 7. Оформить заказ. # 8. Проверить сохраненный заказ. # 9. Проверить уменьшение остатков. # # Это может быть интеграционный тест. Он не должен использовать рабочую базу. # TODO: добавить tests/test_full_scenario.py # Задание 12 # Добавьте проверки консольного слоя, если финальное приложение хорошо разделено. # # Можно использовать: # - monkeypatch для подмены input(); # - capsys для проверки print(); # - fake-сервисы, чтобы не ходить в реальную базу. # # Не пытайтесь тестировать всю программу только через текст меню. # Главная бизнес-логика должна быть покрыта тестами сервисов. # TODO: добавить тесты консольного интерфейса при необходимости # Задание 13 # Проверьте качество набора тестов. # # Убедитесь, что: # - каждый тест имеет assert или проверяет исключение через pytest.raises; # - тесты можно запускать в любом порядке; # - тесты не требуют ручного ввода; # - тесты не зависят от рабочей базы; # - названия тестов объясняют проверяемое поведение; # - есть happy path, negative path и edge cases; # - есть хотя бы один regression test на ошибку, которую вы нашли в своем коде. # TODO: провести ревизию тестов # Задание 14 # Запустите весь набор тестов. # # Команды: # # python -m pytest # python -m pytest -q # python -m pytest -k order # # При желании установите pytest-cov и посмотрите покрытие: # # python -m pip install pytest-cov # python -m pytest --cov=17_clothing_store_project # # В комментариях ниже запишите: # - сколько тестов написано; # - какие слои покрыты; # - какие важные сценарии еще не покрыты; # - какие ошибки тесты помогли найти. # TODO: записать итоговую проверку тестов