288 lines
8.5 KiB
Markdown
288 lines
8.5 KiB
Markdown
# 🧪 Тесты для AnonBot
|
||
|
||
## 📁 Структура тестов
|
||
|
||
```
|
||
tests/
|
||
├── __init__.py
|
||
├── conftest.py # Конфигурация pytest
|
||
├── requirements.txt # Тестовые зависимости
|
||
├── README.md # Документация тестов
|
||
├── unit/ # Unit тесты
|
||
│ ├── __init__.py
|
||
│ ├── models/ # Тесты моделей данных
|
||
│ │ ├── __init__.py
|
||
│ │ ├── test_user.py
|
||
│ │ ├── test_question.py
|
||
│ │ ├── test_user_block.py
|
||
│ │ └── test_user_settings.py
|
||
│ ├── services/ # Тесты сервисов
|
||
│ │ ├── __init__.py
|
||
│ │ ├── validation/ # Тесты валидации
|
||
│ │ │ ├── __init__.py
|
||
│ │ │ ├── test_input_validator.py
|
||
│ │ │ └── test_validation_middleware.py
|
||
│ │ ├── auth/ # Тесты авторизации
|
||
│ │ │ ├── __init__.py
|
||
│ │ │ ├── test_auth_service.py
|
||
│ │ │ └── test_permissions.py
|
||
│ │ ├── business/ # Тесты бизнес-сервисов
|
||
│ │ │ ├── __init__.py
|
||
│ │ │ ├── test_user_service.py
|
||
│ │ │ ├── test_question_service.py
|
||
│ │ │ ├── test_message_service.py
|
||
│ │ │ └── test_pagination_service.py
|
||
│ │ ├── infrastructure/ # Тесты инфраструктурных сервисов
|
||
│ │ │ ├── __init__.py
|
||
│ │ │ ├── test_database.py
|
||
│ │ │ └── test_metrics.py
|
||
│ │ └── test_utils.py # Тесты утилит
|
||
│ ├── database/ # Тесты CRUD операций
|
||
│ │ ├── __init__.py
|
||
│ │ └── test_crud.py
|
||
│ ├── handlers/ # Тесты обработчиков
|
||
│ │ ├── __init__.py
|
||
│ │ ├── test_start.py
|
||
│ │ ├── test_questions.py
|
||
│ │ ├── test_answers.py
|
||
│ │ └── test_admin.py
|
||
│ ├── middlewares/ # Тесты middleware
|
||
│ │ ├── __init__.py
|
||
│ │ ├── test_validation_middleware.py
|
||
│ │ └── test_rate_limit_middleware.py
|
||
│ └── config/ # Тесты конфигурации
|
||
│ ├── __init__.py
|
||
│ ├── test_config.py
|
||
│ └── test_constants.py
|
||
└── integration/ # Интеграционные тесты
|
||
├── __init__.py
|
||
├── test_database_integration.py
|
||
└── test_bot_integration.py
|
||
```
|
||
|
||
## 🚀 Запуск тестов
|
||
|
||
### Установка зависимостей
|
||
|
||
```bash
|
||
pip install -r tests/requirements.txt
|
||
```
|
||
|
||
### Запуск всех тестов
|
||
|
||
```bash
|
||
pytest
|
||
```
|
||
|
||
### Запуск unit тестов
|
||
|
||
```bash
|
||
pytest tests/unit/
|
||
```
|
||
|
||
### Запуск интеграционных тестов
|
||
|
||
```bash
|
||
pytest tests/integration/
|
||
```
|
||
|
||
### Запуск тестов с покрытием
|
||
|
||
```bash
|
||
pytest --cov=. --cov-report=html
|
||
```
|
||
|
||
### Запуск тестов по категориям
|
||
|
||
```bash
|
||
# Тесты моделей
|
||
pytest -m models
|
||
|
||
# Тесты сервисов
|
||
pytest -m services
|
||
|
||
# Тесты БД
|
||
pytest -m database
|
||
|
||
# Тесты авторизации
|
||
pytest -m auth
|
||
|
||
# Тесты валидации
|
||
pytest -m validation
|
||
```
|
||
|
||
## 📊 Покрытие кода
|
||
|
||
Цель покрытия: **80%+**
|
||
|
||
### Приоритеты покрытия:
|
||
|
||
1. **Критически важные компоненты (90%+)**:
|
||
- Модели данных
|
||
- Валидация
|
||
- Авторизация
|
||
- CRUD операции
|
||
- Бизнес-сервисы
|
||
|
||
2. **Важные компоненты (80%+)**:
|
||
- Обработчики
|
||
- Middleware
|
||
- Инфраструктурные сервисы
|
||
|
||
3. **Дополнительные компоненты (70%+)**:
|
||
- Утилиты
|
||
- Конфигурация
|
||
- Интеграционные тесты
|
||
|
||
## 🎯 Что тестировать
|
||
|
||
### Модели данных
|
||
- Создание объектов
|
||
- Валидация полей
|
||
- Методы форматирования
|
||
- HTML экранирование
|
||
- Сериализация/десериализация
|
||
|
||
### Валидация
|
||
- Валидация Telegram ID
|
||
- Валидация текстового контента
|
||
- Валидация deep links
|
||
- Валидация callback data
|
||
- HTML санитизация
|
||
- Спам-фильтры
|
||
|
||
### Авторизация
|
||
- Проверка ролей
|
||
- Система разрешений
|
||
- Проверка прав доступа
|
||
- Обработка ошибок
|
||
|
||
### CRUD операции
|
||
- Создание, чтение, обновление, удаление
|
||
- Batch операции
|
||
- Cursor-based пагинация
|
||
- Обработка ошибок БД
|
||
- Транзакции
|
||
|
||
### Бизнес-сервисы
|
||
- Создание/обновление пользователей
|
||
- Обработка вопросов и ответов
|
||
- Форматирование сообщений
|
||
- Пагинация
|
||
- Интеграция с БД
|
||
|
||
### Обработчики
|
||
- Обработка команд
|
||
- Deep linking
|
||
- FSM состояния
|
||
- Callback обработчики
|
||
- Валидация входных данных
|
||
|
||
### Middleware
|
||
- Валидация входящих данных
|
||
- Rate limiting
|
||
- Обработка ошибок
|
||
- Пропуск событий
|
||
|
||
## 🔧 Настройка тестов
|
||
|
||
### Переменные окружения
|
||
|
||
Создайте `.env.test` файл:
|
||
|
||
```env
|
||
# Тестовая конфигурация
|
||
TELEGRAM_BOT_TOKEN=test_token
|
||
DATABASE_PATH=:memory:
|
||
ADMINS=123456789,987654321
|
||
LOG_LEVEL=DEBUG
|
||
METRICS_PORT=9090
|
||
```
|
||
|
||
### Фикстуры
|
||
|
||
Основные фикстуры в `conftest.py`:
|
||
- `mock_database` - мок для DatabaseService
|
||
- `mock_auth` - мок для AuthService
|
||
- `mock_validator` - мок для InputValidator
|
||
- `mock_utils` - мок для UtilsService
|
||
- `mock_config` - мок для конфигурации
|
||
|
||
## 📝 Примеры тестов
|
||
|
||
### Unit тест
|
||
|
||
```python
|
||
def test_user_creation_basic():
|
||
"""Тест базового создания пользователя"""
|
||
user = User(
|
||
telegram_id=123456789,
|
||
first_name="Test",
|
||
chat_id=123456789,
|
||
profile_link="test_link"
|
||
)
|
||
|
||
assert user.telegram_id == 123456789
|
||
assert user.first_name == "Test"
|
||
assert user.is_active is True
|
||
assert user.is_superuser is False
|
||
```
|
||
|
||
### Async тест
|
||
|
||
```python
|
||
@pytest.mark.asyncio
|
||
async def test_create_user_async():
|
||
"""Тест асинхронного создания пользователя"""
|
||
user_service = UserService(mock_database)
|
||
user = await user_service.create_or_update_user(telegram_user, chat_id)
|
||
|
||
assert user.telegram_id == telegram_user.id
|
||
assert user.first_name == telegram_user.first_name
|
||
```
|
||
|
||
### Тест с моками
|
||
|
||
```python
|
||
def test_auth_service_is_admin(mock_config):
|
||
"""Тест проверки администратора"""
|
||
auth_service = AuthService(mock_database, mock_config)
|
||
|
||
assert auth_service.is_admin(123456789) is True
|
||
assert auth_service.is_admin(999999999) is False
|
||
```
|
||
|
||
## 🚨 Обработка ошибок
|
||
|
||
Все тесты должны:
|
||
- Проверять как успешные, так и ошибочные сценарии
|
||
- Использовать соответствующие исключения
|
||
- Проверять логирование ошибок
|
||
- Тестировать восстановление после ошибок
|
||
|
||
## 📈 Производительность
|
||
|
||
Тесты должны:
|
||
- Выполняться быстро (< 1 секунды для unit тестов)
|
||
- Использовать моки для внешних зависимостей
|
||
- Тестировать производительность критических компонентов
|
||
- Включать benchmark тесты для БД операций
|
||
|
||
## 🔍 Отладка
|
||
|
||
Для отладки тестов:
|
||
|
||
```bash
|
||
# Запуск с подробным выводом
|
||
pytest -v -s
|
||
|
||
# Запуск конкретного теста
|
||
pytest tests/unit/models/test_user.py::TestUser::test_user_creation_basic
|
||
|
||
# Запуск с остановкой на первой ошибке
|
||
pytest -x
|
||
|
||
# Запуск с отладочным выводом
|
||
pytest --pdb
|
||
```
|