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