This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -176,3 +176,4 @@ panel/types.gen.ts
|
|||||||
.cursor
|
.cursor
|
||||||
tmp
|
tmp
|
||||||
test-results
|
test-results
|
||||||
|
page_content.html
|
||||||
|
|||||||
@@ -1,136 +0,0 @@
|
|||||||
# Исправление Playwright Headless режима и pytest ошибок
|
|
||||||
|
|
||||||
**Дата**: 2025-08-12
|
|
||||||
**Версия**: 0.9.6
|
|
||||||
**Статус**: ✅ Завершено
|
|
||||||
|
|
||||||
## 🎯 Проблемы
|
|
||||||
|
|
||||||
### 1. Playwright Headless режим в CI/CD
|
|
||||||
При запуске E2E тестов в CI/CD окружении возникала ошибка:
|
|
||||||
```
|
|
||||||
║ Looks like you launched a headed browser without having a XServer running. ║
|
|
||||||
║ Set either 'headless: true' or use 'xvfb-run <your-playwright-app>' before running Playwright. ║
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Pytest ошибка с TestModel
|
|
||||||
При сборе тестов возникала ошибка:
|
|
||||||
```
|
|
||||||
cannot collect test class 'TestModel' because it has a __init__ constructor
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. E2E тесты не могли запустить фронтенд
|
|
||||||
В CI/CD окружении отсутствовал собранный фронтенд, что приводило к ошибке:
|
|
||||||
```
|
|
||||||
RuntimeError: Directory '/home/act_runner/.cache/act/.../dist/assets' does not exist
|
|
||||||
```
|
|
||||||
|
|
||||||
**Решение**: Добавлен шаг для запуска фронтенд сервера в CI/CD workflow
|
|
||||||
|
|
||||||
## 🔧 Решения
|
|
||||||
|
|
||||||
### 1. Playwright Headless режим
|
|
||||||
|
|
||||||
#### Обновлен CI/CD workflow
|
|
||||||
Добавлена переменная окружения `PLAYWRIGHT_HEADLESS=true` в `.gitea/workflows/main.yml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- name: Run Tests
|
|
||||||
env:
|
|
||||||
PLAYWRIGHT_HEADLESS: "true"
|
|
||||||
run: |
|
|
||||||
uv run pytest tests/ -v
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Добавлена установка браузеров Playwright
|
|
||||||
```yaml
|
|
||||||
- name: Setup Playwright (use pre-installed browsers)
|
|
||||||
env:
|
|
||||||
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
|
|
||||||
run: |
|
|
||||||
# Используем предустановленные браузеры в системе
|
|
||||||
npx playwright --version
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Обновлены все Playwright тесты
|
|
||||||
Все тесты теперь используют переменную окружения для определения headless режима:
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Определяем headless режим из переменной окружения
|
|
||||||
headless_mode = os.getenv("PLAYWRIGHT_HEADLESS", "false").lower() == "true"
|
|
||||||
print(f"🔧 Headless режим: {headless_mode}")
|
|
||||||
|
|
||||||
browser = await playwright.chromium.launch(headless=headless_mode)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Pytest ошибка с TestModel
|
|
||||||
|
|
||||||
#### Исправлен класс TestModel
|
|
||||||
В `tests/test_db_coverage.py`:
|
|
||||||
- Переименован класс `TestModel` → `MockTestModel`
|
|
||||||
- Убран `__init__` конструктор
|
|
||||||
- Обновлены все ссылки на класс
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Было:
|
|
||||||
class TestModel(Base):
|
|
||||||
def __init__(self, name: str = None, description: str = None):
|
|
||||||
self.name = name
|
|
||||||
self.description = description
|
|
||||||
|
|
||||||
# Стало:
|
|
||||||
class MockTestModel(Base):
|
|
||||||
# Без __init__ конструктора
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📝 Обновленные файлы
|
|
||||||
|
|
||||||
### CI/CD
|
|
||||||
- `.gitea/workflows/main.yml` - добавлена переменная окружения и настройка Playwright
|
|
||||||
|
|
||||||
### Тесты
|
|
||||||
- `tests/test_community_delete_e2e_browser.py` - добавлена поддержка headless режима
|
|
||||||
- `tests/test_login_debug.py` - добавлена поддержка headless режима
|
|
||||||
- `tests/test_delete_button_debug.py` - добавлена поддержка headless режима
|
|
||||||
- `check_communities_table.py` - добавлена поддержка headless режима
|
|
||||||
- `tests/test_db_coverage.py` - исправлен класс TestModel
|
|
||||||
|
|
||||||
### Документация
|
|
||||||
- `CHANGELOG.md` - добавлена версия 0.9.6
|
|
||||||
- `docs/testing.md` - добавлена документация по Playwright конфигурации
|
|
||||||
- `docs/README.md` - обновлен статус проекта
|
|
||||||
- `docs/features.md` - E2E тестирование
|
|
||||||
|
|
||||||
## 🎭 Преимущества решения
|
|
||||||
|
|
||||||
1. **Автоматическое переключение**: Тесты автоматически определяют режим работы
|
|
||||||
2. **Локальная разработка**: Можно запускать в headed режиме для отладки
|
|
||||||
3. **CI/CD совместимость**: Автоматически работает в headless режиме
|
|
||||||
4. **Единая конфигурация**: Один код работает в разных окружениях
|
|
||||||
5. **Исправлены pytest ошибки**: Устранены предупреждения о сборе тестов
|
|
||||||
|
|
||||||
## 🔄 Переменные окружения
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Локальная разработка - headed режим для отладки
|
|
||||||
export PLAYWRIGHT_HEADLESS=false
|
|
||||||
|
|
||||||
# CI/CD - headless режим без XServer
|
|
||||||
export PLAYWRIGHT_HEADLESS=true
|
|
||||||
```
|
|
||||||
|
|
||||||
## ✅ Результат
|
|
||||||
|
|
||||||
- **E2E тесты**: Теперь корректно работают в CI/CD
|
|
||||||
- **Pytest ошибки**: Устранены предупреждения о сборе тестов
|
|
||||||
- **Локальная разработка**: Сохранена возможность отладки в headed режиме
|
|
||||||
- **Автоматизация**: CI/CD pipeline работает без ошибок
|
|
||||||
- **Документация**: Обновлена с инструкциями по настройке
|
|
||||||
|
|
||||||
## 🚀 Следующие шаги
|
|
||||||
|
|
||||||
1. **Тестирование**: Запустить CI/CD pipeline для проверки
|
|
||||||
2. **Мониторинг**: Отслеживать стабильность E2E тестов
|
|
||||||
3. **Расширение**: Добавить поддержку других браузеров при необходимости
|
|
||||||
4. **Проверка pytest**: Убедиться, что все тесты собираются без предупреждений
|
|
||||||
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# Исправление проблемы сбора тестов - 2025-08-12
|
|
||||||
|
|
||||||
## Проблема
|
|
||||||
При запуске тестов в CI/CD возникала ошибка:
|
|
||||||
```
|
|
||||||
ERROR collecting tests/test_delete_existing_community.py
|
|
||||||
ConnectionRefusedError: [Errno 111] Connection refused
|
|
||||||
```
|
|
||||||
|
|
||||||
## Причина
|
|
||||||
Файл `tests/test_delete_existing_community.py` содержал исполняемый код на уровне модуля, который выполнялся при импорте pytest'ом. Код пытался подключиться к `localhost:8000` для выполнения HTTP-запросов, но сервер не был запущен.
|
|
||||||
|
|
||||||
## Решение
|
|
||||||
Обернул весь код в тестовую функцию `test_delete_existing_community()`:
|
|
||||||
|
|
||||||
### До исправления:
|
|
||||||
```python
|
|
||||||
# Код выполнялся при импорте модуля
|
|
||||||
print("🔐 Авторизуемся...")
|
|
||||||
response = requests.post(url, json={"query": login_mutation, "variables": login_variables})
|
|
||||||
# ... остальной код
|
|
||||||
```
|
|
||||||
|
|
||||||
### После исправления:
|
|
||||||
```python
|
|
||||||
def test_delete_existing_community():
|
|
||||||
"""Тест удаления существующего сообщества через API"""
|
|
||||||
print("🔐 Авторизуемся...")
|
|
||||||
response = requests.post(url, json={"query": login_mutation, "variables": login_variables})
|
|
||||||
# ... остальной код
|
|
||||||
```
|
|
||||||
|
|
||||||
## Результаты
|
|
||||||
|
|
||||||
### ✅ Исправлено
|
|
||||||
- Ошибка сбора тестов устранена
|
|
||||||
- Все 361 тест теперь собирается корректно
|
|
||||||
- Сохранена функциональность при запуске как скрипт
|
|
||||||
|
|
||||||
### 🔧 Дополнительные улучшения
|
|
||||||
- Добавлен импорт `pytest` для корректной работы
|
|
||||||
- Заменены `exit(1)` на `pytest.fail()` для корректного тестирования
|
|
||||||
- Добавлены assert'ы для проверки результатов
|
|
||||||
- Добавлен блок `if __name__ == "__main__"` для запуска как скрипт
|
|
||||||
|
|
||||||
## Проверка
|
|
||||||
```bash
|
|
||||||
# Сбор тестов работает корректно
|
|
||||||
uv run pytest --collect-only
|
|
||||||
# Результат: 361 tests collected in 3.45s
|
|
||||||
|
|
||||||
# Отдельный тест запускается без ошибок
|
|
||||||
uv run pytest tests/test_delete_existing_community.py -v
|
|
||||||
# Результат: тест падает с ожидаемой ошибкой подключения (но не при сборе)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Статус
|
|
||||||
✅ Проблема полностью решена
|
|
||||||
✅ Все тесты собираются корректно
|
|
||||||
✅ CI/CD может продолжать работу
|
|
||||||
✅ Функциональность теста сохранена
|
|
||||||
|
|
||||||
## Коммиты
|
|
||||||
- `124763b` - fix: wrap test_delete_existing_community.py code in test function
|
|
||||||
- `6c12126` - chore: update project author information
|
|
||||||
|
|
||||||
## Следующие шаги
|
|
||||||
1. Запустить полный набор тестов в CI/CD
|
|
||||||
2. Убедиться, что все тесты проходят сбор
|
|
||||||
3. Рассмотреть возможность добавления моков для HTTP-запросов в тестах
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
# Завершение исправления тестов - 2025-08-12
|
|
||||||
|
|
||||||
## Что было исправлено
|
|
||||||
|
|
||||||
### 1. **Проблема сбора тестов** ✅
|
|
||||||
- **Файл**: `tests/test_delete_existing_community.py`
|
|
||||||
- **Проблема**: Код выполнялся на уровне модуля при импорте pytest'ом
|
|
||||||
- **Решение**: Обернул весь код в тестовую функцию `test_delete_existing_community()`
|
|
||||||
- **Результат**: Ошибка `ConnectionRefusedError` при сборе устранена
|
|
||||||
|
|
||||||
### 2. **Проблема с TestModel** ✅
|
|
||||||
- **Файл**: `tests/test_db_coverage.py`
|
|
||||||
- **Проблема**: `TestModel` имел `__init__` конструктор, что вызывало предупреждение pytest
|
|
||||||
- **Решение**: Добавил явный `__init__` метод для избежания предупреждения
|
|
||||||
- **Результат**: Предупреждение `cannot collect test class 'TestModel'` устранено
|
|
||||||
|
|
||||||
### 3. **Отсутствующие фикстуры в OAuth тестах** ✅
|
|
||||||
- **Файл**: `tests/auth/test_oauth.py`
|
|
||||||
- **Проблема**: Фикстуры `oauth_db_session` и `simple_user` не были определены
|
|
||||||
- **Решение**: Добавил недостающие фикстуры для работы с базой данных
|
|
||||||
- **Результат**: OAuth тесты теперь работают корректно
|
|
||||||
|
|
||||||
### 4. **Проблема с виртуальным окружением** ✅
|
|
||||||
- **Проблема**: Использовались и `venv/` и `.venv/` директории
|
|
||||||
- **Решение**: Удалил старую `venv/` директорию, оставил только `.venv`
|
|
||||||
- **Результат**: Теперь используется только `.venv` для uv
|
|
||||||
|
|
||||||
### 5. **Убрали моки, которые тестируют только моки** ✅
|
|
||||||
- **Файл**: `tests/auth/test_auth_service.py`
|
|
||||||
- **Проблема**: Тесты использовали моки вместо реальных функций
|
|
||||||
- **Решение**: Заменил моки на реальные вызовы функций и базы данных
|
|
||||||
- **Результат**: Тесты теперь тестируют реальную функциональность
|
|
||||||
|
|
||||||
## Текущий статус
|
|
||||||
|
|
||||||
### ✅ Полностью исправлено
|
|
||||||
- **Сбор тестов**: 361 тест собирается без ошибок
|
|
||||||
- **Выполнение тестов**: Тесты запускаются и выполняются корректно
|
|
||||||
- **Виртуальное окружение**: Используется только `.venv`
|
|
||||||
- **Интеграционные тесты**: Тесты используют реальные функции вместо моков
|
|
||||||
|
|
||||||
### 🔧 Улучшения
|
|
||||||
- Тесты теперь являются настоящими интеграционными тестами
|
|
||||||
- Проверяется реальная функциональность системы
|
|
||||||
- Лучшая изоляция тестов с правильной очисткой данных
|
|
||||||
- Корректная работа с базой данных
|
|
||||||
|
|
||||||
## Команды для проверки
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Проверка сбора тестов
|
|
||||||
uv run pytest --collect-only
|
|
||||||
# Результат: 361 tests collected
|
|
||||||
|
|
||||||
# Запуск конкретных тестов
|
|
||||||
uv run pytest tests/auth/test_auth_service.py::test_ensure_user_has_reader_role -v
|
|
||||||
uv run pytest tests/auth/test_oauth.py::test_oauth_callback_success -v
|
|
||||||
|
|
||||||
# Запуск всех тестов
|
|
||||||
uv run pytest
|
|
||||||
```
|
|
||||||
|
|
||||||
## Коммиты
|
|
||||||
|
|
||||||
- `3e704fe` - fix: remove mocks and use real integration tests
|
|
||||||
- `25ec1ba` - fix: add missing fixtures and improve test model constructor
|
|
||||||
- `aad8c7b` - docs: add test collection fix progress report
|
|
||||||
- `6c12126` - chore: update project author information
|
|
||||||
- `124763b` - fix: wrap test_delete_existing_community.py code in test function
|
|
||||||
|
|
||||||
## Следующие шаги
|
|
||||||
|
|
||||||
1. **Push изменений** в dev ветку для проверки CI/CD
|
|
||||||
2. **Проверить деплой** на staging сервер
|
|
||||||
3. **Убедиться**, что все тесты проходят в CI/CD
|
|
||||||
4. **Рассмотреть** исправление длинных строк в коде (14 ошибок E501)
|
|
||||||
|
|
||||||
## Статус
|
|
||||||
✅ **Все проблемы с тестами полностью решены**
|
|
||||||
✅ **Проект готов к работе в CI/CD**
|
|
||||||
✅ **Тесты являются настоящими интеграционными тестами**
|
|
||||||
✅ **Используется правильное виртуальное окружение**
|
|
||||||
4205
page_content.html
4205
page_content.html
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user