Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Zurück in den Browser – Das Comeback der Fronte...

Zurück in den Browser – Das Comeback der Frontend-Tests

Testing-Tools für moderne Frontend-Frameworks rüsten auf – und verlagern ihre Tests wieder in den Browser.

Lange galt: Ohne Browser ist es schneller. Gilt das heute nicht mehr – oder gibt es andere Gründe?

In diesem Talk geht es genau um diese Frage – und um zwei aktuelle Vertreter, die unterschiedliche Wege zeigen: den Vitest Browser Mode und Testronaut.

Avatar for Rainer Hahnekamp

Rainer Hahnekamp

November 23, 2025
Tweet

More Decks by Rainer Hahnekamp

Other Decks in Technology

Transcript

  1. About Me... https://www.youtube.com/ @RainerHahnekamp https://www.ng-news.com • Rainer Hahnekamp • ANGULARarchitects.io

    • NgRx Core Team • Developer / Trainer / Speaker @RainerHahnekamp Open Source Projects NgRx Toolkit Testronaut NgRx Sheriff
  2. RainerHahnekamp Why Browser? ✅ Real Browser Behavior • Rendering •

    User Events • Timings (Signals) • New Technologies (Shadow DOM, Hydration) ✅ Switch to "UI is the API" ✅ Performant Headless Browsers ✅ Visualization (DX)
  3. RainerHahnekamp test('🚀', async ({ page }) => { await page.goto('/')

    await page.getByRole(...).click(); await expect(...).toBeVisible() });
  4. RainerHahnekamp test('🚀', async ({page,runInBrowser})=>{ await runInBrowser(() => { TestBed.createComponent(...); });

    await page.getByRole(...).click(); await expect(...).toBeVisible() }); Angular Dev Server
  5. RainerHahnekamp test('🚀', async ({page,runInBrowser})=>{ await runInBrowser(() => { TestBed.createComponent(...); });

    await page.getByRole(...).click(); await expect(...).toBeVisible() }); TestBed.createComponent(...); Angular Dev Server
  6. RainerHahnekamp import { Spaceship } from './spaceship'; test('🚀', async ({

    mount, page }) => { await mount(Spaceship); await page.getByRole(...).click(); });
  7. RainerHahnekamp import { Spaceship } from './spaceship'; test('🚀', async ({

    runInBrowser, page }) => { await runInBrowser(() => { TestBed.createComponent(Spaceship); }); await page.getByRole(...).click(); });
  8. RainerHahnekamp import { Spaceship } from './spaceship'; test('🚀', async ({

    runInBrowser, page }) => { await runInBrowser(() => { TestBed.createComponent(Spaceship); }); await page.getByRole(...).click(); });
  9. RainerHahnekamp test('🚀', async ({ page }) => { await page.evaluate(()

    => mountSpaceship()); await page.getByRole(...).click(); }); import { Spaceship } from './spaceship'; globalThis.mountSpaceship = () => { TestBed.createComponent(Spaceship); };