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 klienti | Playwright ilə E2E | |
|---|---|---|
| İşlədir | view-nu proses daxilində | Chromium + Django, HTTP ilə |
| JavaScript, HTMX | yoxdur | var |
| Sürət | millisaniyələr | saniyələr |
| Nə üçün | məntiq, icazələr, yönləndirmələr | kritik 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.e2eilə 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:
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 --headedplaywright 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.
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: