9.2 KiB
Отчет об улучшении автотестов API
Дата: 2026-02-16
Ветка: refactor/split-views-dry-ldap-patterns
Коммиты: 0327566, 300d7a1, c7b1cf1
Цель
Улучшить автотесты API для работы как с LDAP, так и без LDAP.
Выполненные работы
1. Создана LDAP тестовая инфраструктура
✅ Файлы:
.env.test- конфигурация тестового окружения с LDAPbackend/scripts/ldap/init/01-base-structure.ldif- инициализация LDAP структурыbackend/tests/ldap_fixtures.py- LDAP-специфичные pytest fixturesbackend/tests/api/v1/employees/test_helpers.py- централизованные хелперы для тестовbackend/docs/testing/LDAP_TESTING.md- документация по LDAP тестированиюbackend/docs/testing/TEST_IMPROVEMENTS_SUMMARY.md- полная сводка улучшений
✅ Маркеры pytest:
ldap_required- тесты требуют LDAPldap_optional- тесты работают с/без LDAP
✅ Fixtures:
ldap_available- проверка доступности LDAPldap_config- конфигурация LDAPensure_ldap_enabled/ensure_ldap_disabled- принудительное включение/выключение LDAPldap_cleanup- автоочистка LDAP записей после тестов
2. Исправлены критичные баги
✅ Добавлен logger в user_service.py:
import logging
logger = logging.getLogger(__name__)
✅ Добавлен default для LDAP_POSITIONS_BASE в settings.py:
LDAP_POSITIONS_BASE = os.getenv("LDAP_POSITIONS_BASE", "OU=Positions,OU=company,DC=robotail,DC=local")
✅ Сделаны опциональными avatar и gender в RegisterSerializer:
avatar = Base64ImageField(required=False, allow_null=True)
gender = serializers.ChoiceField(required=False, allow_null=True, ...)
3. Массовое обновление тестовых файлов
✅ Создан скрипт scripts/update_test_helpers.py:
- Автоматически добавляет импорты централизованных хелперов
- Удаляет дублирующиеся локальные определения
- Обновляет вызовы функций
✅ Обновлено 13 тестовых файлов:
test_department_head_rights.pytest_department_membership_separation.pytest_department_roles.pytest_department_roles_extra.pytest_departments.pytest_email_verification_security.pytest_employee_actions.pytest_employees.pytest_employees_fields_in_list.pytest_ldap_optional_groups.pytest_positions.pytest_role_assignment.pytest_skills.py
✅ Исправлены синтаксические ошибки после автоматического обновления:
- Неправильное расположение import в test_department_membership_separation.py
- Удалены лишние строки в test_department_roles.py
- Восстановлена функция
_flush_perm_cacheв test_positions.py
✅ Добавлен ensure_ldap_disabled fixture:
- В тесты, не требующие LDAP функционала
- Предотвращает попытки синхронизации с несуществующим LDAP
4. Централизованные тестовые хелперы
✅ test_helpers.py содержит:
make_user(email, **kwargs) # Создание пользователя
grant_permission(user, codename) # Выдача прав
make_department(**kwargs) # Создание отдела
make_position(**kwargs) # Создание должности
make_department_role(dept, **kwargs) # Создание роли
make_unique_email() # Генератор email
make_unique_phone() # Генератор телефонов
extract_results(response) # Извлечение из paginated response
Результаты
До улучшений
81 failed, 37 passed, 19 errors
После первого этапа (инфраструктура + частичные исправления)
74 failed, 59 passed, 13 skipped, 4 errors
После второго этапа (массовое обновление + багфиксы)
35 failed, 102 passed, 13 skipped, 0 errors
Улучшение
- ✅ +65 passed тестов (+176%)
- ✅ -46 failed тестов (-57%)
- ✅ 0 errors (было 19, затем 4)
- ✅ 13 skipped (LDAP-зависимые тесты корректно пропускаются)
Оставшиеся проблемы
1. Тесты без ensure_ldap_disabled (35 failed)
Причина: Тесты создают объекты через Department.objects.create() или подобные методы, но при PATCH/PUT/DELETE API пытается синхронизировать с LDAP.
Решение:
- Добавить
ensure_ldap_disabledfixture ко всем оставшимся тестам, не тестирующим LDAP - Или создавать объекты через API с моком LDAP
- Или параметризовать тесты для работы в обоих режимах
Затронутые файлы:
- test_departments.py (9 failed)
- test_positions.py (5 failed)
- test_employee_actions.py (4 failed)
- test_department_roles.py (3 failed)
- test_department_roles_extra.py (2 failed)
- test_role_assignment.py (5 failed)
- test_employees.py (2 failed)
- test_ldap_optional_register.py (1 failed)
- test_skills.py (2 failed)
- test_email_verification_security.py (2 failed - возможно другая причина)
2. Тесты регистрации
test_register_without_ldap_creates_user_only_in_db - падает из-за валидации. Требует дополнительной проверки.
3. Email verification тесты
Возможно требуют отдельного анализа.
Следующие шаги
-
Добавить
ensure_ldap_disabledк оставшимся 35 failed тестамdef test_example(api_client, ensure_ldap_disabled): # тест без LDAP -
Параметризовать LDAP-опциональные тесты
@pytest.mark.parametrize("ldap_mode", ["enabled", "disabled"]) def test_with_both_modes(api_client, ldap_mode): # тест проверяет оба сценария -
Создать интеграционные LDAP тесты
- Тесты с реальным LDAP контейнером
- Проверка создания/обновления/удаления в LDAP
- Проверка синхронизации DB ↔ LDAP
-
Запустить Docker LDAP и тесты с
@pytest.mark.ldap_requireddocker-compose --profile ldap up -d pytest -m ldap_required -v
Команды для воспроизведения
# Запуск всех тестов
cd backend
../.venv/Scripts/python -m pytest tests/api/v1/employees/ -v
# Запуск только LDAP-required тестов (требует запущенный LDAP)
../.venv/Scripts/python -m pytest tests/api/v1/employees/ -m ldap_required -v
# Запуск без LDAP-зависимых тестов
../.venv/Scripts/python -m pytest tests/api/v1/employees/ -m "not ldap_required" -v
# Статистика
../.venv/Scripts/python -m pytest tests/api/v1/employees/ -q --tb=no
Коммиты
- 0327566: feat: add LDAP testing infrastructure (fixtures, helpers, docs)
- 300d7a1: docs: add LDAP testing infrastructure summary
- c7b1cf1: fix: resolve test failures - add logger, LDAP_POSITIONS_BASE, make avatar/gender optional, add ensure_ldap_disabled fixtures
Структура документации
backend/docs/testing/
├── LDAP_TESTING.md # Подробный гайд по LDAP тестированию
└── TEST_IMPROVEMENTS_SUMMARY.md # Полная сводка улучшений
docs/reports/
└── TEST_FIXES_SESSION.md # Этот отчет
backend/tests/
├── ldap_fixtures.py # LDAP pytest fixtures
└── api/v1/employees/
└── test_helpers.py # Централизованные хелперы
Заключение
Создана полная инфраструктура для LDAP тестирования с централизованными хелперами, автоматической очисткой и документацией. Улучшение на +176% passed тестов и полное устранение errors.
Следующий этап - добавить ensure_ldap_disabled к оставшимся 35 failed тестам и создать интеграционные тесты с реальным LDAP.