Ujian Mutasi dengan Infection
Ukur sejauh mana kualiti ujian anda sebenarnya.
Ujian Mutasi dengan Infection ialah pelajaran PHP Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran PHP Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Liputan Boleh Menipu
Liputan baris 100% memang meyakinkan, tetapi ia hanya membuktikan bahawa ujian anda melaksanakan kod — bukan bahawa ujian itu akan mengesan pepijat dalamnya. Sesuatu ujian boleh menjalankan satu baris tanpa membuat penegasan yang bermakna. Ujian mutasi mengukur perkara sebenar: adakah ujian anda akan gagal jika kod itu rosak secara halus? Infection ialah alat PHP standard untuk tujuan ini.
composer require --dev infection/infectionIdea Teras: Mutan
Infection mengambil kod yang diliputi dan memperkenalkan kecacatan kecil — mutan. Ia menukar > kepada >=, + kepada -, && kepada ||, membuang return dan sebagainya. Kemudian ia menjalankan semula ujian anda terhadap setiap mutan:
- Jika ujian gagal → mutan dibunuh (baik — ujian anda mengesan kecacatan itu).
- Jika semua ujian lulus → mutan terselamat (buruk — pepijat sebenar di sini tidak akan disedari).
Mutan yang Terselamat dalam Tindakan
Pertimbangkan fungsi ini dan ujian yang lemah. Infection akan menukar >= kepada >. Jika tiada ujian menyemak sempadan tepat (amaun menyamai ambang), mutan itu akan terselamat — mendedahkan kes pinggir yang tidak 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
Membunuh Mutan
Tambahkan penegasan sempadan dan mutan >=-kepada-> itu terbunuh: di bawah kod yang telah dimutasi, 50.0 > 50.0 ialah false, lalu ujian gagal — tepat seperti yang dikehendaki. Ujian mutasi secara langsung memberitahu anda penegasan yang hilang.
<?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 dipacu oleh infection.json5. Anda mengisytiharkan direktori yang hendak dimutasi, lokasi log dan ambang skor minimum untuk meluluskan CI. Halakan source.directories hanya kepada kod produksi — jangan sekali-kali kepada ujian anda.
{
"source": {
"directories": ["src"]
},
"logs": {
"text": "build/infection.log",
"html": "build/infection.html"
},
"mutators": {
"@default": true
},
"minMsi": 80,
"minCoveredMsi": 90
}Metrik MSI
Infection melaporkan Penunjuk Skor Mutasi:
- MSI = mutan yang dibunuh / jumlah mutan. Dikenakan penalti oleh kod tanpa liputan (mutan tersebut tidak boleh dibunuh).
- MSI bagi kod yang diliputi = mutan yang dibunuh / mutan pada baris yang diliputi. Mengukur sejauh mana baiknya penegasan anda pada bahagian yang diuji.
- Liputan Kod Mutasi = jumlah kod yang boleh dimutasi oleh Infection.
Liputan baris yang tinggi tetapi MSI bagi kod yang diliputi rendah ialah petunjuk klasik ujian yang kekurangan penegasan.
Menjalankan Infection dengan Cekap
Ujian mutasi memerlukan banyak sumber — ia menjalankan semula set ujian sekali bagi setiap mutan. Dua peningkatan kelajuan utama: jalankan ujian secara selari dengan --threads, dan mutasikan hanya kod yang disentuh oleh cabang semasa menggunakan penapisan perbezaan Git, sesuai untuk CI pada permintaan gabungan.
vendor/bin/infection --threads=max --git-diff-lines --git-diff-base=origin/mainMembaca Mutan yang Terselamat
Nilainya terletak pada perbezaan yang dicetak oleh Infection bagi setiap mutan yang terselamat. Perbezaan itu menunjukkan baris tepat dan perubahan yang gagal dikesan oleh ujian anda. Anggap mutan yang terselamat sebagai senarai tugasan: sama ada tambahkan penegasan yang hilang, atau akui bahawa mutan itu 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
Sesetengah mutan adalah setara — mutan itu mengubah kod tetapi bukan tingkah laku yang boleh diperhatikan, jadi tiada ujian yang boleh membunuhnya. Mutan ini tidak boleh dibunuh dan menurunkan MSI secara tidak adil. Lumpuhkan pengubah yang diketahui menghasilkan positif palsu pada kod tertentu, bukannya memanipulasi ujian semata-mata untuk mengejarnya.
{
"mutators": {
"@default": true,
"Plus": {
"ignore": ["App\\Math\\Statistics::variance"]
}
}
}Tempat Ujian Mutasi Memberi Manfaat
Oleh sebab ujian ini perlahan, sasarkannya dengan baik:
- Gunakannya pada logik domain teras — penentuan harga, keizinan dan pengiraan — tempat pepijat senyap memerlukan kos yang tinggi.
- Jadikan MSI bagi baris yang diubah dan diliputi sebagai syarat kelulusan permintaan gabungan, bukan MSI seluruh repositori.
- Jangan mengejar 100% secara global; pulangan yang semakin berkurang dan mutan setara menjadikannya pembaziran.
- Gunakannya untuk mencari penegasan yang lemah, kemudian baiki ujian — skor ialah alat, bukan matlamat.
Ia Memerlukan Data Liputan untuk Menjadi Pantas
Infection hanya memutasi baris yang benar-benar diliputi oleh ujian anda, jadi ia menggunakan semula liputan daripada pelancar ujian anda. Dengan Xdebug, proses ini perlahan; pcov jauh lebih pantas untuk liputan baris dan merupakan pemacu yang disyorkan bagi pelaksanaan mutasi. Infection juga boleh menjana liputan itu sendiri atau menggunakan laporan liputan yang telah anda hasilkan dalam 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-testsSemakan Pantas
Apakah yang ditunjukkan oleh mutan yang terselamat?
Ringkasan
Anda telah belajar mengukur kualiti ujian, bukan kuantitinya sahaja:
- Ujian mutasi menyuntik kecacatan kecil (mutan); dibunuh = dikesan, terselamat = terdapat jurang.
- Liputan menunjukkan pelaksanaan; MSI bagi kod yang diliputi menunjukkan kekuatan penegasan.
- Konfigurasikan melalui
infection.json5dengan ambang MSI; jalankan dengan--threadsdan penapisan perbezaan Git untuk mendapatkan kelajuan. - Mutan yang terselamat ialah senarai tugasan; perhatikan mutan setara dan abaikannya dengan sengaja.
- Sasarkan logik teras dan jadikan MSI bagi baris yang diubah sebagai syarat kelulusan permintaan gabungan, bukannya mengejar 100% global.
Pelajari PHP dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 49
- Pelajaran
- 195
Soalan Lazim
Adakah pelajaran “Ujian Mutasi dengan Infection” percuma?
Ya — teks penuh “Ujian Mutasi dengan Infection” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus PHP Academy, tingkat taraf kepada CoddyKit PRO. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Ujian Mutasi dengan Infection”?
Ukur sejauh mana kualiti ujian anda sebenarnya. Anda berlatih PHP Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan PHP Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran PHP Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Ujian Mutasi dengan Infection” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Aliran Kerja Pembangunan Dipacu Ujian
- Penciptaan Mock dan Stub dengan Mockery
- Ujian Integrasi dan Fungsian
- Ujian Mutasi dengan Infection