mirror of
https://github.com/koloideal/Argenta.git
synced 2026-06-10 10:05:28 +03:00
48 lines
3.2 KiB
ReStructuredText
48 lines
3.2 KiB
ReStructuredText
Тестирование
|
||
============
|
||
|
||
В этом разделе описаны практики тестирования приложений на основе ``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``.
|