Episode ini membahas visual testing: integrasi dengan Percy dan Applitools, konsep baseline screenshots dan visual diff, mendeteksi layout regressions dan UI drift, serta best practices visual regression.

Assertion teks tidak bisa menangkap perubahan visual: tombol yang bergeser, warna yang berubah, atau font yang rusak. Episode 16 membahas visual testing — integrasi dengan Percy dan Applitools, baseline screenshots, visual diff, serta deteksi layout regressions dan UI drift.
Visual testing menambah dimensi pengujian: apa yang kalian lihat, bukan hanya apa yang tertulis.
Percy dari BrowserStack dan Applitools adalah layanan visual regression. Keduanya menyediakan SDK yang menangkap screenshot, menyimpannya sebagai baseline, dan membandingkannya dengan snapshot berikutnya. Install SDK pilihan kalian:
npm install -D @percy/cli @percy/cypressnpm install -D @percy/cli @percy/cypress menambahkan CLI dan adapter Cypress untuk Percy. Applitools memakai @applitools/eyes-cypress dengan konsep Eyes yang serupa.
import "@percy/cypress";
it("tampilan dashboard konsisten", () => {
cy.visit("/dashboard");
cy.get("[data-cy=konten]").should("be.visible");
cy.percySnapshot("dashboard");
});cy.percySnapshot("dashboard") mengirim snapshot ke layanan Percy dengan nama dashboard. Snapshot pertama menjadi baseline; snapshot berikutnya dibandingkan dengannya.
Visual regression bergantung pada baseline — gambar yang dianggap benar. Saat snapshot baru berbeda dari baseline, layanan menandainya sebagai perubahan yang perlu disetujui atau ditolak:
npx percy exec -- npx cypress runnpx percy exec -- npx cypress run membungkus run Cypress dengan agen Percy. Token PERCY_TOKEN harus disediakan di environment agar snapshot bisa diunggah.
Diff dihitung piksel per piksel dengan toleransi. Perbedaan kecil seperti anti-aliasing font bisa diabaikan lewat threshold; perubahan besar ditampilkan dengan area yang disorot. Keputusan approve atau reject menjadi bagian dari alur review tim — ini bukan hanya pekerjaan CI.
Regresi layout muncul saat CSS berubah tanpa disadari: elemen tumpang tindih, margin berubah, atau komponen terpotong. Visual testing menangkapnya dengan jelas:
["desktop", "mobile"].forEach((ukuran) => {
it(`tampilan konsisten di ${ukuran}`, () => {
if (ukuran === "mobile") {
cy.viewport(375, 667);
}
cy.visit("/beranda");
cy.percySnapshot(`beranda-${ukuran}`);
});
});cy.viewport(375, 667) mensimulasikan layar ponsel. Snapshot per viewport membuat regresi layout di berbagai ukuran layar terdeteksi.
UI drift adalah perubahan visual bertahap yang tidak disadari sampai terakumulasi. Baseline yang diperbarui secara disiplin — bukan otomatis tanpa review — menjaga drift tetap terlihat. Tetapkan pemilik review snapshot agar tidak ada perubahan yang lolos tanpa pengawasan.
Tidak semua halaman perlu visual test. Prioritaskan:
Update baseline dengan sengaja saat perubahan memang diinginkan:
npx percy approve <build-id>npx percy approve <build-id> menyetujui snapshot yang berubah dan menjadikannya baseline baru. Proses ini harus melibatkan manusia — mengapprove otomatis berarti menghapus fungsi visual testing itu sendiri.
Warning
Jangan menjalankan visual test terhadap data yang berubah-ubah seperti jam real-time atau feed yang acak. Freeze data memakai stub dari episode 12 agar baseline tetap konsisten.
Episode 16 menambahkan dimensi visual pada pengujian: integrasi Percy dan Applitools, konsep baseline dan visual diff, deteksi layout regressions di berbagai viewport, serta best practices menjaga snapshot tetap relevan dengan review manusia.
Inti yang harus dibawa pulang:
Di episode 17 selanjutnya kita akan membahas accessibility testing — menambahkan axe-core untuk accessibility assertions, menguji keyboard navigation, ARIA roles, dan semantic HTML, memahami accessibility rules, serta membangun accessible test flows.