From 932d0594a96e4ee0954ba4d1bdf397a6b0177b9b Mon Sep 17 00:00:00 2001 From: VolandSZ <{E-MAIL}> Date: Tue, 1 Sep 2026 23:55:23 +0300 Subject: [PATCH] docs: add detailed README with run commands and test creation guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Описаны: - Структура проекта и иерархия тестов - Быстрый старт (venv, зависимости, .env) - Команды запуска: все тесты / по роли / по БП / по шагу - Полезные флаги pytest (headed/headless, slowmo, -k, --co) - Шаблон создания нового бизнес-процесса вручную - Правила именования (папки, файлы, классы, методы, маркеры) - Инструкция по добавлению ФЛК-генератора - Инструкция по добавлению статического артефакта --- README.md | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 286 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b4eece..573c84e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,287 @@ -# e2e_Pets +# e2e_Pets — End-to-End тесты портала учёта животных +Автоматизированное тестирование портала [vet.goznak.ru](https://vet.goznak.ru) +на базе **Playwright + pytest**. + +--- + +## Содержание + +- [Структура проекта](#структура-проекта) +- [Быстрый старт](#быстрый-старт) +- [Запуск тестов](#запуск-тестов) +- [Создание нового теста](#создание-нового-теста) +- [Добавление генератора данных (ФЛК)](#добавление-генератора-данных-флк) +- [Добавление статического артефакта](#добавление-статического-артефакта) + +--- + +## Структура проекта + +``` +e2e_Pets/ +├── .env # Учётные данные (не в git) +├── .env.example # Шаблон .env +├── pytest.ini # Конфигурация pytest +├── requirements.txt # Зависимости +│ +└── tests/ + ├── conftest.py # Глобальные фикстуры (browser_page, bp_state) + ├── testdata/ + │ └── generators.py # Генераторы случайных данных по ФЛК + │ + ├── 01_vetdept/ # ЛК: Управление ветеринарии + │ ├── conftest.py # fixtures_dir, shared_state + │ ├── fixtures/ # Статические артефакты (фото, PDF) + │ └── BP01_navigation/ # Бизнес-процесс 01 + │ └── test_bp01_navigation.py + │ + └── 02_vetstation/ # ЛК: Ветеринарная станция + ├── conftest.py + ├── fixtures/ + └── BP01_dashboard/ # Бизнес-процесс 01 + └── test_bp01_dashboard.py +``` + +**Иерархия тестов:** Проект → ЛК (роль) → БП (`BP01_...`) → Шаги (`test_s01_...`, `test_s02_...`) + +--- + +## Быстрый старт + +### 1. Клонировать репозиторий + +```powershell +git clone +cd e2e_Pets +``` + +### 2. Создать виртуальное окружение и установить зависимости + +```powershell +python -m venv venv +.\venv\Scripts\pip.exe install -r requirements.txt +.\venv\Scripts\playwright.exe install chromium +``` + +### 3. Настроить учётные данные + +```powershell +Copy-Item .env.example .env +# Открыть .env и заполнить логины/пароли +``` + +--- + +## Запуск тестов + +> Все команды выполняются из корня проекта (`e2e_Pets/`). +> HTML-отчёт автоматически создаётся в `html-report/report.html`. + +--- + +### Запустить ВСЕ тесты + +```powershell +.\venv\Scripts\pytest.exe +``` + +--- + +### Запустить тесты конкретного ЛК (роли) + +```powershell +# ЛК Управление ветеринарии +.\venv\Scripts\pytest.exe tests/01_vetdept/ + +# ЛК Ветеринарная станция +.\venv\Scripts\pytest.exe tests/02_vetstation/ +``` + +--- + +### Запустить конкретный бизнес-процесс + +```powershell +# BP01 навигации в ЛК Управление ветеринарии +.\venv\Scripts\pytest.exe tests/01_vetdept/BP01_navigation/ + +# BP01 дашборда в ЛК Ветеринарная станция +.\venv\Scripts\pytest.exe tests/02_vetstation/BP01_dashboard/ +``` + +--- + +### Запустить конкретный шаг + +```powershell +# Только шаг 3 из BP01 ветстанции +.\venv\Scripts\pytest.exe tests/02_vetstation/BP01_dashboard/ -k "s03" + +# Только шаги 1 и 2 +.\venv\Scripts\pytest.exe tests/02_vetstation/BP01_dashboard/ -k "s01 or s02" +``` + +--- + +### Полезные флаги + +| Флаг | Описание | +|---|---| +| `-v` | Подробный вывод с именами шагов | +| `--headed` | Показывать браузер (по умолчанию включён в `pytest.ini`) | +| `--headless` | Запустить без браузера (быстрее) | +| `--slowmo 500` | Замедление действий на 500мс (для отладки) | +| `-k "BP01"` | Запустить только тесты содержащие "BP01" в имени | +| `--co -q` | Только показать список тестов без запуска | + +```powershell +# Показать список всех тестов (без запуска) +.\venv\Scripts\pytest.exe --co -q + +# Запустить без браузера и без замедления +.\venv\Scripts\pytest.exe --headless --slowmo 0 + +# Запустить в headless-режиме только vetdept +.\venv\Scripts\pytest.exe tests/01_vetdept/ --headless --slowmo 0 +``` + +--- + +## Создание нового теста + +### Нужен новый бизнес-процесс? + +Опиши его в свободной форме — например: + +> *«Нужен тест для ветстанции: открыть список животных, применить фильтр +> по кошкам, убедиться что список отфильтровался, открыть карточку +> первого животного, проверить наличие кнопки редактирования»* + +ИИ-ассистент создаст файл в нужном месте, следуя архитектуре проекта. + +--- + +### Если хочешь создать вручную — шаблон: + +#### 1. Создать папку бизнес-процесса + +```powershell +# Для роли vetstation, новый бизнес-процесс BP02 +mkdir tests\02_vetstation\BP02_animals +New-Item tests\02_vetstation\BP02_animals\__init__.py +``` + +#### 2. Создать файл теста + +Имя файла: `test_bp02_<название>.py` + +```python +import os +import pytest +from playwright.sync_api import Page, expect + +BASE_URL = os.getenv("BASE_URL", "https://vet.goznak.ru") + + +@pytest.mark.vetstation # <- маркер роли +@pytest.mark.usefixtures("browser_page") # <- авторизация и браузер +class TestBP02Animals: + """ + BP02: Краткое описание бизнес-процесса + + Проверяет что пользователь может: + - Шаг 1: ... + - Шаг 2: ... + """ + + @pytest.mark.dependency(name="BP02::s01") + def test_s01_<название>(self, browser_page: Page, bp_state: dict): + """Шаг 1: Описание шага — именно это появится в отчёте""" + # ... код теста ... + bp_state["key"] = "value" # передать данные следующему шагу + + @pytest.mark.dependency(name="BP02::s02", depends=["BP02::s01"]) + def test_s02_<название>(self, browser_page: Page, bp_state: dict): + """Шаг 2: Описание шага""" + value = bp_state["key"] # получить данные от предыдущего шага + # ... код теста ... +``` + +#### 3. Правила именования + +| Элемент | Формат | Пример | +|---|---|---| +| Папка БП | `BP_<описание>` | `BP02_animals` | +| Файл теста | `test_bp_<описание>.py` | `test_bp02_animals.py` | +| Класс | `TestBP<Описание>` | `TestBP02Animals` | +| Метод (шаг) | `test_s_<описание>` | `test_s01_open_list` | +| Зависимость | `BP::s` | `BP02::s01` | + +#### 4. Маркеры ролей + +| Маркер | Роль | +|---|---| +| `@pytest.mark.vetdept` | Управление ветеринарии | +| `@pytest.mark.vetstation` | Ветеринарная станция | +| `@pytest.mark.prefecture` | Администрация (префектура) | + +--- + +## Добавление генератора данных (ФЛК) + +Файл: [`tests/testdata/generators.py`](tests/testdata/generators.py) + +Содержит пошаговое руководство по добавлению нового генератора прямо в начале файла. Коротко: + +```python +# Шаблон новой функции-генератора: + +def gen_<сущность>_<поле>() -> str: + """ + Краткое описание. + + ФЛК: + - Правило 1 + - Правило 2 + + Пример вывода: 'AB1234' + """ + # ... реализация ... +``` + +Использование в тесте: + +```python +from tests.testdata.generators import gen_microchip, gen_animal_name + +def test_s01_fill_form(self, browser_page, bp_state): + name = gen_animal_name() + chip = gen_microchip() + browser_page.fill("#name", name) + browser_page.fill("#chip", chip) + bp_state["name"] = name # передаём следующему шагу +``` + +--- + +## Добавление статического артефакта + +1. Положи файл в папку `fixtures/` нужной роли: + ``` + tests/01_vetdept/fixtures/images/cat_photo.jpg + ``` + +2. Раскомментируй шаблон фикстуры в `tests/<роль>/conftest.py`: + ```python + @pytest.fixture(scope="session") + def cat_photo(fixtures_dir) -> Path: + """Фото кошки для теста загрузки.""" + return fixtures_dir / "images" / "cat_photo.jpg" + ``` + +3. Используй в тесте: + ```python + def test_s02_upload(self, browser_page, bp_state, cat_photo): + browser_page.set_input_files("input[type=file]", str(cat_photo)) + ```