Opanuj automatyzację w Next.js App Router. Zobacz, jak testować procesy logowania, mockować zapytania API i wdrożyć testy wizualne w pipeline CI.
Maciej Sala
Founder StriveLab
5 min czytaniaOpublikowano 10 kwietnia 2026 (Aktualizacja 17 lipca 2026)
Dlaczego Playwright do testów E2E w Next.js App Router?
Dla Next.js App Router z Server Components Playwright jest rozsądnym domyślnym wyborem. Testuje renderowany HTML po streamingu, nawigację, formularze i interakcje. sam czeka na gotowość elementów, więc nie musisz rozsiewać po testach sztucznych opóźnień.
Projekt setup i testy uwierzytelnione są dodawane tylko wtedy, gdy ustawisz oba sekrety E2E_USER_EMAIL i E2E_USER_PASSWORD. Dzięki temu zwykłe npx playwright test nie wymaga konta E2E, a CI może osobno uruchamiać zestaw uwierzytelniony ze zmiennymi z magazynu sekretów.
fullyParallel pozwala równoleglić także testy z jednego pliku, ale workers: 1 wyłącza realną współbieżność na CI. To celowy kompromis na małym współdzielonym runnerze, nie optymalizacja szybkości. Jeśli testy są izolowane i runner ma zasoby, zwiększ liczbę workerów; przy większym zestawie użyj shardingu między jobami. Retry nie jest naprawą niestabilnego testu. Raportuj testy oznaczone jako flaky i usuwaj ich przyczynę.
Build produkcyjny lepiej odwzorowuje zachowanie App Routera niż next dev, ale wydłuża lokalną pętlę. reuseExistingServer pozwala użyć uruchomionego wcześniej serwera. Ustaw dla testów osobną bazę i zmienne środowiskowe, aby E2E nigdy nie zapisywały danych produkcyjnych.
W architekturze App Router nie należy bezwarunkowo polegać na statusie HTTP 404: jeśli odpowiedź rozpoczęła już streaming, wywołanie notFound() może zwrócić poprawny wizualnie widok błędu ze statusem 200. Z tego powodu test E2E powinien weryfikować docelowy widok interfejsu, natomiast status HTTP warto sprawdzać osobno, wyłącznie dla ścieżek, które gwarantują brak wcześniejszego streamingu.
Pamiętaj, aby dodać katalog playwright/.auth do pliku .gitignore. Ponieważ plik storageState przechowuje ciasteczka oraz nagłówki umożliwiające przejęcie konta testowego, nie wolno go commitować nawet do prywatnego repozytorium. Taki wspólny stan sprawdza się wyłącznie w przypadku testów tylko do odczytu; jeśli scenariusze modyfikują profil, zawartość koszyka lub uprawnienia, należy przydzielić osobne konto dla każdego workera albo wygenerować dane za pomocą kontrolowanego API testowego.
page.route i browserContext.route działają na ruchu widzianym przez przeglądarkę. Nie przechwycą fetch wykonanego podczas renderowania Server Component przez proces Node.js uruchomiony w webServer. Taki scenariusz testuj z kontrolowanym backendem lub bazą E2E, seedem danych albo zależnością podmienianą konfiguracją serwera. Nie mockuj prywatnego protokołu Server Actions. Sprawdzaj zachowanie formularza przeciwko testowemu środowisku aplikacji.
Jeśli routing nie widzi requestów obsługiwanych przez Service Workera, ustaw dla danego projektu serviceWorkers: 'block' albo użyj browserContext.route zgodnie z architekturą aplikacji. Mock powinien być zarejestrowany przed akcją, która inicjuje żądanie; przy fetchu wykonywanym podczas ładowania strony oznacza to przed page.goto().
Visual regression testing w Playwright
porównuje
render strony z zapisanym wcześniej wzorcem i wyłapuje wizualne regresje, które
przejdą niezauważone przez testy sprawdzające tylko treść:
Przy pierwszym uruchomieniu Playwright generuje obrazy referencyjne, a przy kolejnych porównuje aktualny wynik z bazą i zgłasza błąd, jeśli różnica przekracza ustalony próg. Unikaj stosowania networkidle jako sygnału gotowości, ponieważ Playwright odradza tę strategię w testach automatycznych. Zamiast tego czekaj na konkretny stan interfejsu za pomocą asercji typu web-first, a zmienne elementy, takie jak czas, losowe treści czy reklamy, stabilizuj lub maskuj na czas testu.
Aktualizacja screenshotów po celowej zmianie UI:
Code
npx playwright test --update-snapshots
Wyniki testów wizualnych zależą od systemu operacyjnego, silnika przeglądarki, fontów oraz środowiska renderowania. Aby uniknąć fałszywych alarmów, generuj i porównuj obrazy referencyjne w tym samym kontenerze lub środowisku CI, rezygnując z ich automatycznej aktualizacji po nieudanym teście. Nowe snapshoty powinny zawsze trafiać do code review, ponieważ zbyt wysoki próg tolerancji może równie skutecznie ukryć realną regresję graficzną, co wyeliminować zakłócenia.
Playwright tworzy nowy BrowserContext dla każdego testu, więc cookies i local storage są izolowane. Nie izoluje jednak bazy danych, kolejki ani skrzynki e-mail. Każdy test powinien tworzyć własne rekordy z unikalnym identyfikatorem i usuwać je po zakończeniu albo pracować na bazie resetowanej między przebiegami. Nie buduj scenariusza, w którym jeden test zakłada dane utworzone przez poprzedni.
Wspólne konto jest bezpieczne dla równoległych testów tylko wtedy, gdy nie modyfikują tego samego stanu. Dla operacji zapisu przydziel konto per worker lub seeduj użytkownika przez chronione API dostępne wyłącznie w środowisku E2E. test.describe.serial zostaw dla rzeczywiście nierozdzielnych scenariuszy. Serializacja zwykle maskuje brak izolacji i pogarsza czas wykonania oraz retry.
Szybki projekt Chromium może blokować pull request, a pełną macierz Chromium/Firefox/WebKit i visual regression możesz uruchamiać nocą lub przed wydaniem. Sekrety kont E2E trzymaj w magazynie sekretów CI, ogranicz ich uprawnienia i kieruj testy wyłącznie do izolowanego środowiska. Przy dużym zestawie dziel testy przez --shard=N/M; raporty z shardów można połączyć przez blob reporter.
Tyle, żeby pokryć krytyczne ścieżki i najważniejsze granice integracji. Nie ma uniwersalnej liczby. Logowanie, główny proces biznesowy, formularz kontaktowy i podstawowa nawigacja często tworzą dobry zestaw startowy. Liczbę testów dobieraj do ryzyka i częstotliwości zmian, a przypadki brzegowe pokrywaj tańszymi testami jednostkowymi i integracyjnymi.
Jak przyspieszyć testy E2E?
Najpierw usuń zależności między testami i przygotuj dane per worker. reuseExistingServer może wykorzystać lokalnie działającą aplikację, a Chromium wystarcza do szybkiego smoke suite na pull requestach. Playwright zaleca jeden worker na typowym CI dla stabilności; większe zestawy lepiej dzielić na shardy lub uruchamiać równolegle na odpowiednio mocnym runnerze. page.route przyspiesza tylko żądania wykonywane przez przeglądarkę. Nie mockuje zapytań Server Components wykonywanych przez proces Next.js.
Playwright czy Cypress w 2026?
Wybór odpowiedniego narzędzia do testów E2E zależy od specyficznych potrzeb zespołu, ponieważ zarówno Playwright, jak i Cypress sprawdzają się w tej roli. Playwright oferuje wbudowane wsparcie dla Chromium, Firefox i WebKit, izolowane konteksty przeglądarki, zaawansowany tracing oraz wygodną obsługę wielu kart i ról użytkowników. Z kolei Cypress może okazać się lepszym wyborem dla zespołów, które dobrze znają jego ekosystem i preferowany sposób debugowania. Niezależnie od wybranej technologii, samo narzędzie nie gwarantuje szybkości ani stabilności, ponieważ o sukcesie decyduje właściwa izolacja danych, przemyślane selektory oraz solidna architektura testów.
Jak testować zalogowane widoki bez przeklikiwania loginu?
Najczęściej przez projekt setup, który loguje konto testowe i zapisuje storageState, a projekty zależne uruchamiają izolowane konteksty z tym stanem. Plik może zawierać cookies i nagłówki pozwalające przejąć sesję, więc umieść playwright/.auth w .gitignore. W sytuacji, gdy testy równolegle modyfikują dane konta, użyj osobnego konta lub stanu per worker.
Jak działa visual regression w Playwright?
Przy pierwszym uruchomieniu toHaveScreenshot zapisuje zrzut ekranu jako referencję. Przy kolejnych przebiegach Playwright robi nowy zrzut i porównuje go z referencyjnym piksel po pikselu; jeśli różnica przekracza ustalony próg (np. maxDiffPixelRatio), test failuje. To skutecznie wyłapuje niezamierzone zmiany w CSS i układzie. Po celowej zmianie wyglądu aktualizujesz referencje komendą npx playwright test --update-snapshots, a zmiany obrazów przeglądasz tak samo jak kod.
O autorze
Maciej Sala
Maciej Sala — Product Manager i Frontend Developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwijam własne projekty.
Dogłębne porównanie Cypress i Playwright w kontekście projektów Next.js. doświadczenie deweloperskie, szybkość, wsparcie dla SSR i React – który framework testowy wybrać?
Maciej Sala
Founder StriveLab
Jedna linijka w niewłaściwym miejscu — , która miała zostać tylko na środowisku testowym — i strona znika z Google na tygodnie. To jeden z najdroższych błędów w SEO technicznym, ponieważ długo pozostaje niewidoczny: build przechodzi, strona działa, użytkownicy niczego nie zauważają, a ruch organiczny po cichu się osuwa. Dobra wiadomość jest taka, że tę klasę błędów da się złapać automatycznie, zanim kod w ogóle trafi na produkcję. W tym artykule pokazuję, jak zbudować testy regresji SEO w Playwright i wpiąć je w GitHub Actions , żeby pull request z zepsutym linkiem kanonicznym czy przypadkowym noindexem po prostu nie przeszedł.
Maciej Sala
Founder StriveLab
Od instalacji, przez fixtures i custom commands, po integrację z GitHub Actions. Kompletny przewodnik po konfiguracji testów E2E Cypress w projekcie Next.js z App Router.