Folder test-results Kosong Saat Test Gagal di CI
Dua jenis rekaman Playwright dalam satu suite: trace dan video retain-on-failure sebagai bukti kegagalan, plus tour video mode on yang selalu terekam.
Ringkasan
Jadi gara-gara trace pakai on-first-retry tapi retries-nya 0, bukti kegagalan malah hilang. Solusinya pakai retain-on-failure buat video dan trace, plus satu file khusus buat rekam walkthrough CMS. Tapi jangan langsung percaya config, dites dulu dengan bikin satu test gagal sebelum aman.
Run CI merah. Saya buka job artifacts buat ambil videonya, dan folder test-results/ isinya hampir kosong. Nggak ada webm, nggak ada trace.zip. Padahal test-nya jelas gagal di run terakhir, tapi jejaknya lenyap.
Config Playwright waktu itu cuma punya satu baris buat trace: trace: "on-first-retry". Mode itu merekam hanya kalau test di-retry. Dan suite ini jalan dengan retries default, yaitu 0, jadi retry-nya nggak pernah terjadi [3]. Nggak ada retry, nggak ada rekaman. Gagal sekali langsung hilang buktinya.
Salah tebak: nyalakan semua ke mode on
Tebakan pertama saya, pindahin semua ke on supaya nggak pernah bolong. Salah kaprah. Mode on merekam video setiap test, termasuk yang lulus [1]. Satu suite penuh ngehasilin tumpukan video yang separuh isinya test yang nggak pernah gagal. Buat debugging, video yang lulus itu sampah.
Di titik ini saya baru sadar suite ini butuh dua jenis rekaman yang tugasnya beda.
Dua rekaman, dua tugas
Yang pertama, bukti kegagalan: video dan trace level config, dipakai hanya kalau test akhirnya gagal. Di use block sekarang keduanya retain-on-failure. Buat video, retain-on-failure tercantum eksplisit di dokumentasinya: rekam semua test, lalu buang video dari run yang sukses [1]. Videonya sendiri baru tersimpan saat browser context ditutup di akhir test [1].
Yang kedua, tur dokumentasi: satu spec yang sengaja merekam walkthrough admin CMS KotaPortal walau test-nya lulus. Di file itu saya override per-file pakai test.use({ video: { mode: "on", size: { width: 1280, height: 720 } } }) [4], plus waitForTimeout 1200ms di antara langkah supaya ada ruang napas buat yang nonton. Hasilnya webm 1280x720 yang nanti saya narasiin ulang jadi dokumentasi.
Soal trace, ada detail yang perlu saya tulis jujur. Halaman trace viewer mencantumkan on-first-retry sebagai rekomendasi CI, plus on-all-retries, on, dan off [2]. String retain-on-failure nggak dicantumkan di halaman itu untuk trace. Di config kami string itu diterima, dan probe di bawah membuktikan trace.zip-nya tetap nempel pas gagal. Rekomendasi dokumentasi buat trace tetap on-first-retry.
Ini penalaran saya sendiri, bukan kutipan dokumentasi: on-first-retry menempelkan bukti ke kebijakan retry. Kalau retries 0 atau retry-nya nggak ke-trigger, nggak ada apa-apa [3]. retain-on-failure melepas ketergantungan itu, test gagal di attempt pertama pun artefaknya tetap ada.
Kategori hasil run juga penting pas dibaca: passed, flaky (gagal lalu lulus di retry), dan failed (gagal di semua attempt) [3]. Dengan retries 0, flaky nggak akan pernah muncul. Yang ada cuma passed atau failed.
Probe dulu sebelum percaya config
Config yang kelihatan benar belum tentu nahan artefaknya. Sebelum percaya, saya probe: sengaja bikin satu test gagal, jalankan sekali tanpa retry, lalu cek test-results/. Hasilnya webm dan trace.zip tetap ada untuk kegagalan, baik di attempt pertama maupun saat retry. Baru setelah itu config-nya saya anggap aman.
Folder test-results/ memang ada di gitignore, jadi aman buat numpuk artefak lokal.
Sources
1. [Video options - dokumentasi Playwright](https://playwright.dev/docs/videos) 2. [Trace Viewer - dokumentasi Playwright](https://playwright.dev/docs/trace-viewer) 3. [Test retries - dokumentasi Playwright](https://playwright.dev/docs/test-retries) 4. [test.use() options - API Playwright](https://playwright.dev/docs/api/class-testoptions)