WIP: Temporary commit for branch move
This commit is contained in:
259
README_TESTING.md
Normal file
259
README_TESTING.md
Normal file
@@ -0,0 +1,259 @@
|
||||
# Тестирование Telegram Helper Bot
|
||||
|
||||
Этот документ описывает систему тестирования для Telegram Helper Bot.
|
||||
|
||||
## Структура тестов
|
||||
|
||||
Тесты организованы в следующие файлы:
|
||||
|
||||
- `tests/test_bot.py` - Основные тесты бота (запуск, хэндлеры, интеграция)
|
||||
- `tests/test_media_handlers.py` - Тесты обработки медиа-контента
|
||||
- `tests/test_error_handling.py` - Тесты обработки ошибок и граничных случаев
|
||||
- `tests/test_utils.py` - Тесты утилит и вспомогательных функций
|
||||
- `tests/test_keyboards_and_filters.py` - Тесты клавиатур и фильтров
|
||||
- `tests/test_db.py` - Тесты базы данных
|
||||
- `tests/conftest.py` - Общие фикстуры и конфигурация
|
||||
|
||||
## Установка зависимостей
|
||||
|
||||
```bash
|
||||
make install
|
||||
```
|
||||
|
||||
## Запуск тестов
|
||||
|
||||
### Все тесты
|
||||
```bash
|
||||
make test
|
||||
```
|
||||
|
||||
### Отдельные категории тестов
|
||||
```bash
|
||||
# Тесты базы данных
|
||||
make test-db
|
||||
|
||||
# Тесты бота (запуск и хэндлеры)
|
||||
make test-bot
|
||||
|
||||
# Тесты обработки медиа
|
||||
make test-media
|
||||
|
||||
# Тесты обработки ошибок
|
||||
make test-errors
|
||||
|
||||
# Тесты утилит
|
||||
make test-utils
|
||||
|
||||
# Тесты клавиатур и фильтров
|
||||
make test-keyboards
|
||||
```
|
||||
|
||||
### Тесты с покрытием
|
||||
```bash
|
||||
# Покрытие с выводом в терминал
|
||||
make test-coverage
|
||||
|
||||
# Покрытие с HTML отчетом
|
||||
make test-html
|
||||
```
|
||||
|
||||
### Фильтрация тестов
|
||||
```bash
|
||||
# Только unit тесты
|
||||
pytest -m unit
|
||||
|
||||
# Только интеграционные тесты
|
||||
pytest -m integration
|
||||
|
||||
# Только асинхронные тесты
|
||||
pytest -m asyncio
|
||||
|
||||
# Исключить медленные тесты
|
||||
pytest -m "not slow"
|
||||
|
||||
# Конкретный файл тестов
|
||||
pytest tests/test_bot.py
|
||||
|
||||
# Конкретный тест
|
||||
pytest tests/test_bot.py::TestBotStartup::test_bot_initialization
|
||||
```
|
||||
|
||||
## Типы тестов
|
||||
|
||||
### Unit тесты
|
||||
Тестируют отдельные функции и компоненты в изоляции:
|
||||
- Вспомогательные функции (`get_first_name`, `get_text_message`)
|
||||
- Утилиты (`BaseDependencyFactory`, `get_message`)
|
||||
- Фильтры (`ChatTypeFilter`)
|
||||
- Клавиатуры
|
||||
|
||||
### Интеграционные тесты
|
||||
Тестируют взаимодействие между компонентами:
|
||||
- Регистрация роутеров в диспетчере
|
||||
- Обработка сообщений через хэндлеры
|
||||
- Интеграция с базой данных
|
||||
|
||||
### Асинхронные тесты
|
||||
Тестируют асинхронные функции:
|
||||
- Хэндлеры сообщений
|
||||
- Запуск бота
|
||||
- Обработка медиа-контента
|
||||
|
||||
## Моки и фикстуры
|
||||
|
||||
### Основные фикстуры
|
||||
- `mock_message` - Мок сообщения Telegram
|
||||
- `mock_state` - Мок состояния FSM
|
||||
- `mock_db` - Мок базы данных
|
||||
- `mock_bot` - Мок бота
|
||||
- `mock_dispatcher` - Мок диспетчера
|
||||
- `mock_factory` - Мок фабрики зависимостей
|
||||
|
||||
### Специализированные фикстуры
|
||||
- `sample_photo_message` - Сообщение с фото
|
||||
- `sample_video_message` - Сообщение с видео
|
||||
- `sample_audio_message` - Сообщение с аудио
|
||||
- `sample_voice_message` - Голосовое сообщение
|
||||
- `sample_video_note_message` - Видеокружок
|
||||
- `sample_media_group` - Медиагруппа
|
||||
- `sample_text_message` - Текстовое сообщение
|
||||
|
||||
## Покрытие тестами
|
||||
|
||||
### Основные компоненты
|
||||
- ✅ Запуск бота (`start_bot`)
|
||||
- ✅ Приватные хэндлеры (`handle_start_message`, `suggest_post`, etc.)
|
||||
- ✅ Обработка медиа-контента (фото, видео, аудио, голос)
|
||||
- ✅ Обработка ошибок и исключений
|
||||
- ✅ Утилиты и вспомогательные функции
|
||||
- ✅ Клавиатуры и фильтры
|
||||
- ✅ Фабрика зависимостей
|
||||
|
||||
### Тестируемые сценарии
|
||||
- ✅ Новые пользователи
|
||||
- ✅ Существующие пользователи
|
||||
- ✅ Пользователи без username
|
||||
- ✅ Обработка различных типов контента
|
||||
- ✅ Медиагруппы
|
||||
- ✅ Ошибки при получении стикеров
|
||||
- ✅ Ошибки базы данных
|
||||
- ✅ Граничные случаи (пустой текст, отсутствие подписей)
|
||||
|
||||
## Настройка окружения
|
||||
|
||||
### Переменные окружения
|
||||
Для тестов не требуются реальные токены бота или подключения к базе данных, так как все внешние зависимости замоканы.
|
||||
|
||||
### Конфигурация pytest
|
||||
Настройки pytest находятся в файле `pytest.ini`:
|
||||
- Автоматический режим asyncio
|
||||
- Фильтрация предупреждений
|
||||
- Маркеры для категоризации тестов
|
||||
|
||||
## Добавление новых тестов
|
||||
|
||||
### Структура теста
|
||||
```python
|
||||
@pytest.mark.asyncio
|
||||
async def test_function_name(mock_message, mock_state, mock_db):
|
||||
"""Описание теста"""
|
||||
# Arrange (подготовка)
|
||||
mock_message.text = "test"
|
||||
|
||||
# Act (действие)
|
||||
result = await function_to_test(mock_message, mock_state)
|
||||
|
||||
# Assert (проверка)
|
||||
assert result is True
|
||||
mock_message.answer.assert_called_once()
|
||||
```
|
||||
|
||||
### Маркировка тестов
|
||||
```python
|
||||
@pytest.mark.unit # Unit тест
|
||||
@pytest.mark.integration # Интеграционный тест
|
||||
@pytest.mark.asyncio # Асинхронный тест
|
||||
@pytest.mark.slow # Медленный тест
|
||||
```
|
||||
|
||||
### Использование фикстур
|
||||
```python
|
||||
def test_with_fixtures(mock_message, sample_photo_message, mock_db):
|
||||
# Используем готовые фикстуры
|
||||
pass
|
||||
```
|
||||
|
||||
## Отладка тестов
|
||||
|
||||
### Подробный вывод
|
||||
```bash
|
||||
pytest -v -s
|
||||
```
|
||||
|
||||
### Остановка на первой ошибке
|
||||
```bash
|
||||
pytest -x
|
||||
```
|
||||
|
||||
### Вывод полного traceback
|
||||
```bash
|
||||
pytest --tb=long
|
||||
```
|
||||
|
||||
### Запуск конкретного теста
|
||||
```bash
|
||||
pytest tests/test_bot.py::TestPrivateHandlers::test_handle_start_message_new_user -v
|
||||
```
|
||||
|
||||
## CI/CD интеграция
|
||||
|
||||
Тесты могут быть интегрированы в CI/CD pipeline:
|
||||
|
||||
```yaml
|
||||
# Пример для GitHub Actions
|
||||
- name: Run tests
|
||||
run: |
|
||||
make install
|
||||
make test-coverage
|
||||
```
|
||||
|
||||
## Покрытие кода
|
||||
|
||||
Для просмотра покрытия кода:
|
||||
```bash
|
||||
make test-html
|
||||
# Открыть htmlcov/index.html в браузере
|
||||
```
|
||||
|
||||
## Лучшие практики
|
||||
|
||||
1. **Изоляция тестов** - каждый тест должен быть независимым
|
||||
2. **Использование моков** - избегайте реальных внешних зависимостей
|
||||
3. **Описательные имена** - имена тестов должны описывать что тестируется
|
||||
4. **Arrange-Act-Assert** - структурируйте тесты по этому паттерну
|
||||
5. **Фикстуры** - используйте фикстуры для переиспользования кода
|
||||
6. **Маркировка** - правильно маркируйте тесты для фильтрации
|
||||
|
||||
## Устранение неполадок
|
||||
|
||||
### Ошибки импорта
|
||||
Убедитесь, что Python path настроен правильно:
|
||||
```bash
|
||||
export PYTHONPATH="${PYTHONPATH}:$(pwd)"
|
||||
```
|
||||
|
||||
### Ошибки asyncio
|
||||
Для асинхронных тестов используйте маркер `@pytest.mark.asyncio`
|
||||
|
||||
### Ошибки моков
|
||||
Проверьте, что все внешние зависимости замоканы:
|
||||
```python
|
||||
with patch('module.function') as mock_func:
|
||||
# тест
|
||||
```
|
||||
|
||||
### Медленные тесты
|
||||
Используйте маркер `@pytest.mark.slow` для медленных тестов и исключайте их при необходимости:
|
||||
```bash
|
||||
pytest -m "not slow"
|
||||
```
|
||||
Reference in New Issue
Block a user