Тестирование ============ В этом разделе описаны практики тестирования приложений на основе ``Argenta``. Примеры основаны на фактическом публичном API. Модульное тестирование обработчиков ------------------------------------ Обработчики в ``Argenta`` — обычные функции. Их удобно тестировать как чистые функции, не поднимая весь цикл приложения. Рекомендуются ``unittest`` или ``pytest``. **Пример использования:** .. 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``. Это тяжелее и обычно не требуется. Если всё же необходимо — пример ниже. .. danger:: **Важно:** Обязательно передавайте строковый триггер команды выхода последним элементом в списке ``side_effects`` при патче ``input``. Иначе тестируемое приложение будет ожидать ввода следующей команды и не сможет корректно завершиться. **Пример использования:** .. literalinclude:: ../code_snippets/testing/app_e2e_test.py :language: python :linenos: ----- Советы по тестированию ---------------------- 1. **Изолируйте тесты**: Каждый тест должен быть независимым от других. 2. **Моки для внешних интеграций**: БД, HTTP-клиенты и т.п. подменяйте заглушками и провайдерами ``dishka``. 3. **Покрывайте ошибочные сценарии**: Некорректные флаги, неизвестные команды, пустой ввод. 4. **Минимизируйте зависимость от форматирования**: Сравнивайте ключевые фрагменты вывода, а не весь блок целиком. 5. **Измеряйте покрытие**: Используйте ``pytest-cov``.