---
name: e2e-testing-expert
description: "Expert guide for End-to-End (E2E) testing with Playwright, unit/integration testing with Vitest, and CI/CD automated testing pipeline setup / Panduan ahli pengujian End-to-End (E2E) dengan Playwright, pengujian unit/integrasi dengan Vitest, dan otomatisasi CI/CD."
author: "Roedy Rustam"
---
# E2E Testing & Test Automation Expert
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
---
## English
### Description
This skill provides comprehensive, professional guidelines for implementing End-to-End (E2E) testing with Playwright, unit and integration testing with Vitest, and setting up automated CI/CD pipelines (e.g., GitHub Actions) to run tests on every commit/PR.
### Trigger Conditions
Active when the user requests help with:
- Setting up Playwright or Vitest in a JavaScript/TypeScript project.
- Writing E2E test specs (e.g., user authentication, Stripe checkout, interactive dashboard flows).
- Writing unit or integration tests for components, hooks, or backend utilities.
- Configuring a GitHub Actions workflow to run test suites.
- Debugging flaky E2E tests, handling timeouts, or configuring testing environments.
### Core Testing Standards
#### 1. Playwright Best Practices
- **Locators**: Use resilient user-facing locators (`getByRole`, `getByLabelText`, `getByPlaceholder`) instead of implementation details like CSS selectors (`.btn-primary`) or XPath.
- **State Isolation**: Run tests in isolated browser contexts. Reuse login state via `storageState` to avoid repeating the authentication flow in every test.
- **Trace Viewer**: Enable Playwright trace recording in CI (`trace: 'on-first-retry'`) to record screenshots, network requests, and DOM snapshots for easier debugging.
- **Network Mocking**: Mock third-party APIs (like Stripe, Clerk, or external SaaS webhooks) using `page.route` to prevent tests from failing due to external network flakiness.
#### 2. Vitest Best Practices
- **Isolation**: Keep tests completely pure and isolated. Reset mock states (`vi.clearAllMocks()`) before or after each test run.
- **Component Tests**: Use `@testing-library/react` and Vitest to test component behavior (what the user sees and interacts with) rather than internal implementation states.
- **Speed**: Organize tests so they can run concurrently where possible (`test.concurrent`).
#### 3. Automated CI/CD Setup
Set up a clean GitHub Actions workflow that:
- Installs project dependencies (utilizing caching).
- Installs Playwright system browsers.
- Runs the test suite (linting, Vitest, Playwright).
- Uploads Playwright HTML report and traces on test failure.
---
### Code Examples
#### Playwright Login & Checkout Spec (`tests/auth-checkout.spec.ts`)
```typescript
import { test, expect } from '@playwright/test';
test.describe('SaaS Checkout Flow', () => {
// Reuse authentication state
test.use({ storageState: 'playwright/.auth/user.json' });
test('should navigate to billing and start stripe checkout', async ({ page }) => {
await page.goto('/settings/billing');
// Resilient locators
const upgradeButton = page.getByRole('button', { name: 'Upgrade to Pro' });
await expect(upgradeButton).toBeVisible();
await upgradeButton.click();
// Verify redirect to Stripe checkout page
await page.waitForURL(/.*checkout.stripe.com.*/);
await expect(page.getByText('Vibes Plug Pro')).toBeVisible();
});
});
```
#### GitHub Actions Workflow (`.github/workflows/test.yml`)
```yaml
name: CI Test Suite
on:
push:
branches: [ main, dev ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Install Playwright Browsers
run: npx playwright install --with-deps
- name: Run Linting
run: npm run lint
- name: Run Unit/Integration Tests
run: npx vitest run
- name: Run E2E Tests
run: npx playwright test
env:
DATABASE_URL: ${{ secrets.TEST_DATABASE_URL }}
NEXTAUTH_SECRET: ${{ secrets.TEST_NEXTAUTH_SECRET }}
- name: Upload Playwright Report
uses: actions/upload-artifact@v4
if: failure()
with:
name: playwright-report
path: playwright-report/
retention-days: 30
```
---
## Bahasa Indonesia
### Deskripsi
Skill ini menyediakan panduan profesional yang komprehensif untuk menerapkan pengujian End-to-End (E2E) menggunakan Playwright, pengujian unit & integrasi menggunakan Vitest, serta konfigurasi pipeline CI/CD (seperti GitHub Actions) secara otomatis.
### Kondisi Pemicu
Aktif ketika pengguna meminta bantuan terkait:
- Setup Playwright atau Vitest di proyek JavaScript/TypeScript.
- Penulisan tes E2E (misalnya: alur login pengguna, checkout Stripe, dashboard interaktif).
- Penulisan unit test atau integration test untuk komponen UI, hooks, atau utilitas backend.
- Konfigurasi workflow GitHub Actions untuk menjalankan pengujian otomatis.
- Debugging tes E2E yang lambat/flaky, handling timeout, atau konfigurasi environment testing.
### Standar Pengujian Utama
#### 1. Praktik Terbaik Playwright
- **Locators**: Gunakan locator yang tangguh berbasis elemen yang dilihat pengguna (`getByRole`, `getByLabelText`, `getByPlaceholder`) daripada CSS selector (`.btn-primary`) atau XPath.
- **Isolasi State**: Jalankan tes dalam browser context yang terisolasi. Gunakan fitur `storageState` untuk menyimpan session cookie agar alur login tidak perlu diulang pada setiap tes.
- **Trace Viewer**: Aktifkan perekaman trace Playwright di CI (`trace: 'on-first-retry'`) untuk merekam screenshot, network request, dan DOM snapshot untuk mempermudah debugging.
- **Mocking Network**: Gunakan `page.route` untuk memalsukan respon dari API pihak ketiga (seperti Stripe, Clerk, atau Webhook) agar pengujian tidak gagal akibat gangguan jaringan eksternal.
#### 2. Praktik Terbaik Vitest
- **Isolasi**: Jaga agar pengujian benar-benar bersih dan terisolasi. Reset mock state (`vi.clearAllMocks()`) sebelum atau sesudah setiap pengujian dijalankan.
- **Pengujian Komponen**: Gunakan `@testing-library/react` dan Vitest untuk menguji perilaku komponen UI (apa yang dilihat dan diinteraksikan pengguna) daripada struktur internal state-nya.
- **Kecepatan**: Atur pengujian agar dapat berjalan secara bersamaan jika memungkinkan (`test.concurrent`).
#### 3. Konfigurasi CI/CD Otomatis
Buat workflow GitHub Actions bersih yang akan:
- Menginstal dependensi proyek (menggunakan caching untuk mempercepat proses).
- Mengunduh browser sistem yang dibutuhkan Playwright.
- Menjalankan seluruh pengujian (linter, Vitest, Playwright).
- Mengunggah laporan HTML Playwright dan trace rekaman jika terjadi kegagalan tes.