Apa itu Test Coverage?
Test coverage (code coverage) mengukur persentase kode yang dieksekusi saat menjalankan test suite. Ini memberikan gambaran seberapa banyak kode yang sudah diuji — tapi bukan seberapa baik kode diuji.
Jenis Metrik Coverage
- Line coverage — persentase baris kode yang dieksekusi
- Branch coverage — persentase cabang (if/else, switch, ternary) yang diuji
- Function coverage — persentase fungsi/method yang dipanggil
- Statement coverage — persentase statement yang dieksekusi (mirip line, tapi satu baris bisa punya beberapa statement)
Coverage di Vitest
Vitest mendukung dua provider coverage: V8 (cepat, default) dan Istanbul (lebih detail):
# Install provider
npm install -D @vitest/coverage-v8
# atau
npm install -D @vitest/coverage-istanbul
# Jalankan dengan coverage
npx vitest --coverage
Konfigurasi Coverage
// vitest.config.ts
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
coverage: {
provider: "v8",
reporter: ["text", "html", "lcov"],
include: ["src/**/*.{ts,tsx}"],
exclude: ["src/**/*.test.ts", "src/**/*.d.ts"],
thresholds: {
lines: 80,
branches: 75,
functions: 80,
statements: 80,
},
},
},
});
Dengan thresholds, CI akan gagal jika coverage turun di bawah batas yang ditentukan.
Membaca Laporan Coverage
---------------------|---------|----------|---------|---------|
File | % Stmts | % Branch | % Funcs | % Lines |
---------------------|---------|----------|---------|---------|
All files | 85.71 | 78.57 | 90.00 | 85.71 |
src/utils/math.ts | 100.00 | 100.00 | 100.00 | 100.00 |
src/utils/format.ts | 66.67 | 50.00 | 75.00 | 66.67 |
---------------------|---------|----------|---------|---------|
Buka coverage/index.html untuk laporan visual — baris yang belum diuji ditandai merah.
Apa yang 100% Coverage TIDAK Jamin
- Bukan jaminan bebas bug — test bisa melewati semua baris tapi tidak menguji edge case
- Bukan ukuran kualitas test — test tanpa assertion tetap dihitung coverage
- Bukan pengganti code review — coverage tidak mendeteksi logic error jika test expectation-nya salah
Contoh: 100% Coverage Tapi Tetap Bug
function bagi(a, b) {
return a / b;
}
// Test ini memberikan 100% coverage
test("bagi 10 / 2", () => {
expect(bagi(10, 2)).toBe(5); // PASS
});
// Tapi TIDAK menguji pembagian dengan 0!
// bagi(10, 0) → Infinity (bug!)
Strategi Coverage yang Bermakna
- Fokus pada branch coverage — lebih bermakna daripada line coverage
- Prioritaskan kode bisnis — abaikan boilerplate, konfigurasi, dan type definitions
- Target 80% untuk kode kritis — lebih realistis daripada mengejar 100%
- Gunakan coverage sebagai panduan — temukan area yang belum diuji, bukan sebagai metrik keberhasilan
- Jangan tulis test hanya untuk menaikkan coverage — tulis test yang bermakna dan menguji behavior