Help me bij het implementeren van geautomatiseerde frontend testing voor mijn webapplicatie
description
Met deze prompt krijg je gerichte hulp bij het opzetten van een betrouwbaar, geautomatiseerd frontend testproces dat de kwaliteit van je webapplicatie waarborgt. Dit helpt fouten vroegtijdig te detecteren, verbetert de gebruikerservaring en bespaart tijd door regressietests te automatiseren. De prompt biedt praktische handvatten voor toolkeuze, testmethoden en integratie, waardoor je efficiënter ontwikkelt dan met handmatige tests.
prompt
Help me bij het opzetten van een geautomatiseerd frontend testproces voor mijn webapplicatie. Beschrijf welke tools en frameworks ik kan gebruiken, hoe ik tests kan schrijven voor gebruikersinteracties, en hoe ik deze kan integreren in ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht om een geautomatiseerd frontend testproces op te zetten voor jouw React + TypeScript webwinkel, gericht op inlog- en registratieprocessen:
1. **Tools en Frameworks**
- **Testing Library (React Testing Library)**: Voor het testen van gebruikersinteracties en componentgedrag op een manier die lijkt op hoe gebruikers de app gebruiken.
- **Jest**: Als test runner en assertion library, goed geïntegreerd met React Testing Library.
- **Cypress**: Voor end-to-end (E2E) testen die het volledige inlog- en registratieproces simuleren, inclusief UI en API-interacties.
- **MSW (Mock Service Worker)**: Om API-verzoeken te mocken tijdens tests, waardoor je tests niet afhankelijk zijn van een backend.
2. **Tests schrijven voor gebruikersinteracties**
- **Unit- en componenttests (React Testing Library)**:
- Test dat de inlog- en registratieformulieren correct renderen.
- Controleer dat invoervelden correct werken.
- Simuleer gebruikersinteracties zoals typen, klikken en submitten.
- Test validatie en foutmeldingen.
- **E2E-tests (Cypress)**:
- Automatiseer het volledige proces van openen van de app, invoeren van gegevens, en controleren of de gebruiker succesvol inlogt of registreert.
- Test foutgevallen zoals onjuiste wachtwoorden of ontbrekende velden.
3. **Testvoorbeelden**
- **React Testing Library** (voorbeeld voor inlogformulier):
```typescript
import { render, screen, fireEvent } from '@testing-library/react';
import InlogFormulier from './InlogFormulier';
test('vult het inlogformulier correct in en verzendt', () => {
const handleSubmit = jest.fn();
render(<InlogFormulier onSubmit={handleSubmit} />);
fireEvent.change(screen.getByLabelText(/Gebruikersnaam/i), { target: { value: 'testuser' } });
fireEvent.change(screen.getByLabelText(/Wachtwoord/i), { target: { value: 'password123' } });
fireEvent.click(screen.getByText(/Inloggen/i));
expect(handleSubmit).toHaveBeenCalledWith({
username: 'testuser',
password: 'password123'
});
});
```
- **Cypress E2E-testvoorbeeld**:
```javascript
describe('Inlogproces', () => {
it('succesvol inloggen', () => {
cy.visit('/login');
cy.get('input[name="username"]').type('testuser');
cy.get('input[name="password"]').type('password123');
cy.contains('Inloggen').click();
cy.url().should('include', '/dashboard');
cy.contains('Welkom, testuser');
});
});
```
4. **Integratie in ontwikkelworkflow**
- **Automatiseer tests via scripts**:
- Voeg scripts toe aan `package.json`, bijvoorbeeld:
```json
"scripts": {
"test": "jest",
"test:e2e": "cypress run"
}
```
- **CI/CD integratie**:
- Configureer CI (bijv. GitHub Actions, GitLab CI) om bij elke push of pull request de tests automatisch uit te voeren.
- Bijvoorbeeld, run `npm test` voor unit-tests en `npm run test:e2e` voor end-to-end tests.
- **Pre-commit hooks**:
- Gebruik tools zoals Husky om tests automatisch te laten draaien vóór commits, zodat je regressies voorkomt.
5. **Aanvullende tips**
- Zorg voor goede mockdata en API-mocking (met MSW) om tests betrouwbaar en snel te houden.
- Organiseer tests gestructureerd, bijvoorbeeld in mappen per component en per testtype.
- Documenteer testscenario's en zorg dat tests regelmatig worden onderhouden.
Met deze aanpak creëer je een robuust en geautomatiseerd testproces dat de kwaliteit van je inlog- en registratieproces waarborgt en makkelijk te integreren is in je ontwikkelworkflow.
provider: deepseek
model: deepseek-chat
Zeker! Hier is een stapsgewijze handleiding voor het opzetten van een geautomatiseerd frontend testproces voor jouw React/TypeScript webwinkel, met speciale focus op het inlog- en registratieproces.
### 1. Gekozen Tools en Frameworks (Het Stapelblad)
Voor een robuuste en moderne testsetup raad ik de volgende combinatie aan:
* **Test Runner:** **Jest**
* *Waarom:* Standaard keuze voor React-applicaties. Snel, betrouwbaar en uitstekende integratie met TypeScript. Het handelt de testuitvoering en assertions af.
* **Testing Library:** **React Testing Library** & **Vitest** (of blijf bij Jest)
* *Waarom:* Dit framework moedigt beste practices aan door tests te schrijven vanuit het perspectief van de gebruiker. Je queryt elementen zoals een gebruiker ze zou vinden (op tekst, rol, etc.), niet op implementatiedetails zoals `classNames` of `component props`. Dit maakt je tests veerkrachtiger. **Vitest** is een modern, snel alternatief voor Jest, maar Jest is nog steeds uitstekend. Voor dit voorbeeld houden we het bij Jest.
* **E2E Testing (End-to-End):** **Playwright** (Aanbevolen) of **Cypress**
* *Waarom:* Deze tools simuleren een echte gebruiker in een echte browser. Ze zijn cruciaal voor het testen van complete workflows zoals inloggen en registreren, waarbij meerdere componenten en pagina's met elkaar interacteren. **Playwright** is zeer snel, betrouwbaar en ondersteunt meerdere browsers (Chromium, Firefox, WebKit) out-of-the-box.
* **Test Omgeving Setup:**
* **MSW (Mock Service Worker):** *Essentieel voor het isoleren van frontend tests.* Hiermee mock je API-aanroepen op netwerkniveau. Je test dan je frontendlogica zonder afhankelijk te zijn van een echte, trage backend.
---
### 2. Het Schrijven van Tests voor Gebruikersinteracties
We onderscheiden twee soorten tests: **Component Tests** (geïsoleerd, met React Testing Library) en **E2E Tests** (volledige workflow, met Playwright).
#### A. Component Tests voor Inlog-/Registratiecomponenten
Deze tests controleren of individuele componenten (zoals het loginformulier) correct renderen en reageren op gebruikersinvoer.
**Voorbeeld: Test voor een `LoginForm` Component**
1. **Installeer de packages:**
```bash
npm install --save-dev @testing-library/react @testing-library/jest-dom @testing-library/user-event
```
2. **Schrijf de test (`LoginForm.test.tsx`):**
```typescript
import React from 'react';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import LoginForm from './LoginForm';
import { describe, it, expect, vi } from 'vitest'; // of van jest
// Mock een eenvoudige login-functie
const mockOnSubmit = vi.fn();
describe('LoginForm', () => {
it('renders email and password fields and a submit button', () => {
render(<LoginForm onSubmit={mockOnSubmit} />);
// Query elementen op hun toegankelijke naam (zoals een gebruiker zou doen)
expect(screen.getByLabelText(/e-mailadres/i)).toBeInTheDocument();
expect(screen.getByLabelText(/wachtwoord/i)).toBeInTheDocument();
expect(screen.getByRole('button', { name: /inloggen/i })).toBeInTheDocument();
});
it('allows users to type in their email and password', async () => {
const user = userEvent.setup();
render(<LoginForm onSubmit={mockOnSubmit} />);
const emailInput = screen.getByLabelText(/e-mailadres/i);
const passwordInput = screen.getByLabelText(/wachtwoord/i);
await user.type(emailInput, 'klant@voorbeeld.nl');
await user.type(passwordInput, 'veiligwachtwoord123');
expect(emailInput).toHaveValue('klant@voorbeeld.nl');
expect(passwordInput).toHaveValue('veiligwachtwoord123');
});
it('calls the onSubmit function with the entered data when the form is submitted', async () => {
const user = userEvent.setup();
render(<LoginForm onSubmit={mockOnSubmit} />);
await user.type(screen.getByLabelText(/e-mailadres/i), 'klant@voorbeeld.nl');
await user.type(screen.getByLabelText(/wachtwoord/i), 'veiligwachtwoord123');
await user.click(screen.getByRole('button', { name: /inloggen/i }));
// Controleer of de mock-functie is aangeroepen met de juiste gegevens
expect(mockOnSubmit).toHaveBeenCalledWith({
email: 'klant@voorbeeld.nl',
password: 'veiligwachtwoord123',
});
});
});
```
#### B. E2E Tests voor het Complete Inlog- en Registratieproces
Deze tests controleren de hele flow, van het bezoeken van de pagina tot het succesvol inloggen en de redirect.
**Voorbeeld: E2E Test met Playwright**
1. **Installeer Playwright:**
```bash
npm init playwright@latest
```
2. **Schrijf de test (`e2e/auth-flow.spec.ts`):**
```typescript
import { test, expect } from '@playwright/test';
test('successful user login and redirect to account page', async ({ page }) => {
// 1. Navigeer naar de loginpagina van de webwinkel
await page.goto('https://jewebwinkel.nl/login');
// 2. Vul de inloggegevens in
await page.getByLabel('E-mailadres').fill('klant@voorbeeld.nl');
await page.getByLabel('Wachtwoord').fill('veiligwachtwoord123');
// 3. Klik op de inlogknop
await page.getByRole('button', { name: 'Inloggen' }).click();
// 4. Wacht op een navigatie (bijv. naar de accountpagina) en verifieer de URL
await page.waitForURL('**/mijn-account');
await expect(page).toHaveURL(/\/mijn-account/);
// 5. Verifieer dat een succesbericht of gebruikersnaam zichtbaar is
await expect(page.getByText('Welkom terug, Klant!')).toBeVisible();
});
test('registration with existing email shows error message', async ({ page }) => {
await page.goto('https://jewebwinkel.nl/registreren');
await page.getByLabel('Voornaam').fill('Test');
await page.getByLabel('Achternaam').fill('Gebruiker');
await page.getByLabel('E-mailadres').fill('bestaatal@voorbeeld.nl');
await page.getByLabel('Wachtwoord', { exact: true }).fill('nieuwWachtwoord');
await page.getByLabel('Bevestig wachtwoord').fill('nieuwWachtwoord');
await page.getByRole('button', { name: 'Account aanmaken' }).click();
// Verifieer dat een foutmelding voor een bestaand e-mailadres verschijnt
await expect(page.getByText('Dit e-mailadres is al in gebruik')).toBeVisible();
});
```
---
### 3. Integratie in de Ontwikkelworkflow (CI/CD)
Het doel is om tests automatisch uit te voeren bij elke wijziging in de code.
1. **Scripts in `package.json`:**
Voeg deze scripts toe om tests eenvoudig uit te voeren.
```json
"scripts": {
"test": "vitest", // of "jest"
"test:e2e": "playwright test",
"test:e2e:headed": "playwright test --headed" // Om tests in een browser te zien
}
```
2. **Pre-commit Hook (Aanbevolen):**
Voer snelle componenttests uit vóór elke commit om te voorkomen dat gebroken code wordt gedeeld. Gebruik **Husky** en **lint-staged**.
```bash
npm install --save-dev husky lint-staged
npx husky init
```
Voeg toe aan `package.json`:
```json
"lint-staged": {
"*.{ts,tsx}": [
"npm run test -- --findRelatedTests"
]
}
```
3. **Continuous Integration (CI) Pipeline:**
Configureer je CI-dienst (bijv. GitHub Actions, GitLab CI) om **alle** tests (unit + E2E) uit te voeren bij elke pull request of push naar de `main` branch.
**Voorbeeld GitHub Actions Workflow (`.github/workflows/test.yml`):**
```yaml
name: Frontend Tests
on: [push, pull_request]
jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
- run: npm ci
- run: npm run test -- --coverage
e2e-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
- run: npm ci
- run: npx playwright install
- run: npm run test:e2e
- uses: actions/upload-artifact@v4
if: failure()
with:
name: playwright-report
path: playwright-report/
retention-days: 30
```
### Samenvatting van de Aanpak
1. **Begin Klein:** Schrijf eerst componenttests voor je `LoginForm` en `RegistrationForm` met React Testing Library.
2. **Mock de API:** Gebruik MSW om de inlog- en registratie-API-aanroepen te mocken, zodat je tests snel en betrouwbaar zijn.
3. **Voeg E2E toe:** Gebruik Playwright om de kritieke *happy paths* (succesvol inloggen/registreren) en *sad paths* (foutieve login) te testen.
4. **Automatiseer:** Integreer alles in je workflow met pre-commit hooks en een CI-pipeline.
Deze combinatie van tools en strategie zorgt voor een zeer degelijk, schaalbaar en onderhoudbaar geautomatiseerd testproces voor jouw duurzame webwinkel. Veel succes!