mirror of
https://github.com/koloideal/Argenta.git
synced 2026-06-10 18:15:28 +03:00
add testing doc
This commit is contained in:
@@ -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
|
||||||
Reference in New Issue
Block a user