24. modulE2E-tesztelés, i18n és SEO
Cloudflare for Devs · 24. modul — záró kiegészítés

E2E-tesztelés, i18n és SEO

Három kisebb, de valós téma, ami eddig kimaradt: hogyan tesztelsz végponttól végpontig a PR-preview URL-ek ellen, mire figyelj a többnyelvűségnél az edge-en, és mi változik a keresőoptimalizálásban, ha SSR-ből szolgálsz ki.

24.1E2E-tesztelés a preview URL-ek ellen

A 11. modulban a unit- és integrációs tesztelést néztük (Vitest a workerd-ben). Ami hiányzott: a böngészős, végponttól végpontig tartó teszt. Itt viszont a Cloudflare-modell egy komoly előnyt ad: a 8. modulból tudod, hogy minden PR kap egy éles, futó preview URL-t — vagyis nem kell tesztkörnyezetet feltámasztani a CI-ban, csak rá kell mutatni a tesztet.

.github/workflows/e2e.yml (vázlat)
jobs:
  e2e:
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npx playwright install --with-deps chromium

      # a preview URL-t a Workers Builds / wrangler kimenetéből vagy a PR-kommentből kapod
      - run: npx playwright test
        env:
          BASE_URL: ${{ steps.preview.outputs.url }}
tests/e2e/login.spec.ts
import { test, expect } from "@playwright/test";

test("a felhasználó be tud lépni és látja a dashboardot", async ({ page }) => {
  await page.goto("/login");
  await page.getByLabel("Email").fill(process.env.TEST_USER!);
  await page.getByLabel("Jelszó").fill(process.env.TEST_PASSWORD!);
  await page.getByRole("button", { name: "Belépés" }).click();

  await expect(page.getByRole("heading", { name: "Áttekintés" })).toBeVisible();
});

A négy dolog, amit E2E-vel érdemes lefedni (és nem többet)

  1. Bejelentkezés és kijelentkezés — ha ez törik, minden törik (17. modul).
  2. A fő üzleti út („happy path"): a termék központi művelete, egyetlen folyamatban.
  3. A fizetési/előfizetési folyamat — a szolgáltató teszt-módjával.
  4. Tenant-izoláció: A tenant felhasználója nem látja B tenant adatát — ez a legfontosabb biztonsági teszted (17. modul), és böngészőből is érdemes ellenőrizni.
Két buktató a preview-alapú teszteléssel: ① a PR-preview-k közös staging erőforrásokon osztoznak (8. modul!), tehát a párhuzamosan futó E2E-tesztek összeakadhatnak — használj tesztfuttatásonként egyedi adatot (véletlen email-cím, saját tenant), és takaríts a végén; ha ez fáj, ott van a per-PR környezet (14. modul, Alchemy). ② Ha a preview URL-eket Cloudflare Access védi (9. modul), a CI-nak service tokent kell kapnia, különben a Playwright a login-oldalon köt ki.
És egy dolog, amit ne felejts: a Turnstile (22. modul) megakasztja az automatizált teszteket. Erre van hivatalos megoldás: teszt-kulcsok, amik mindig sikeres (vagy mindig sikertelen) eredményt adnak — a nem-produkciós környezetekben ezt használd, ne kapcsold ki a védelmet a kódban feltételesen.

24.2Többnyelvűség (i18n) az edge-en

A Nuxt i18n-modulja ugyanúgy működik a Workersen, mint bárhol — a különbségek a kiszolgálás oldalán vannak:

KérdésAjánlott megoldásMiért
URL-sémapath-prefix: /hu/, /en/cache-barát (18. modul!), indexelhető, megosztható link
Nyelvfelismeréselőször a felhasználó mentett beállítása, aztán Accept-Language, végül az ország (request.cf.country)a cf objektum ingyen adja az országot — de az ország ≠ nyelv (CH, BE, CA)
Automatikus átirányításcsak a gyökérről (/), egyszer, és megjegyezvea minden oldalon újra-átirányítás rontja a SEO-t és bosszantja a felhasználót
Fordítási fájloka bundle része (statikusan importálva)nincs futásidejű fájlrendszer (2. modul); a lusta betöltés a kliensoldalon működik
Dátum/szám/pénzIntl APIa runtime beépítve hozza, nincs szükség nehéz könyvtárra (bundle-méret, 2. modul)
A klasszikus i18n + cache hiba: ha ugyanazon az URL-en szolgálsz ki magyar és angol tartalmat (a Accept-Language alapján), és az oldal cache-elhető, akkor az első látogató nyelve ragad be mindenkinek (18. modul). Ezért a path-prefix a helyes minta. Ha mégis fejléc-alapú megkülönböztetés kell, akkor a nyelvnek a cache-kulcs részévé kell válnia — és ez ugyanaz a hibaosztály, mint a tenant-keveredés.

24.3SEO SSR mellett

A jó hír: SSR-rel a keresőoptimalizálás alaphelyzete jó — a robot kész HTML-t kap, nem üres <div id="app">-t. Amire figyelj:

Egy Cloudflare-specifikus apróság: az Under Attack mód és az agresszív bot-védelem (22. modul) a keresőrobotokat is érintheti. A verifikált botokat a rendszer általában felismeri és átengedi, de ha saját, szigorú szabályt írsz (pl. „minden nem-magyar forgalom kap kihívást"), azzal kizárhatod a Googlebotot is. Ha SEO számít, a szabályaidnál mindig gondolj a robotokra — és ellenőrizd a Search Console-ban a lekérési hibákat.

24.4Ellenőrizd magad

  1. Miért egyszerűbb az E2E-tesztelés ezen a platformon, és mi a két buktatója?
    Válasz

    Mert minden PR kap egy éles, futó preview URL-t — nem kell tesztkörnyezetet feltámasztani a CI-ban. Buktatók: a preview-k közös staging erőforrásokon osztoznak (párhuzamos futások ütközhetnek → egyedi tesztadat és takarítás), és ha Access védi a preview-t, a CI-nak service token kell.

  2. Miért path-prefixes (/hu/) az ajánlott i18n-séma?
    Válasz

    Mert így a nyelv az URL része, tehát a cache-kulcs természetesen elválik (nem ragad be egy nyelv mindenkinek), a linkek megoszthatók, és a keresők külön indexelhetik a változatokat. Fejléc-alapú megkülönböztetésnél a nyelvnek a cache-kulcs részévé kell válnia.

  3. Mit kell mindenképp szerveroldalon generálni a SEO-hoz?
    Válasz

    A meta-adatokat (title, description, OG), a canonical URL-t, a hreflang-okat és a strukturált adatot (JSON-LD). Ha ezek kliensoldali JS-ből kerülnek be, a robot a generikus alapértelmezést látja.

  4. Hogyan tesztelsz olyan űrlapot, amit Turnstile véd?
    Válasz

    A hivatalos teszt-kulcsokkal, amik mindig sikeres (vagy mindig sikertelen) eredményt adnak nem-produkciós környezetben. Ne a kódban kapcsold ki feltételesen a védelmet — az a beállítás egyszer élesben is ott maradhat.

  5. Multitenant SaaS-nál miért fontos a canonical URL?
    Válasz

    Mert ugyanaz a tartalom több hoston is elérhető lehet (aldomain és az ügyfél custom domainje, 16. modul). A canonical mondja meg a keresőnek, melyik a hivatalos változat — enélkül duplikált tartalomként kezelheti.

Előző23. modul — Email: küldés, fogadás, kézbesíthetőség KövetkezőEz az utolsó modul