Pengujian Mutasi dengan Infection
Ukur seberapa baik pengujian Anda sebenarnya.
Pengujian Mutasi dengan Infection adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.
Cakupan Bisa Menyesatkan
Cakupan baris 100% terasa meyakinkan, tetapi itu hanya membuktikan bahwa pengujian Anda menjalankan kode—bukan bahwa pengujian tersebut akan menemukan galat di dalamnya. Suatu pengujian dapat menjalankan sebuah baris tanpa melakukan pemeriksaan yang berarti. Pengujian mutasi mengukur hal yang sebenarnya: apakah pengujian Anda akan gagal jika kode tersebut rusak secara halus? Infection adalah alat PHP standar untuk hal ini.
composer require --dev infection/infectionGagasan Inti: Mutan
Infection mengambil kode yang tercakup lalu memasukkan kerusakan kecil—mutan. Infection mengubah > menjadi >=, + menjadi -, && menjadi ||, menghapus sebuah return, dan sebagainya. Setelah itu, Infection menjalankan kembali pengujian Anda terhadap setiap mutan:
- Jika pengujian gagal → mutan tersebut dimatikan (bagus—pengujian Anda menemukan kerusakannya).
- Jika semua pengujian berhasil → mutan tersebut bertahan (buruk—galat nyata di sini tidak akan terdeteksi).
Contoh Mutan yang Bertahan
Perhatikan fungsi ini dan pengujian yang lemah. Infection akan memutasi >= menjadi >. Jika tidak ada pengujian yang memeriksa batas tepat (jumlah sama dengan ambang), mutan tersebut akan bertahan—mengungkapkan kasus batas yang belum diuji.
<?php
function qualifiesForFreeShipping(float $total): bool
{
return $total >= 50.0; // Infection mutates >= to >
}
// Weak test only checks 100 and 10 -> never tests exactly 50.0
var_dump(qualifiesForFreeShipping(100.0)); // true
var_dump(qualifiesForFreeShipping(10.0)); // false
var_dump(qualifiesForFreeShipping(50.0)); // true <-- the boundary the mutant exposes
Mematikan Mutan
Tambahkan asersi batas, dan mutan >=-menjadi-> akan mati: pada kode yang dimutasi, 50.0 > 50.0 bernilai false, sehingga pengujian gagal—tepat seperti yang kita inginkan. Pengujian mutasi secara harfiah memberi tahu Anda asersi mana yang belum ada.
<?php
use PHPUnit\Framework\TestCase;
final class ShippingTest extends TestCase
{
public function test_threshold_is_inclusive(): void
{
// Kills the >= -> > mutant
self::assertTrue(qualifiesForFreeShipping(50.0));
}
}
Konfigurasi: infection.json
Infection dikendalikan oleh infection.json5. Anda menyatakan direktori mana yang akan dimutasi, lokasi penyimpanan catatan, serta ambang skor minimum agar CI berhasil. Arahkan source.directories hanya ke kode produksi—jangan pernah ke pengujian Anda.
{
"source": {
"directories": ["src"]
},
"logs": {
"text": "build/infection.log",
"html": "build/infection.html"
},
"mutators": {
"@default": true
},
"minMsi": 80,
"minCoveredMsi": 90
}Metrik MSI
Infection melaporkan Indikator Skor Mutasi:
- MSI = mutan yang dimatikan / total mutan. Nilainya dikurangi oleh kode yang tidak tercakup (mutan tersebut tidak dapat dimatikan).
- MSI untuk Baris Tercakup = mutan yang dimatikan / mutan pada baris yang tercakup. Metrik ini mengukur kualitas asersi pada bagian yang memang Anda uji.
- Cakupan Kode Mutasi = seberapa banyak kode yang dapat dimutasi oleh Infection.
Cakupan baris yang tinggi tetapi MSI untuk Baris Tercakup yang rendah adalah tanda klasik pengujian dengan asersi yang minim.
Menjalankan Infection secara Efisien
Pengujian mutasi membutuhkan banyak sumber daya karena menjalankan kembali kelompok pengujian sekali untuk setiap mutan. Dua cara utama untuk mempercepatnya adalah menjalankan pengujian secara paralel dengan --threads, serta hanya memutasi kode yang disentuh oleh cabang saat ini menggunakan penyaringan perbedaan Git, yang ideal untuk CI pada permintaan perubahan.
vendor/bin/infection --threads=max --git-diff-lines --git-diff-base=origin/mainMembaca Mutan yang Bertahan
Nilai utamanya terdapat pada perbedaan yang ditampilkan Infection untuk setiap mutan yang bertahan. Perbedaan tersebut menunjukkan baris yang tepat dan perubahan yang gagal dideteksi oleh pengujian Anda. Perlakukan mutan yang bertahan sebagai daftar tugas: tambahkan asersi yang kurang, atau kenali bahwa mutan tersebut tidak berbahaya (mutan setara).
- return $total >= 50.0;
+ return $total > 50.0;
# Mutant survived: no test asserts the inclusive boundary (total === 50.0)Mutan Setara dan Pengabaian
Beberapa mutan bersifat setara—mutan tersebut mengubah kode, tetapi tidak mengubah perilaku yang dapat diamati, sehingga tidak ada pengujian yang mungkin dapat mematikannya. Mutan ini memang tidak dapat dimatikan dan secara tidak adil menurunkan MSI. Nonaktifkan operator mutasi yang diketahui menghasilkan positif palsu pada kode tertentu, alih-alih merekayasa pengujian hanya untuk mengejarnya.
{
"mutators": {
"@default": true,
"Plus": {
"ignore": ["App\\Math\\Statistics::variance"]
}
}
}Kapan Pengujian Mutasi Bermanfaat
Karena prosesnya lambat, arahkan pengujian dengan baik:
- Terapkan pada logika domain inti—penetapan harga, izin, dan perhitungan—yang galat diam-diamnya dapat menimbulkan kerugian besar.
- Jadikan MSI untuk baris yang berubah sebagai syarat penerimaan permintaan perubahan, bukan seluruh repositori.
- Jangan mengejar 100% secara global; manfaat yang makin berkurang dan mutan setara membuatnya boros.
- Gunakan pengujian ini untuk menemukan asersi yang lemah, lalu perbaiki pengujiannya—skor adalah sarana, bukan tujuan.
Membutuhkan Data Cakupan agar Cepat
Infection hanya memutasi baris yang benar-benar tercakup oleh pengujian Anda, sehingga Infection menggunakan kembali cakupan dari pelaksana pengujian. Dengan Xdebug, proses ini lambat; pcov jauh lebih cepat untuk cakupan baris dan merupakan penggerak yang disarankan untuk menjalankan pengujian mutasi. Infection juga dapat membuat cakupan sendiri atau menggunakan laporan cakupan yang sudah Anda hasilkan di CI.
# Faster mutation runs: use pcov instead of Xdebug for coverage
php -d pcov.enabled=1 vendor/bin/infection --threads=max
# Or reuse coverage already generated by your PHPUnit step:
vendor/bin/infection --coverage=build/coverage --skip-initial-testsPemeriksaan Cepat
Apa yang diberitahukan oleh mutan yang bertahan kepada Anda?
Ringkasan
Anda telah mempelajari cara mengukur kualitas pengujian, bukan hanya kuantitasnya:
- Pengujian mutasi memasukkan kerusakan kecil (mutan); mutan yang dimatikan berarti kerusakan terdeteksi, sedangkan mutan yang bertahan berarti ada celah.
- Cakupan menunjukkan pelaksanaan; MSI untuk Baris Tercakup menunjukkan kekuatan asersi.
- Konfigurasikan melalui
infection.json5dengan ambang MSI; jalankan dengan--threadsdan penyaringan berdasarkan perbedaan Git agar lebih cepat. - Mutan yang bertahan adalah daftar tugas; perhatikan mutan setara dan abaikan secara sengaja.
- Arahkan pengujian ke logika inti dan jadikan MSI untuk baris yang berubah sebagai syarat penerimaan permintaan perubahan, alih-alih mengejar 100% secara global.
Belajar PHP dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 49
- Pelajaran
- 195
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengujian Mutasi dengan Infection” gratis?
Ya — teks lengkap “Pengujian Mutasi dengan Infection” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengujian Mutasi dengan Infection”?
Ukur seberapa baik pengujian Anda sebenarnya. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai PHP Academy?
Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Pengujian Mutasi dengan Infection” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Alur Kerja Pengembangan Berbasis Pengujian
- Pemalsuan dan Penggantian dengan Mockery
- Pengujian Integrasi dan Fungsional
- Pengujian Mutasi dengan Infection