From b37096d790e5d0d8ac3e910ed53531ad07d8f230 Mon Sep 17 00:00:00 2001 From: kolo Date: Mon, 3 Nov 2025 14:23:24 +0300 Subject: [PATCH] add testing doc --- docs/root/testing.rst | 116 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 docs/root/testing.rst diff --git a/docs/root/testing.rst b/docs/root/testing.rst new file mode 100644 index 0000000..2be52c9 --- /dev/null +++ b/docs/root/testing.rst @@ -0,0 +1,116 @@ +Тестирование +============ + +В этом разделе описаны рекомендации и лучшие практики по тестированию приложений, построенных с использованием Argenta. + +Модульное тестирование +---------------------- + +Для модульного тестирования команд рекомендуется использовать стандартный модуль ``unittest`` или любой другой предпочитаемый фреймворк (например, ``pytest``). + +Пример теста для простой команды: + +.. code-block:: python + + import unittest + from unittest.mock import MagicMock + from your_app import app, your_command_handler + + class TestYourCommand(unittest.TestCase): + def test_your_command_handler(self): + # Подготовка тестовых данных + mock_scope = MagicMock() + test_args = {"arg1": "test_value"} + + # Вызов обработчика + result = your_command_handler(scope=mock_scope, **test_args) + + # Проверка результата + self.assertEqual(result, "expected_result") + mock_scope.some_dependency.assert_called_once_with("test_value") + + +Тестирование с зависимостями +---------------------------- + +При использовании внедрения зависимостей через Dishka, вы можете использовать моки для тестирования: + +.. code-block:: python + + from dishka import make_async_container + from dishka.integrations.base import wrap_injection + from unittest.mock import AsyncMock + + class TestWithDependencies(unittest.IsolatedAsyncioTestCase): + async def test_handler_with_dependencies(self): + # Создаем мок-контейнер + mock_dependency = AsyncMock() + mock_dependency.some_method.return_value = "mocked_result" + + # Настраиваем контейнер + container = MagicMock() + container.get.return_value = mock_dependency + + # Оборачиваем обработчик для тестирования + handler = wrap_injection( + your_handler, + container=container, + ) + + # Вызываем обработчик + result = await handler(arg1="test") + + # Проверяем результаты + self.assertEqual(result, "expected_result") + mock_dependency.some_method.assert_called_once() + + +Интеграционное тестирование +--------------------------- + +Для тестирования всего приложения целиком можно использовать клиент тестирования: + +.. code-block:: python + + from argenta import Application + from io import StringIO + import unittest + + class TestAppIntegration(unittest.TestCase): + def setUp(self): + self.app = Application() + self.app.setup() # Инициализация приложения + self.output = StringIO() + self.app.stdout = self.output + + def test_help_command(self): + self.app.process_input("help") + output = self.output.getvalue() + self.assertIn("Доступные команды:", output) + + +Советы по тестированию +---------------------- + +1. **Изолируйте тесты**: Каждый тест должен быть независимым от других. +2. **Используйте моки**: Заменяйте внешние зависимости моками для изоляции тестируемого кода. +3. **Проверяйте граничные случаи**: Уделяйте внимание краевым случаям и ошибочным сценариям. +4. **Тестируйте обработку ошибок**: Убедитесь, что ваше приложение корректно обрабатывает ошибки. +5. **Измеряйте покрытие**: Используйте инструменты вроде ``coverage.py`` для анализа покрытия кода тестами. + +Пример настройки ``pytest`` с покрытием кода: + +.. code-block:: ini + + # setup.cfg + [tool:pytest] + testpaths = tests + python_files = test_*.py + addopts = -v --cov=your_package --cov-report=term-missing + +Для запуска тестов с покрытием: + +.. code-block:: bash + + pip install pytest-cov + pytest