Episode ini membahas contoh kasus nyata: checkout e-commerce, signup flow, dan dashboard workflows, pola desain test untuk end-to-end automation, keseimbangan UI test dengan API dan component test, serta prioritas test untuk jalur bisnis kritis.

Semua konsep yang sudah kalian pelajari menemukan maknanya saat dipakai pada aplikasi nyata. Episode 20 ini membawa teori ke praktik: tiga use case paling umum dalam bisnis digital — checkout e-commerce, signup flow, dan dashboard workflow — lengkap dengan pola test yang terbukti bekerja di lapangan.
Selain menulis test, episode ini membahas strategi: bagaimana menyeimbangkan investasi antara UI test, API test, dan component test, serta bagaimana memprioritaskan jalur bisnis yang paling penting untuk dilindungi pertama kali. Kemampuan memilih apa yang harus diuji sama pentingnya dengan cara menguji.
Checkout adalah jalur paling kritis di e-commerce — kegagalan di sini berarti kehilangan pendapatan langsung. Test checkout harus memakai Page Object (episode 6) dan mock API (episode 12) agar tidak bergantung pada payment gateway asli:
import { test, expect } from '@playwright/test';
import { CheckoutPage } from '../pages/CheckoutPage';
test('checkout sukses sampai halaman konfirmasi', async ({ page }) => {
await page.route('**/api/payment', (route) => {
route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ status: 'success', orderId: 'ORD-001' }),
});
});
const checkout = new CheckoutPage(page);
await checkout.goto();
await checkout.isiAlamatPengiriman();
await checkout.pilihMetodePembayaran('transfer');
await checkout.bayar();
await expect(page.getByText('Pesanan berhasil dibuat')).toBeVisible();
await expect(page).toHaveURL(/konfirmasi/);
});route.fulfill pada **/api/payment menggantikan gateway pembayaran dengan respons sukses yang terkontrol. Alur UI lengkap — dari alamat sampai konfirmasi — diuji tanpa uang sungguhan.
Selain happy path, uji jalur gagal checkout yang paling umum:
await page.route('**/api/payment', (route) => {
route.fulfill({
status: 402,
contentType: 'application/json',
body: JSON.stringify({ error: 'Pembayaran ditolak' }),
});
});
await checkout.bayar();
await expect(page.getByText('Pembayaran ditolak')).toBeVisible();status: 402 mensimulasikan pembayaran yang ditolak. Verifikasi bahwa UI menampilkan error dengan benar dan tidak terjebak dalam state loading.
Signup menggabungkan validasi frontend dan backend sekaligus. Kunci test yang stabil adalah menggunakan data unik (episode 13) agar tidak tabrakan dengan user yang sudah ada:
import { test, expect } from '@playwright/test';
test('pendaftaran akun baru berhasil', async ({ page }) => {
const email = `user-${Date.now()}@example.com`;
await page.goto('/daftar');
await page.getByLabel('Nama Lengkap').fill('Budi Santoso');
await page.getByLabel('Email').fill(email);
await page.getByLabel('Kata Sandi').fill('Rahasia123!');
await page.getByLabel('Konfirmasi Kata Sandi').fill('Rahasia123!');
await page.getByRole('button', { name: 'Daftar' }).click();
await expect(page.getByText('Verifikasi email dikirim')).toBeVisible();
await expect(page).toHaveURL(/cek-email/);
});email = 'user-${Date.now()}@example.com' menjamin keunikan di setiap eksekusi. Setelah submit, verifikasi konfirmasi pengiriman email — titik di mana alur UI berakhir untuk user baru.
Signup rentan terhadap kebocoran state antar field. Uji beberapa validasi dalam satu describe agar kegagalan terkumpul:
await page.getByLabel('Kata Sandi').fill('123');
await page.getByRole('button', { name: 'Daftar' }).click();
await expect(page.getByText('Kata sandi minimal 8 karakter')).toBeVisible();Memverifikasi pesan validasi yang spesifik menegaskan bahwa aturan backend dan frontend sinkron — bug umum ketika satu sisi mengizinkan password yang sisi lain tolak.
Dashboard biasanya memuat banyak data asinkron dari beberapa API sekaligus. Stabilitas test dicapai dengan mengendalikan setiap respons:
import { test, expect } from '@playwright/test';
test('dashboard menampilkan metrik dari API', async ({ page }) => {
await page.route('**/api/metrics', (route) => {
route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ revenue: 12000000, orders: 340 }),
});
});
await page.goto('/dashboard');
await expect(page.getByText('12.000.000')).toBeVisible();
await expect(page.getByText('340')).toBeVisible();
});Dengan route yang mengendalikan **/api/metrics, nilai yang dirender bisa ditebak persis. Ini menghilangkan flakiness yang muncul saat data dashboard berubah antar eksekusi.
Dashboard sering berisi aksi — filter, sort, export. Uji alur aksi paling penting:
await page.getByRole('combobox').selectOption({ label: 'Bulan ini' });
await expect(page.getByText('Laporan Bulan Ini')).toBeVisible();
await page.getByRole('button', { name: 'Export' }).click();
await expect(page.waitForEvent('download')).resolves.toBeTruthy();Verifikasi bahwa aksi filter mengubah konten, lalu bahwa tombol export memicu download — dua perilaku yang paling sering rusak di dashboard.
Bukan semua alur harus diuji di level UI. Aturan praktis pembagian:
Gunakan test pyramid sebagai panduan: mayoritas test di level API dan component, sedikit tapi penting di level UI. Ketika memulai suite, jangan langsung menulis UI test untuk segalanya — mulai dari API test untuk kontrak, tambahkan component test untuk komponen kompleks, dan UI test hanya untuk alur yang benar-benar butuh browser nyata seperti checkout atau login lintas halaman.
Tidak semua fitur bernilai sama. Mulailah dari yang paling berdampak pada pendapatan dan kepercayaan:
Tetapkan tingkat prioritas yang terlihat di nama test atau tag — misalnya test('checkout - PRIORITAS TINGGI'). Alur kritis mendapat retry dan monitoring lebih ketat, sementara fitur sekunder boleh lebih longgar.
Episode 20 menghubungkan seluruh keterampilan dengan realitas bisnis: test checkout dengan mock payment, signup dengan data unik, dan dashboard dengan data terkontrol. Kalian juga belajar menyeimbangkan investasi antar lapisan test dan memprioritaskan jalur bisnis kritis yang layak dilindungi pertama kali.
Inti yang harus dibawa pulang:
Date.now()) untuk signup yang bisa diulang.Di episode 21 selanjutnya kita akan membahas ekosistem dan tools — tool terkait seperti Testing Library, Percy, dan BrowserStack, penggunaan Playwright Inspector, trace viewer, dan codegen, sumber daya komunitas, serta cloud execution dan managed testing platforms.