Когда тесты — это не про тестирование, а про ожидание
Привет, тестировщики и кодеры! Представь: пишешь автотесты для UX, всё красиво, запускаешь — и каждый тест начинает с нуля: логин, пароль, кнопка. Как будто у тестов амнезия! Это бесит, тормозит и превращает код в копипасту. Давай разберёмся, как выкинуть повторный логин на свалку и ускорить всё с Playwright и Python.
Почему повторная авторизация — зло
Повторная авторизация в тестах — это как если бы ты каждый раз, входя в дом, заново представлялся своей собаке. Вот что бесит:
Тормоза: Каждый логин — это + ~5 секунд к тесту. Умножь на 100 тестов, и ты уже варишь кофе, пока они ползут.
Код — помойка: Пихать шаги логина в каждый тест — это как копипастить «Hello, World!» в каждый файл. Ну такое.
Короче, жить так нельзя. И не будем. Playwright и немного магии Python нам в помощь.
Решение: один контекст на всех
В Playwright есть такая штука, как контекст браузера. Это типа твоя сессия, где хранятся куки, localStorage и прочие вкусности. Идея простая — авторизуемся один раз в общем контексте, а потом пускаем все тесты пастись в нём, как в общем пастбище. Никаких лишних логинов, всё летает, все счастливы.
Но мы не просто сделаем общий контекст, мы добавим гибкости: если тестам нужна авторизация — берём общий контекст, если нет — новый. А чтобы не запутаться, замутим декоратор @use_session, который будет говорить: «Эй, этот тест хочет в общий котёл!» Погружаемся в код.
Как это сделать: фикстуры и код
Шаг 1: Фикстуры — наше всё
В conftest.py мы настроим фикстуры, чтобы они работали как швейцарские часы. Что нам нужно:
Общий контекст: Один на всю сессию, с авторизацией.
Новый контекст: Для тестов, где авторизация не нужна.
Фикстура page: Умная штука, которая сама решает, какой контекст подсунуть, глядя на декоратор.
Фикстура authorize: Логинится раз и всё.
Шаг 2: Декоратор @use_session
Просто метка для классов тестов или отдельных тестов. Если она есть — тест бежит в общий контекст, если нет — в новый. Всё, никаких лишних движений.
Шаг 3: Пишем тесты
Ставишь @use_session на класс/тест — и тесты используют общую сессию. Не ставишь — тест крутится в своём песочнице. Просто и красиво.
Пример conftest.py
import allure
import pytest
from playwright.sync_api import sync_playwright
from src.pages.auth_page import AuthPage
from src.pages.landing_page import LandingPage
def use_session(cls):
cls.use_session = True
return cls
@pytest.fixture(scope="session")
def playwright():
with sync_playwright() as p:
yield p
@pytest.fixture(scope="session")
def browser(playwright):
browser = playwright.chromium.launch(headless=True)
yield browser
browser.close()
@pytest.fixture(scope="session")
def shared_context(browser, authorize):
context = browser.new_context()
yield context
context.close()
@pytest.fixture(scope="function")
def new_context(browser):
context = browser.new_context()
yield context
context.close()
@pytest.fixture(scope="function")
def page(request, new_context, shared_context, domain):
context = shared_context if hasattr(request.cls, "use_session") else new_context
page = context.new_page()
page.goto(domain, wait_until="load", timeout=3000)
yield page
page.close()
@pytest.fixture(scope="session", autouse=True)
def authorize(shared_context, domain):
page = shared_context.new_page()
page.goto(domain, wait_until="load", timeout=3000)
with allure.step("Авторизуемся один раз и навсегда"):
landing = LandingPage(page, domain)
landing.open()
landing.click_login_button()
auth = AuthPage(page, domain)
auth.fill_login("testuser@example.com")
auth.fill_password("supersecret")
auth.click_submit()
page.close()
Что тут творится:
shared_context: Живёт всю сессию, авторизация в нём делается один раз.
new_context: Новый для каждого теста, если общий не нужен.
page: Смотрит на класс теста и решает, какой контекст брать.
authorize: Залогинились один раз — и всё, можно курить бамбук.
Пример test.py
Вот тебе пример теста. Представь, что мы проверяем страницу с котиками после авторизации.
import allure
import pytest
from conftest import use_session
from src.pages.cat_page import CatPage
@use_session
class TestCatPage:
@allure.title("Проверяем, что котики на месте")
def test_check_cats(self, page, domain):
cats = CatPage(page, domain)
cats.open()
assert cats.count_cats() > 0, "Где котики? Я требую котиков!"
Тут мы просто открываем страницу и проверяем, что котики на месте. Логин? Какой логин? Он уже в прошлом!
Почему это хорошо:
Скорость: Тесты бегут, как спринтеры.
Гибкость: Хочешь с логином, хочешь без — всё под контролем.
Код чистый: Никаких копипастов с шагами авторизации.
Итог
Вот и всё. Теперь твои тесты не будут тратить время на вечные логины. Playwright, Python и немного хитрости — это всё что нам потребовалось. Если что-то не зашло или есть идеи, пиши в комменты, обсудим. Удачи и быстрых тестов!