Vitest

Vitest adalah framework pengujian JavaScript dan TypeScript yang ditenagai Vite. Ia memakai konfigurasi, transformer, resolver, dan plugin Vite sehingga jalur transformasi untuk pengembangan, build, dan pengujian dapat berbagi konfigurasi yang sama. Walaupun dirancang sebagai test runner native untuk proyek Vite, Vitest juga dapat dipakai pada proyek lain dan untuk kode backend.

Integrasi dengan Vite

Test runner yang berdiri sendiri biasanya memerlukan konfigurasi tambahan untuk TypeScript, JSX, alias modul, dan plugin. Pada proyek Vite, Vitest mengurangi duplikasi tersebut dengan membaca vite.config.* secara bawaan. Proyek tetap dapat menyediakan vitest.config.* jika pengaturan pengujian perlu dipisahkan.

Integrasi ini memberi dukungan ESM, TypeScript, JSX, dan PostCSS melalui jalur transformasi Vite. Dalam watch mode, Vitest membaca graf modul untuk menjalankan ulang pengujian yang berkaitan dengan berkas yang berubah, bukan selalu mengulang seluruh suite.

API dan fitur

Vitest menyediakan assertion melalui expect, snapshot yang kompatibel dengan Jest, serta fungsi mocking pada objek vi. Chai juga tersedia sebagai pustaka assertion bawaan. Kompatibilitas Jest mempermudah migrasi, tetapi perilakunya tidak sepenuhnya identik. Vitest tidak mengaktifkan global API secara bawaan, dan beberapa detail module mocking serta automocking berbeda.

Fitur utamanya mencakup:

Vitest menjalankan berkas pengujian dalam beberapa proses secara bawaan dan mengisolasi lingkungan setiap berkas. Paralelisme membantu suite yang sesuai, tetapi test yang berbagi state global, port, database, atau sistem berkas tetap memerlukan pembersihan yang benar.

Instalasi

Vitest dipasang sebagai development dependency:

pnpm add -D vitest

Vitest 4 memerlukan Vite 6 atau lebih baru dan Node.js 20 atau lebih baru. Skrip dasar di package.json dapat ditulis sebagai berikut:

{
  "scripts": {
    "test": "vitest",
    "test:run": "vitest run",
    "test:coverage": "vitest run --coverage"
  }
}

vitest berjalan dalam watch mode pada lingkungan pengembangan. vitest run menjalankan suite satu kali dan lebih sesuai untuk CI. Secara bawaan, nama berkas pengujian memuat .test. atau .spec..

Contoh dasar

// sum.ts
export function sum(a: number, b: number) {
  return a + b;
}
// sum.test.ts
import { expect, test } from "vitest";
import { sum } from "./sum";

test("menjumlahkan dua angka", () => {
  expect(sum(1, 2)).toBe(3);
});

Vitest dapat dikonfigurasi melalui blok test atau berkas khusus vitest.config.ts:

import { defineConfig } from "vitest/config";

export default defineConfig({
  test: {
    environment: "node",
    coverage: {
      include: ["src/**/*.{js,jsx,ts,tsx}"],
    },
  },
});

Untuk test komponen yang memerlukan DOM, ubah environment menjadi jsdom atau happy-dom setelah memasang paket terkait.

Coverage

Coverage dijalankan dengan vitest run --coverage dan memakai provider V8 atau Istanbul. Pada Vitest 4, provider V8 menggunakan remapping berbasis AST. Jika coverage.include tidak ditentukan, laporan hanya memasukkan berkas yang dimuat selama test. Tetapkan pola coverage.include agar laporan juga memperhitungkan berkas sumber yang belum tersentuh pengujian.

Pertimbangan migrasi

Migrasi dari Jest biasanya mudah pada assertion dan struktur test, tetapi tidak boleh diasumsikan sebagai penggantian tanpa perubahan. Periksa penggunaan global API, module factory, automocking, timer, dan reset mock. API global dapat diaktifkan lewat konfigurasi, tetapi impor eksplisit dari vitest membuat dependensi test lebih jelas.

Sebutan "cepat" juga bukan jaminan universal. Durasi aktual dipengaruhi jumlah berkas, pola impor, plugin, biaya setup, I/O, dan paralelisme. Keuntungan Vitest paling jelas ketika proyek sudah memakai Vite dan dapat menggunakan konfigurasi serta plugin yang sama.

Lihat juga

Sumber