Реструктурированы тесты под иерархию Проект > Личный кабинет > БП > Шаги. Архитектура: - Бизнес-процесс = Python-класс, шаг = метод класса - Шаги именуются test_s01_*, test_s02_* и т.д. - БП именуются BP01_, BP02_ и т.д., каждый в своей папке Передача данных: - browser_page (scope=class) — один браузер на весь БП, авторизация 1 раз - bp_state (scope=class) — словарь для передачи данных между шагами одного БП - shared_state (scope=session) — словарь для передачи между разными БП Зависимости шагов (pytest-dependency): - Если шаг N упал, шаги N+1... получают статус SKIPPED автоматически - Имена зависимостей: BP01::s01, BP01::s02 и т.д. Изменения файлов: - tests/conftest.py: добавлены browser_page и bp_state, вынесены вспомогательные функции _get_role и _login, сохранена role_page (deprecated) для обратной совместимости - tests/01_vetdept/conftest.py: новый, содержит shared_state - tests/01_vetdept/BP01_navigation/: новая папка с тестом навигации - tests/01_vetdept/001_login_test.py: удалён (переписан в BP01) - requirements.txt: добавлен pytest-dependency - pytest.ini: добавлен маркер dependency
57 lines
2.5 KiB
Python
57 lines
2.5 KiB
Python
import os
|
||
import pytest
|
||
# pyrefly: ignore [missing-import]
|
||
from playwright.sync_api import Page, expect
|
||
|
||
BASE_URL = os.getenv("BASE_URL", "https://vet.goznak.ru")
|
||
|
||
|
||
@pytest.mark.vetdept
|
||
@pytest.mark.usefixtures("browser_page")
|
||
class TestBP01Navigation:
|
||
"""
|
||
BP01: Навигация по разделам портала
|
||
|
||
Проверяет что пользователь с ролью 'Управление Ветеринарии' может:
|
||
- Открыть главную страницу (Dashboard)
|
||
- Видеть заголовок своей организации
|
||
- Перейти в раздел Организации
|
||
- Перейти в раздел Заявки на отлов
|
||
"""
|
||
|
||
@pytest.mark.dependency(name="BP01::s01")
|
||
def test_s01_open_dashboard(self, browser_page: Page, bp_state: dict):
|
||
"""Шаг 1: Открыть главную страницу (Dashboard)"""
|
||
browser_page.goto(BASE_URL + "/dashboard")
|
||
expect(browser_page).to_have_url(BASE_URL + "/dashboard")
|
||
bp_state["start_url"] = browser_page.url
|
||
|
||
@pytest.mark.dependency(name="BP01::s02", depends=["BP01::s01"])
|
||
def test_s02_check_org_header(self, browser_page: Page, bp_state: dict):
|
||
"""Шаг 2: Проверить заголовок организации в интерфейсе"""
|
||
expect(browser_page.locator("#app")).to_contain_text(
|
||
"Управление Ветеринарии Гознак"
|
||
)
|
||
|
||
@pytest.mark.dependency(name="BP01::s03", depends=["BP01::s02"])
|
||
def test_s03_go_to_organizations(self, browser_page: Page, bp_state: dict):
|
||
"""Шаг 3: Перейти в раздел Организации"""
|
||
browser_page.get_by_role("link", name="Организации").click()
|
||
expect(browser_page).to_have_url(
|
||
BASE_URL + "/organizations", timeout=10000
|
||
)
|
||
expect(
|
||
browser_page.get_by_text("Подведомственные организации")
|
||
).to_be_visible(timeout=10000)
|
||
|
||
@pytest.mark.dependency(name="BP01::s04", depends=["BP01::s03"])
|
||
def test_s04_go_to_claims(self, browser_page: Page, bp_state: dict):
|
||
"""Шаг 4: Перейти в раздел Заявки на отлов"""
|
||
browser_page.get_by_role("link", name="Заявки на отлов").click()
|
||
expect(browser_page).to_have_url(
|
||
BASE_URL + "/claims-list", timeout=10000
|
||
)
|
||
expect(browser_page.get_by_text("Мои заявки")).to_be_visible(
|
||
timeout=10000
|
||
)
|