docs: update E2E testing guide with HAR-based endpoints
This commit is contained in:
parent
ecf51bef54
commit
16e587f485
@ -1,25 +1,26 @@
|
|||||||
# End-to-End (E2E) Testing
|
# E2E Testing Guide
|
||||||
|
|
||||||
E2E тесты требуют реальных credentials Kwork.ru и запускаются **только локально** (не в CI).
|
End-to-end тесты для Kwork API client.
|
||||||
|
|
||||||
## ⚠️ Предупреждение
|
## ⚠️ Важные замечания
|
||||||
|
|
||||||
- **Не запускай в CI** — требуются реальные credentials
|
1. **Требуют реальных credentials** — используйте тестовый аккаунт
|
||||||
- **Используй тестовый аккаунт** — не основной аккаунт Kwork
|
2. **Запускаются только локально** — НЕ в CI
|
||||||
- **Rate limiting** — добавляй задержки между запросами
|
3. **Все тесты read-only** — ничего не изменяют на сервере
|
||||||
|
4. **Rate limiting** — Kwork может ограничивать частые запросы
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔧 Настройка
|
## 🔧 Настройка
|
||||||
|
|
||||||
### 1. Создай файл окружения
|
### 1. Создайте файл с credentials
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /root/kwork-api
|
cd /root/kwork-api
|
||||||
cp tests/e2e/.env.example tests/e2e/.env
|
cp tests/e2e/.env.example tests/e2e/.env
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Заполни credentials
|
### 2. Заполните credentials
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# tests/e2e/.env
|
# tests/e2e/.env
|
||||||
@ -27,11 +28,7 @@ KWORK_USERNAME=your_test_username
|
|||||||
KWORK_PASSWORD=your_test_password
|
KWORK_PASSWORD=your_test_password
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Установи зависимости
|
**Важно:** Используйте тестовый аккаунт, не основной!
|
||||||
|
|
||||||
```bash
|
|
||||||
uv sync --group dev
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -43,14 +40,19 @@ uv sync --group dev
|
|||||||
uv run pytest tests/e2e/ -v
|
uv run pytest tests/e2e/ -v
|
||||||
```
|
```
|
||||||
|
|
||||||
### Конкретный тест
|
### Только авторизация
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
uv run pytest tests/e2e/test_auth.py -v
|
uv run pytest tests/e2e/test_auth.py -v
|
||||||
uv run pytest tests/e2e/test_catalog.py::test_get_catalog_list -v
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### С задержками (rate limiting)
|
### Только каталог и пользователи
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv run pytest tests/e2e/test_catalog.py -v
|
||||||
|
```
|
||||||
|
|
||||||
|
### С задержкой между тестами (rate limiting)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
uv run pytest tests/e2e/ -v --slowmo=1
|
uv run pytest tests/e2e/ -v --slowmo=1
|
||||||
@ -58,79 +60,154 @@ uv run pytest tests/e2e/ -v --slowmo=1
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📁 Структура тестов
|
## 📋 Список тестов
|
||||||
|
|
||||||
|
### Авторизация (`test_auth.py`)
|
||||||
|
|
||||||
|
| Тест | Endpoint | Описание |
|
||||||
|
|------|----------|----------|
|
||||||
|
| `test_login_success` | `POST /api/user/login` | Успешный логин |
|
||||||
|
| `test_login_invalid_credentials` | `POST /api/user/login` | Ошибка логина |
|
||||||
|
| `test_restore_session` | N/A | Восстановление сессии (пропущен) |
|
||||||
|
|
||||||
|
### Каталог и пользователи (`test_catalog.py`)
|
||||||
|
|
||||||
|
| Тест | Endpoint | Описание |
|
||||||
|
|------|----------|----------|
|
||||||
|
| `test_get_projects_list` | `GET /projects` | Список проектов |
|
||||||
|
| `test_get_categories` | `GET /categories/{slug}` | Категория |
|
||||||
|
| `test_get_user_profile` | `GET /user/{username}` | Профиль пользователя |
|
||||||
|
| `test_api_checknotify` | `POST /api/user/checknotify` | Проверка уведомлений |
|
||||||
|
| `test_api_addview` | `POST /api/offer/addview` | Добавить просмотр |
|
||||||
|
| `test_get_reviews` | `POST /user/get_reviews` | Отзывы пользователя |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Endpoints из HAR анализа
|
||||||
|
|
||||||
|
Эти endpoints использует официальный сайт Kwork.ru:
|
||||||
|
|
||||||
|
### ✅ Работающие (200 OK)
|
||||||
|
|
||||||
```
|
```
|
||||||
tests/e2e/
|
GET /projects # Список проектов
|
||||||
├── README.md # Этот файл
|
GET /projects/{id}/view # Просмотр проекта
|
||||||
├── .env.example # Шаблон для credentials
|
GET /categories/{slug} # Категория
|
||||||
├── conftest.py # Фикстуры и setup
|
GET /user/{username} # Профиль пользователя
|
||||||
├── test_auth.py # Аутентификация
|
GET /seller # Страница продавца
|
||||||
├── test_catalog.py # Каталог кворков
|
GET /faq # Помощь
|
||||||
├── test_projects.py # Биржа проектов
|
GET /settings # Настройки
|
||||||
└── test_user.py # Пользовательские данные
|
GET /api/user/checknotify # Проверка уведомлений
|
||||||
|
POST /api/user/login # Логин
|
||||||
|
POST /user/get_reviews # Отзывы
|
||||||
|
POST /api/offer/addview # Добавить просмотр
|
||||||
|
POST /captcha/check_phone_captcha_enabled
|
||||||
|
POST /quick-faq/init
|
||||||
|
POST /support2/hit
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ Не работающие (404 Not Found)
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /catalogMainv2 # Используется в client.py (нужно исправить)
|
||||||
|
POST /getKworkDetails # Используется в client.py (нужно исправить)
|
||||||
|
POST /userReviews # Используется в client.py (нужно исправить)
|
||||||
|
POST /cities # Используется в client.py (нужно исправить)
|
||||||
|
POST /countries # Используется в client.py (нужно исправить)
|
||||||
|
POST /user # Не существует
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🧪 Пример теста
|
## 🔍 Отладка
|
||||||
|
|
||||||
|
### Включить логирование
|
||||||
|
|
||||||
```python
|
```python
|
||||||
import pytest
|
import logging
|
||||||
from kwork_api import KworkClient
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
@pytest.mark.e2e
|
|
||||||
async def test_get_user_info():
|
|
||||||
"""E2E тест: получение информации о пользователе."""
|
|
||||||
async with await KworkClient.login(
|
|
||||||
username="test_user",
|
|
||||||
password="test_pass"
|
|
||||||
) as client:
|
|
||||||
user = await client.user.get_info()
|
|
||||||
assert user.username == "test_user"
|
|
||||||
assert user.balance >= 0
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
### Посмотреть логи запросов
|
||||||
|
|
||||||
## 🏷️ Маркировка тестов
|
|
||||||
|
|
||||||
E2E тесты маркируются `@pytest.mark.e2e` для изоляции:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Запустить только unit тесты (исключить e2e)
|
uv run pytest tests/e2e/test_auth.py::test_login_success -v -s 2>&1 | grep -E "INFO|DEBUG|ERROR"
|
||||||
uv run pytest tests/ -v -m "not e2e"
|
```
|
||||||
|
|
||||||
# Запустить только e2e тесты
|
Пример вывода:
|
||||||
uv run pytest tests/ -v -m e2e
|
```
|
||||||
|
INFO:kwork_api.client:Login request: POST https://kwork.ru/api/user/login (user: username)
|
||||||
|
DEBUG:kwork_api.client:Login payload: {'l_username': '...', 'l_password': '...', ...}
|
||||||
|
DEBUG:kwork_api.client:Login response status: 200
|
||||||
|
INFO:kwork_api.client:Login successful: user_id=12345, csrf_token=abc123...
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔒 Безопасность
|
## 🛠 Troubleshooting
|
||||||
|
|
||||||
1. **Никогда не коммить `.env`** — добавлен в `.gitignore`
|
### Ошибка: "Нужно ввести логин"
|
||||||
2. **Используй тестовый аккаунт** — не основной
|
|
||||||
3. **Не сохраняй токены в коде** — только через env vars
|
**Проблема:** Credentials не переданы в login()
|
||||||
|
|
||||||
|
**Решение:** Проверьте что .env файл существует и заполнен:
|
||||||
|
```bash
|
||||||
|
cat tests/e2e/.env
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ошибка: 404 Not Found
|
||||||
|
|
||||||
|
**Проблема:** Endpoint не существует
|
||||||
|
|
||||||
|
**Решение:** Проверьте HAR файл для правильных endpoints:
|
||||||
|
```bash
|
||||||
|
cd /root
|
||||||
|
python3 << 'EOF'
|
||||||
|
import json
|
||||||
|
with open('kwork-dump.har') as f:
|
||||||
|
har = json.load(f)
|
||||||
|
for entry in har['log']['entries']:
|
||||||
|
if 'kwork.ru/' in entry['request']['url'] and 'cdn' not in entry['request']['url']:
|
||||||
|
print(f"{entry['request']['method']} {entry['response']['status']} {entry['request']['url'].split('?')[0]}")
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ошибка: Rate limit
|
||||||
|
|
||||||
|
**Проблема:** Слишком много запросов
|
||||||
|
|
||||||
|
**Решение:** Запустите с задержкой:
|
||||||
|
```bash
|
||||||
|
uv run pytest tests/e2e/ -v --slowmo=2
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🐛 Troubleshooting
|
## 📝 Добавление новых тестов
|
||||||
|
|
||||||
### Ошибка аутентификации
|
1. Создайте тест в `tests/e2e/test_*.py`
|
||||||
```
|
2. Добавьте маркер `@pytest.mark.e2e`
|
||||||
KworkAuthError: Invalid credentials
|
3. Используйте фикстуру `require_credentials`
|
||||||
```
|
4. Убедитесь что тест read-only (не изменяет данные)
|
||||||
**Решение:** Проверь credentials в `.env`
|
|
||||||
|
|
||||||
### Rate limit
|
Пример:
|
||||||
|
```python
|
||||||
|
@pytest.mark.e2e
|
||||||
|
async def test_my_feature(require_credentials):
|
||||||
|
"""E2E: Мой новый тест."""
|
||||||
|
client = await KworkClient.login(
|
||||||
|
username=require_credentials["username"],
|
||||||
|
password=require_credentials["password"],
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Ваш тест здесь
|
||||||
|
result = await client.some_method()
|
||||||
|
assert result is not None
|
||||||
|
finally:
|
||||||
|
await client.close()
|
||||||
```
|
```
|
||||||
KworkApiError: Too many requests
|
|
||||||
```
|
|
||||||
**Решение:** Запусти с задержкой: `pytest --slowmo=2`
|
|
||||||
|
|
||||||
### Session expired
|
---
|
||||||
```
|
|
||||||
KworkAuthError: Session expired
|
_Updated: 2026-03-29_
|
||||||
```
|
|
||||||
**Решение:** Перезапусти тесты (session создаётся заново)
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user