Files
Argenta/docs/root/testing.rst
T
2025-11-03 14:53:07 +03:00

48 lines
3.2 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Тестирование
============
В этом разделе описаны практики тестирования приложений на основе ``Argenta``. Примеры основаны на фактическом публичном API: ``App``, ``Router``, ``Command``, ``Orchestrator``, DI через ``dishka`` и интеграцию в ``argenta.di.integration``.
Модульное тестирование хендлеров
--------------------------------
Обработчики в Argenta — обычные функции. Их удобно тестировать как чистые функции, не поднимая весь цикл приложения. Рекомендуются ``unittest`` или ``pytest``.
Пример с ``unittest`` для простого хендлера без DI:
.. literalinclude:: ../code_snippets/testing/simple_handler_unittest.py
:language: python
:linenos:
Тестирование с внедрением зависимостей (DI)
-------------------------------------------
Если хендлеру нужны зависимости, используйте ``dishka`` и интеграцию Argenta:
.. literalinclude:: ../code_snippets/testing/di_handler_unittest.py
:language: python
:linenos:
Интеграционное тестирование приложения
--------------------------------------
Для более высокого уровня тестов собирайте ``App`` и ``Router`` и вызывайте хендлеры через парсинг команд, обходя бесконечный цикл ввода. Это даёт близкое к реальности поведение без необходимости симулировать ``stdin``.
.. literalinclude:: ../code_snippets/testing/app_integration_unittest.py
:language: python
:linenos:
E2E-тестирование цикла (опционально)
------------------------------------
Полный запуск цикла ``start_polling`` можно покрывать через подпроцесс с передачей строк во ``stdin``. Это тяжелее и обычно не требуется. Если всё же необходимо — вынесите конфигурацию в функцию ``main()`` и запускайте модуль в подпроцессе с подготовленным вводом/выводом.
Советы по тестированию
----------------------
1. **Изолируйте тесты**: Каждый тест должен быть независимым от других.
2. **Моки для внешних интеграций**: БД, HTTP-клиенты и т.п. подменяйте заглушками и провайдерами ``dishka``.
3. **Покрывайте ошибочные сценарии**: Некорректные флаги, неизвестные команды, пустой ввод.
4. **Минимизируйте зависимость от форматирования**: Сравнивайте ключевые фрагменты вывода, а не весь блок целиком.
5. **Измеряйте покрытие**: Используйте ``pytest-cov``.