260 lines
8.5 KiB
Markdown
260 lines
8.5 KiB
Markdown
# Тестирование 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"
|
||
```
|