🔍검색

Beranda › Panduan

False Kill pada Mutation Testing: Baseline, Akses File, Alasan Kill

Terbit 2026-10-27

Mutation testing sengaja mengubah kode Anda (< menjadi <=, return x menjadi return None) dan memeriksa apakah tes Anda menyadarinya. Mutan yang "killed" berarti ada tes yang gagal. Namun sebuah tes bisa gagal karena alasan yang tidak ada hubungannya dengan mutasi — dan skor mutasi Anda jadi tampak lebih baik daripada kualitas tes yang sebenarnya. Panduan ini menunjukkan tiga pemeriksaan untuk menangkap false kill tersebut.

Mengapa false kill terjadi

PenyebabYang Anda lihat
Suite tes sudah gagal atau tidak stabil (flaky) sebelum mutasiBanyak kill dengan error tak terkait yang sama
Tes mengimpor file asli, bukan salinan yang dimutasiKill hanya dari timeout atau error lingkungan
Timeout akibat mesin yang lambatKill menggumpal pada tes yang berjalan lama
State bersama antarproses (file sementara, cache, port)Hasil kill berubah saat mutan yang sama dijalankan ulang

Timeout berpengaruh pada skor: di Stryker, detected = killed + timeout, dan mutation score = detected / valid × 100. Mesin yang sering timeout menggelembungkan skor. Sumber: Stryker mutant states and metrics, diperiksa 2026-10-19.

Pemeriksaan 1 — Baseline pada salinan bersih

  1. Salin proyek ke direktori baru, persis seperti yang akan dilakukan alat mutasi (sandbox sama, variabel lingkungan sama).
  2. Jalankan seluruh suite tes di sana tanpa mutasi, tiga kali.
  3. Semuanya harus lulus ketiga kalinya. Kegagalan apa pun di sini adalah kegagalan yang sudah ada sebelumnya dan akan muncul sebagai kill palsu nanti — perbaiki atau karantina dulu.
cp -r project /tmp/mt-baseline && cd /tmp/mt-baseline
for i in 1 2 3; do pytest -q -p no:cacheprovider || echo "BASELINE FAIL $i"; done

Pemeriksaan 2 — Buktikan tes membaca file yang dimutasi

Jika sebuah tes tidak pernah memuat file yang dimutasi, ia tidak mungkin membunuh mutan itu. Catat akses file selama setiap proses mutan. Di Python, audit hook sudah cukup:

# conftest.py
import sys, os
TARGET = os.environ.get("MUT_TARGET")  # path of the mutated file
def hook(event, args):
    if event == "open" and TARGET and str(args[0]).endswith(TARGET):
        open("/tmp/mut_touched", "a").write("1")
sys.addaudithook(hook)

Jalankan setiap mutan dengan bytecode usang dihapus (hapus __pycache__ di salinan) agar file sumber benar-benar dibaca. Aturannya: kill yang file targetnya tidak pernah dibuka ditandai suspect dan dijalankan ulang. Pada stack lain, strace -e trace=openat (Linux) atau data coverage dari test runner memenuhi tujuan yang sama.

Pemeriksaan 3 — Lihat distribusi alasan kill

  1. Untuk setiap mutan yang di-kill, simpan mengapa prosesnya gagal: assertion error, exception lain, timeout, crash, error collection/impor.
  2. Buat tabel hitungan sederhana.
AlasanPola sehatTanda bahaya
Kegagalan assertionSebagian besar kill—
Exception lainSebagianSatu pesan identik pada banyak mutan
TimeoutSedikit (mutan loop tak berujung)Porsi besar; naik di mesin yang lebih lambat
Error impor / collectionHampir tidak adaPorsi yang berarti — harness-nya, bukan tesnya, yang gagal

Menyatukan semuanya

FAQ

Haruskah saya menaikkan timeout?
Tentukan dari baseline: ukur waktu suite normal, lalu izinkan kelipatannya. Terlalu rendah menimbulkan kill palsu; terlalu tinggi memperlambat proses.
Apakah error kompilasi dihitung?
Di Stryker, error kompilasi dan runtime adalah mutan "invalid" dan tidak termasuk dalam skor.

Sumber

Terkait (bahasa Korea): 개발 지식 모음 (bahasa Korea)

🌐 English · Español · Bahasa Indonesia · 日本語 · ไทย · Tiếng Việt · 中文

📤 공유