Jak obsługiwać authentication state w Playwright | Logowanie i storageState

Jedna z pierwszych rzeczy, które zaczynają irytować przy większych projektach w Playwright, to ciągłe logowanie użytkownika przed każdym testem.

Na początku zwykle wygląda to tak:

  • otwieramy stronę,
  • wpisujemy login,
  • wpisujemy hasło,
  • klikamy „Login”,
  • czekamy,
  • dopiero wtedy zaczynamy właściwy test.

Przy kilku testach jeszcze da się z tym żyć. Problem zaczyna się wtedy, gdy:

  • mamy kilkadziesiąt albo kilkaset testów,
  • testy uruchamiają się równolegle,
  • logowanie trwa kilka sekund,
  • środowisko zaczyna być niestabilne,
  • testy robią się flaky.

W praktyce bardzo szybko okazuje się, że większość czasu nie tracimy na testowanie aplikacji, tylko na… samo logowanie.

I właśnie tutaj wchodzi authentication state.

playwright wpis

Czym właściwie jest authentication state?

Playwright pozwala zapisać aktualny stan sesji użytkownika do pliku.

Mówiąc prościej:

  • logujemy się raz,
  • Playwright zapisuje cookies i local storage,
  • później kolejne testy korzystają już z gotowej sesji.

Dzięki temu:

  • testy są szybsze,
  • stabilniejsze,
  • prostsze,
  • nie trzeba powielać logowania w każdym teście.

To jedna z tych rzeczy, które na początku wydają się „opcjonalne”, ale przy większym frameworku praktycznie stają się obowiązkowe.

Najprostsze podejście — zapisanie sesji do pliku

Najczęściej robię to w osobnym pliku, np. auth.setup.ts.

📘
auth.setup.ts
import { test as setup, expect } from '@playwright/test';

setup('authenticate', async ({ page }) => {
  await page.goto('https://example.com/login');

  await page.getByLabel('Email').fill('test@test.com');
  await page.getByLabel('Password').fill('password123');

  await page.getByRole('button', { name: 'Login' }).click();

  await expect(page).toHaveURL('https://example.com/dashboard');

  await page.context().storageState({
    path: 'playwright/.auth/user.json'
  });
});

Po wykonaniu tego setupu Playwright zapisze:

  • cookies,
  • localStorage,
  • session data.

Do zwykłego pliku JSON.

Jak używać zapisanej sesji?

Później wystarczy dodać storageState w konfiguracji.

📘
storageState.ts
use: {
  storageState: 'playwright/.auth/user.json'
}

I gotowe.

Każdy test startuje już jako zalogowany użytkownik.

Bez:

  • wpisywania loginu,
  • wpisywania hasła,
  • klikania formularzy,
  • czekania na redirecty.

Przy większych projektach różnica w czasie wykonywania testów potrafi być naprawdę ogromna.

Dlaczego to jest dużo lepsze niż logowanie w beforeEach?

Wiele osób robi coś takiego:

📘
test.beforeEach(async ({ page }) => {
  await login(page);
});

Technicznie działa.

Ale przy większej liczbie testów:

  • robi się wolno,
  • backend dostaje setki logowań,
  • testy zaczynają się wywalać,
  • auth bywa rate limitowany,
  • pojawiają się problemy z timeoutami.

Authentication state eliminuje większość tych problemów.

Uwaga na wygasające sesje

I tutaj pojawia się rzecz, o której początkujący często zapominają.

Jeśli token albo sesja wygasa:

  • zapisany storageState przestaje działać,
  • testy nagle zaczynają być niezalogowane.

Dlatego dobrym podejściem jest:

  • generowanie nowego auth state przed uruchomieniem testów,
  • albo odświeżanie sesji automatycznie.

Osobne sesje dla różnych użytkowników

W realnych projektach często mamy więcej niż jednego użytkownika.

Np:

  • admin,
  • manager,
  • zwykły user,
  • read-only user.

I wtedy można przygotować kilka auth state.

📘
playwright/.auth/admin.json
playwright/.auth/user.json
playwright/.auth/manager.json

A później używać ich zależnie od testu.

📘
test.use({
  storageState: 'playwright/.auth/admin.json'
});

To bardzo wygodne przy testowaniu uprawnień i ról.

Authentication state a testy równoległe

To też ważny temat.

Playwright działa bardzo dobrze równolegle, ale trzeba uważać, żeby:

  • testy nie nadpisywały sobie danych,
  • użytkownicy nie korzystali z tych samych rekordów,
  • backend nie blokował sesji.

Przy większych projektach często kończy się na:

  • osobnych użytkownikach testowych,
  • dynamicznych danych,
  • izolacji testów.

I to jest moment, w którym automatyzacja zaczyna przypominać normalny software engineering, a nie tylko „klikanie po UI”.

Czy authentication state ma jakieś wady?

Tak.

Nie zawsze warto go używać.

Np:

  • jeśli testujesz sam proces logowania,
  • MFA,
  • reset hasła,
  • SSO,
  • OAuth flow,
  • timeout sesji.

W takich przypadkach lepiej wykonać pełny login.

Authentication state najlepiej sprawdza się wtedy, gdy:

  • logowanie nie jest celem testu,
  • chcesz szybko przejść do właściwej funkcjonalności.

Podsumowanie

Authentication state to jedna z tych funkcji Playwrighta, która bardzo szybko zmienia sposób budowania frameworka testowego.

Na początku wydaje się małym usprawnieniem.

Ale kiedy liczba testów rośnie, nagle okazuje się, że:

  • testy wykonują się dużo szybciej,
  • framework jest stabilniejszy,
  • backend dostaje mniej requestów,
  • kod robi się prostszy,
  • a flaky tests pojawiają się dużo rzadziej.

I szczerze mówiąc — dzisiaj trudno mi sobie wyobrazić większy projekt Playwright bez dobrze ogarniętego authentication state.


 

pakiet premium