Codegen
Merekam gerakanmu jadi kode, lalu merapikannya jadi test yang layak, termasuk memanfaatkan data-testid.
Codegen merekam klik dan ketikanmu menjadi kode. Hasilnya bahan mentah: buang gerakan yang tidak perlu, tambahkan assertion, lalu rapikan menjadi test.
Codegen seperti merekam layar saat testing manual. Rekamannya membantu, tapi belum bisa langsung jadi test case: kamu masih perlu memotong langkah yang tidak perlu dan menulis expected result-nya.
Menjalankan codegen
Di terminal folder project-mu:
uv run playwright codegen --target python-pytest https://playground.aminhamzah.com/login-toko.html # rekam aksi, kodenya dalam format pytestnpx playwright codegen https://playground.aminhamzah.com/login-toko.html # rekam aksi, kodenya dalam format Playwright TestAkan muncul dua jendela:
- Browser: tempat kamu mengklik dan mengetik seperti biasa.
- Playwright Inspector: kodenya langsung muncul di sini, mengikuti setiap gerakanmu.
Seperti apa di layar
Empat screenshot ini diambil dari codegen sungguhan di TokoQA. Tooltip-nya memakai gaya Python karena target rekamannya python-pytest. Kalau kamu memilih TypeScript, isinya getByRole(...).
Tombol penting di Inspector
| Tombol | Gunanya |
|---|---|
| Record | Mulai atau berhenti merekam |
| Pick locator | Arahkan kursor ke elemen, Inspector menunjukkan locator terbaiknya |
| Assert visibility | Klik elemen untuk menambah assertion "elemen ini terlihat" |
| Assert text | Klik elemen untuk menambah assertion teks |
| Assert value | Klik kolom isian untuk menambah assertion isinya |
| Copy | Salin semua kodenya |
| Target | Pilih bahasa hasil rekaman (Python pytest, TypeScript, dan lainnya) |
Hasil rekaman yang masih mentah
Contoh rekaman login lalu menambahkan Mouse Wireless ke keranjang:
import re # alat pencocok teks (diimpor codegen, belum tentu dipakai)
from playwright.sync_api import Page, expect # Page dan expect
def test_example(page: Page) -> None: # nama test bawaan codegen, sebaiknya diganti
page.goto("https://playground.aminhamzah.com/login-toko.html") # URL lengkap: ganti dengan path supaya memakai base URL
page.get_by_role("textbox", name="Username").click() # klik ini tidak perlu, fill sudah memfokuskan kolom
page.get_by_role("textbox", name="Username").fill("customer") # isi Username
page.get_by_role("textbox", name="Username").press("Tab") # tekan Tab: juga tidak perlu
page.get_by_label("Password").fill("rahasia123") # isi Password
page.get_by_test_id("login-button").click() # klik Masuk lewat test id
page.get_by_test_id("product-card").filter(has_text="Mouse Wireless").get_by_role("button").click() # tambah Mouse Wireless ke keranjang
page.get_by_test_id("cart-link").click() # buka keranjang (belum ada assertion!)import { test, expect } from '@playwright/test'; // test dan expect
test('test', async ({ page }) => { // nama test bawaan codegen, sebaiknya diganti
await page.goto('https://playground.aminhamzah.com/login-toko.html');
await page.getByRole('textbox', { name: 'Username' }).click(); // klik ini tidak perlu, fill sudah memfokuskan kolom
await page.getByRole('textbox', { name: 'Username' }).fill('customer'); // isi Username
await page.getByRole('textbox', { name: 'Username' }).press('Tab'); // tekan Tab: juga tidak perlu
await page.getByLabel('Password').fill('rahasia123'); // isi Password
await page.getByTestId('login-button').click(); // klik Masuk lewat test id
await page.getByTestId('product-card').filter({ hasText: 'Mouse Wireless' }).getByRole('button').click(); // tambah Mouse Wireless ke keranjang
await page.getByTestId('cart-link').click(); // buka keranjang (belum ada assertion!)
});Apa yang kurang dari rekaman mentah?
| Masalah | Kenapa jadi masalah | Cara memperbaiki |
|---|---|---|
| Tidak ada assertion | Test tidak memeriksa apa pun, jadi selalu hijau | Tambahkan expect untuk hasil yang penting |
| Ada klik dan Tab yang tidak perlu | Bikin ramai dan lebih lambat | Hapus saja, karena fill sudah cukup |
URL lengkap https://playground.aminhamzah.com | Gagal kalau dipindah ke server lain | Tulis path-nya saja, base URL-nya dari base_url/baseURL |
Nama test test_example / 'test' | Tidak menjelaskan apa-apa | Beri nama sesuai perilaku yang diuji |
| Username dan password ditulis langsung | Rahasia ikut tersimpan di Git | Pindahkan ke .env (Modul 11) |
| Locator kadang kurang tepat | Misalnya getByRole('button') tanpa nama | Perjelas dengan name |
| Semuanya dalam satu test panjang | Susah dibaca dan dirawat | Pecah sesuai tujuan, pakai Page Object (Modul 10) |
Setelah dirapikan
Memuat tests/academy/test_m08_codegen.py…
uv run pytest tests/academy/test_m08_codegen.pyMemuat tests/academy/m08-codegen.spec.ts…
npx playwright test m08-codegen --project=chromiumLebih pendek, ikut pola AAA, punya assertion, dan tidak bergantung pada URL server.
Codegen paling berguna untuk menemukan locator dengan cepat (Pick locator), mempelajari perintah Playwright, dan membuat kerangka test panjang. Rekaman yang dipakai tanpa dirapikan biasanya merepotkan di kemudian hari.
Pilihan codegen yang berguna
# Emulasi HP
uv run playwright codegen --device "iPhone 13" https://playground.aminhamzah.com/login-toko.html
# Ukuran layar tertentu & mode gelap
uv run playwright codegen --viewport-size "1280,720" --color-scheme dark https://playground.aminhamzah.com
# Simpan status login, lalu pakai lagi di rekaman berikutnya
uv run playwright codegen --save-storage auth.json https://playground.aminhamzah.com/login-toko.html
uv run playwright codegen --load-storage auth.json https://playground.aminhamzah.com/shop.html # rekam dalam keadaan sudah login (memakai storage state)# Emulasi HP
npx playwright codegen --device "iPhone 13" https://playground.aminhamzah.com/login-toko.html
# Ukuran layar tertentu & mode gelap
npx playwright codegen --viewport-size "1280,720" --color-scheme dark https://playground.aminhamzah.com
# Simpan status login, lalu pakai lagi di rekaman berikutnya
npx playwright codegen --save-storage auth.json https://playground.aminhamzah.com/login-toko.html
npx playwright codegen --load-storage auth.json https://playground.aminhamzah.com/shop.html # rekam dalam keadaan sudah login (memakai storage state)Lewat VS Code: buka panel Testing, lalu pilih Record new. Rekamannya langsung masuk ke file test baru. Ada juga Record at cursor untuk menyisipkan rekaman di tengah test yang sudah ada.
Merekam di tengah test: tambahkan page.pause() di test-mu, lalu jalankan dengan --headed. Inspector akan terbuka tepat di baris itu, dan kamu bisa menekan Record untuk melanjutkan rekaman dari situ.
Lebih jauh (opsional)Trik komunitas
- Sejak v1.55, codegen bisa menambahkan assertion
toBeVisible()otomatis untuk interaksi yang umum. Fitur ini perlu dinyalakan dulu di pengaturan codegen. Tetap tambahkan assertion yang benar-benar membuktikan hasilnya. - Tim memakai nama atribut test sendiri? Pakai
--test-id-attribute=data-qasupaya codegen memilih atribut itu. - Lihat efek
data-testid: rekam halaman toko TokoQA. Codegen selalu mengutamakandata-testidkalau elemen punya atribut itu (lihat tombollogin-buttondi rekaman mentah di atas). Tanpa test id, ia memilih role, lalu label, placeholder, atau teks. - Generator agent (Modul 16) itu ibarat "codegen versi AI": ia membaca rencana test, menjelajah halaman sendiri, lalu menulis test sambil memastikan locator-nya benar.
# Kalau timmu memakai data-qa. TokoQA memakai data-testid (bawaan), jadi di sini codegen beralih ke role dan label.
uv run playwright codegen --target python-pytest --test-id-attribute=data-qa https://playground.aminhamzah.com/login-toko.html# Kalau timmu memakai data-qa. TokoQA memakai data-testid (bawaan), jadi di sini codegen beralih ke role dan label.
npx playwright codegen --test-id-attribute=data-qa https://playground.aminhamzah.com/login-toko.htmlLatihan
Rekam alur belanja lengkap
Jalankan codegen ke halaman login TokoQA. Rekam: login sebagai customer, pilih Elektronik, tambah Keyboard Mekanik dan Headset Gaming, checkout, isi form, pilih E-Wallet, centang persetujuan, lalu bayar. Salin hasilnya ke file baru.
Hasilsatu test mentah hasil rekaman
uv run playwright codegen --target python-pytest https://playground.aminhamzah.com/login-toko.html # rekam aksi, format pytestnpx playwright codegen https://playground.aminhamzah.com/login-toko.html # rekam aksi, format Playwright TestRekamannya berisi klik dan Tab yang tidak perlu, URL lengkap https://playground.aminhamzah.com, dan belum ada assertion. Latihan berikutnya merapikannya.
Rapikan hasil rekaman
Buang klik dan Tab yang tidak perlu, ganti URL lengkap dengan path (/login-toko.html), beri nama test yang jelas, lalu tambahkan assertion untuk jumlah keranjang, judul "Pesanan berhasil!", dan total yang dibayar.
Hasiltest lulus dengan total Rp 1.170.000
Memuat tests/latihan/test_m08_latihan.py…
Memuat tests/latihan/m08-latihan.spec.ts…
Pakai Pick locator
Pakai Pick locator untuk mencari locator angka di ikon keranjang dan nomor pesanan di halaman sukses.
HasilInspector menampilkan locator berbasis test id untuk keduanya
Inspector menyarankan:
- Angka keranjang:
get_by_test_id("cart-count")/getByTestId('cart-count') - Nomor pesanan:
get_by_test_id("order-id")/getByTestId('order-id')
Keduanya memakai test id karena elemennya punya atribut data-testid, dan Pick locator selalu mengutamakan atribut itu. Untuk elemen tanpa test id, misalnya kolom Username, ia menyarankan role atau label.