E2E və Django test klienti

Django-nun test Client-i view-nu birbaşa çağırır: brauzer, JavaScript və real HTTP yoxdur (Django testlərinin əsasları, pytest-django qurulumu). Bu sürətlidir və yoxlamaların çoxu üçün kifayətdir. E2E test real brauzerdən istifadə edir, ona görə marşrutun, şablonun, CSRF tokenin, sessiyanın, statik faylların və JavaScript-in birlikdə işlədiyini də sübut edir.

Test klientiPlaywright ilə E2E
İşlədirview-nu proses daxilindəChromium + Django, HTTP ilə
JavaScript, HTMXyoxdurvar
Sürətmillisaniyələrsaniyələr
Nə üçünməntiq, icazələr, yönləndirmələrkritik yollar: giriş, sifariş, ödəniş

💡 Hər kritik ssenari üçün bir E2E test yazın, təfərrüatları test klientinə qoyun. Brauzer testlərini @pytest.mark.e2e ilə işarələyin ki, gündəlik işə salma onları keçə bilsin.

Quraşdırma

pytest-django live_server fikstürünü, pytest-playwright isə page, context və browser fikstürlərini verir:

text
pip install pytest-django pytest-playwright
playwright install chromium

# pyproject.toml
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "config.settings.test"
markers = ["e2e: slow browser tests"]

# run only the browser tests, with a visible browser
pytest -m e2e --headed

playwright install chromium brauzeri bir dəfə yükləyir. Susmaya görə rejim headless-dir; --headed pəncərəni göstərir və testi ilk dəfə yazanda kömək edir.

live_server və ilk test

live_server Django-nu boş portda ayrıca axında qaldırır və live_server.url verir. Test axını Playwright-ı idarə edir, Playwright Django ilə HTTP vasitəsilə danışır, hər iki tərəf eyni test bazasından istifadə edir.

live_server: bir proses, iki axın
live_server: bir proses, iki axın
python
import re

import pytest
from playwright.sync_api import Page, expect

pytestmark = pytest.mark.e2e

def test_login_shows_dashboard(live_server, page: Page, user):
    page.goto(f"{live_server.url}/accounts/login/")
    page.get_by_label("Username").fill("ann")
    page.get_by_label("Password").fill("secret123")
    page.get_by_role("button", name="Sign in").click()

    expect(page).to_have_url(re.compile(r"/dashboard/$"))
    expect(page.get_by_role("heading", name="Dashboard")).to_be_visible()

Üç vərdiş testi sabit edir: