Episode ini membahas penggunaan Cypress plugins dan community modules, pembuatan plugin custom untuk kebutuhan test, perluasan custom commands dan task APIs, serta pola plugin yang bisa dipakai ulang lintas project.

Setiap project punya kebutuhan yang tidak tercakup Cypress secara bawaan. Episode 18 membahas ekosistem plugin: memakai plugin komunitas, membuat plugin custom, memperluas commands dan task APIs, serta menyusun pola plugin yang bisa dipakai ulang lintas project.
Plugin adalah garis antara suite yang kaku dan suite yang dibangun sesuai kebutuhan tim.
Ekosistem plugin Cypress dikatalogkan di situs resmi dan npm. Pola pemasangannya konsisten:
npm install -D cypress-file-uploadnpm install -D cypress-file-upload menambahkan plugin upload. Sebagian plugin berupa command yang di-import di support, sebagian berupa modul Node yang didaftarkan di konfigurasi.
Plugin level Node didaftarkan lewat blok setupNodeEvents:
module.exports = defineConfig({
e2e: {
setupNodeEvents(on, config) {
require("cypress-watch-and-reload")(on, config);
return config;
},
},
});setupNodeEvents(on, config) adalah titik masuk plugin sisi Node. Fungsi on dipakai plugin untuk mendaftarkan event handler; objek config boleh diubah dan dikembalikan.
Plugin custom paling umum memakai task API — memanggil kode Node dari browser:
module.exports = defineConfig({
e2e: {
setupNodeEvents(on) {
on("task", {
seedDatabase() {
return seedDatabase();
},
});
},
},
});on("task", { seedDatabase() { ... } }) mendaftarkan task bernama seedDatabase. Task ini bisa dipanggil dari test dengan cy.task("seedDatabase") seperti yang kita singgung di episode 10.
Contoh task yang bisa langsung dipakai: mengembalikan nilai yang konsisten dari sisi Node:
on("task", {
timestampSekarang() {
return Date.now();
},
});timestampSekarang() mengembalikan waktu server. Task semacam ini membuat test bisa memakai nilai yang konsisten dari sisi Node, bukan dari browser yang bisa disetel ulang.
Command Cypress dan task API saling melengkapi: command berjalan di browser, task di Node. Gabungkan keduanya untuk helper yang kuat:
Cypress.Commands.add("seedDanKunjungi", (fixtureName) => {
cy.task("seedDatabase", fixtureName);
cy.visit("/");
});cy.task("seedDatabase", fixtureName) mengirim argumen ke task Node. Command seedDanKunjungi mengemas pola siapkan data lalu buka halaman menjadi satu panggilan — komposisi command dan task.
Task berjalan di Node dengan akses sistem file dan environment. Batasi apa yang bisa dipanggil task — jangan pernah menerima path atau perintah arbitrer dari spec:
on("task", {
readFixture(name) {
const whitelist = ["produk", "users"];
if (!whitelist.includes(name)) {
throw new Error("fixture tidak diizinkan");
}
return readFile(`cypress/fixtures/${name}.json`, "utf-8");
},
});whitelist.includes(name) membatasi nama fixture yang boleh dibaca. Memvalidasi input task mencegah spec yang dikompromikan menjalankan operasi berbahaya di Node.
Plugin yang baik bisa dipindahkan antar project. Pisahkan sebagai modul tersendiri:
const { defineConfig } = require("cypress");
const seedPlugin = require("./plugins/seed");
module.exports = defineConfig({
e2e: {
setupNodeEvents(on, config) {
seedPlugin(on, config);
return config;
},
},
});require("./plugins/seed") memuat modul plugin yang terpisah. seedPlugin(on, config) mendaftarkan task dari modul tersebut — pola ini membuat plugin bisa dibagikan dan diuji sendiri.
Berikan plugin custom dokumentasi singkat: apa yang didaftarkan, argumen yang diterima, dan contoh pemakaian. Jika plugin dipakai lintas project, rilis sebagai package npm dengan versioning sendiri agar perubahan tidak mengejutkan tim lain.
Info
Sebelum menulis plugin custom, periksa dulu apakah kebutuhan sudah ada di plugin komunitas yang terpelihara. Menulis sendiri berguna saat kebutuhan spesifik, tetapi plugin umum yang matang menghemat waktu dan perawatan.
Episode 18 membuka pintu ekosistem: memakai plugin komunitas, membuat plugin custom melalui task API dan setupNodeEvents, memperluas commands dan task, serta menyusun pola plugin yang bisa dipakai ulang dengan validasi dan dokumentasi.
Inti yang harus dibawa pulang:
setupNodeEvents.cy.task.Di episode 19 selanjutnya kita akan membahas operational readiness dan runbooks — runbook untuk flaky tests dan environment drift, incident response untuk failing CI runs, menjaga test coverage dan health, serta team ownership dan maintenance routines.