Snapshot Testing — Testing

Apa itu Snapshot Testing? Snapshot testing adalah teknik di mana output dari kode (misalnya HTML yang dirender) disimpan sebagai "foto" dan dibandingkan dengan

Apa itu Snapshot Testing?

Snapshot testing adalah teknik di mana output dari kode (misalnya HTML yang dirender) disimpan sebagai "foto" dan dibandingkan dengan hasil berikutnya. Jika ada perubahan, test gagal — lalu kita memutuskan apakah perubahan itu disengaja atau bug.

Kapan Menggunakan Snapshot?

toMatchSnapshot()

Pertama kali dijalankan, Vitest menyimpan snapshot ke file .snap. Selanjutnya, output dibandingkan dengan file tersebut:

import { render } from "@testing-library/react";
import Button from "./Button";

it("merender button dengan benar", () => {
  const { container } = render(<Button variant="primary">Kirim</Button>);
  expect(container.firstChild).toMatchSnapshot();
});

File snapshot disimpan di folder __snapshots__/ di sebelah file test. Contoh isinya:

// Button.test.tsx.snap
exports[`merender button dengan benar 1`] = `
<button
  class="btn btn-primary"
>
  Kirim
</button>
`;

toMatchInlineSnapshot()

Alih-alih file terpisah, snapshot disimpan langsung di dalam file test — lebih mudah di-review di pull request:

it("memformat tanggal", () => {
  expect(formatDate(new Date("2024-01-15"))).toMatchInlineSnapshot(
    '"15 Januari 2024"'
  );
});

Mengupdate Snapshot

Saat perubahan memang disengaja, update snapshot dengan flag --update atau -u:

# Update semua snapshot yang outdated
npx vitest --update

# Atau dalam mode watch, tekan "u" untuk update

Bahaya Over-Reliance pada Snapshot

Best Practices Snapshot

Snapshot untuk Data Non-UI

Snapshot juga berguna untuk mengecek output fungsi, konfigurasi, atau API response:

it("menghasilkan config yang benar", () => {
  const config = generateConfig({ env: "production" });
  expect(config).toMatchSnapshot();
});

it("mengembalikan error message yang konsisten", () => {
  const errors = validate({ email: "" });
  expect(errors).toMatchInlineSnapshot(`
    {
      "email": "Email wajib diisi"
    }
  `);
});

Yang akan kamu pelajari