Paket ini tidak digunakan lagi, lihat Infeksi saja.
Humbug adalah kerangka Pengujian Mutasi untuk PHP. Saat ini masih dalam tahap pengembangan, jadi meskipun berfungsi dengan baik, ia akan memiliki sisi buruk yang harus diselesaikan dengan susah payah oleh tim minion. Jika jatuh dari gerbang, Anda telah diperingatkan ;).
$ git remote set-url upstream https://github.com/humbug/humbug.git
Ganti upstream
dengan nama remote yang Anda gunakan secara lokal; upstream
biasanya digunakan tetapi Anda mungkin menggunakan sesuatu yang lain. Anda juga dapat menggunakan URL yang berbeda (misalnya [email protected]:mockery/mockery.git). Jalankan git remote -v
untuk melihat apa yang sebenarnya Anda gunakan.
Daftar isi
Singkatnya, Pengujian Mutasi adalah membuat pengujian unit Anda menghasilkan uang. Ini melibatkan memasukkan cacat kecil ke dalam kode sumber dan kemudian memeriksa apakah pengujian unit menyadarinya. Jika ya, maka pengujian unit Anda telah "membunuh" mutasi tersebut. Jika tidak, mutasi tersebut lolos dari deteksi. Karena pengujian unit dimaksudkan untuk mencegah regresi, melewati regresi nyata tanpa diketahui akan menjadi hal yang buruk!
Cakupan Kode dapat memberi tahu Anda kode apa yang dijalankan pengujian Anda, sedangkan Pengujian Mutasi dimaksudkan untuk membantu Anda menilai seberapa baik kinerja pengujian unit Anda dan di mana pengujian tersebut dapat ditingkatkan.
Saya telah menulis lebih detail tentang mengapa Pengujian Mutasi layak dilakukan: Kebohongan, Kebohongan Terkutuk, dan Cakupan Kode: Menuju Pengujian Mutasi
Humbug adalah proyek sumber terbuka yang menerima permintaan tarik dan masalah dari siapa pun. Sebelum membuka permintaan penarikan, harap baca Panduan Kontribusi singkat kami.
Anda dapat mengkloning dan menginstal dependensi Humbug menggunakan Composer:
git clone https://github.com/humbug/humbug.git
cd humbug
/path/to/composer.phar install
Perintah humbug sekarang ada di bin/humbug.
Jika Anda tidak ingin melacak cabang master secara langsung, Anda dapat menginstal Humbug phar sebagai berikut:
wget https://padraic.github.io/humbug/downloads/humbug.phar
wget https://padraic.github.io/humbug/downloads/humbug.phar.pubkey
# If you wish to make humbug.phar directly executable
chmod +x humbug.phar
Di Windows, Anda cukup mengunduh menggunakan browser atau dari Powershell v3 menggunakan perintah berikut di mana wget
adalah alias untuk Invoke-WebRequest
:
wget https://padraic.github.io/humbug/downloads/humbug.phar -OutFile humbug.phar
wget https://padraic.github.io/humbug/downloads/humbug.phar.pubkey -OutFile humbug.phar.pubkey
Jika Anda terjebak dengan Powershell v2:
$client = new-object System.Net.WebClient
$client .DownloadFile( " https://padraic.github.io/humbug/downloads/humbug.phar " , " humbug.phar " )
$client .DownloadFile( " https://padraic.github.io/humbug/downloads/humbug.phar.pubkey " , " humbug.phar.pubkey " )
Phar ditandatangani dengan kunci pribadi openssl. Anda memerlukan file pubkey untuk disimpan di samping file phar setiap saat agar dapat menggunakannya. Jika Anda mengganti nama humbug.phar
menjadi humbug
, misalnya, maka ganti juga nama kunci dari humbug.phar.pubkey
menjadi humbug.pubkey
.
Rilis phar saat ini dilakukan secara manual sehingga tidak akan diperbarui dengan frekuensi yang sama seperti git master. Untuk memperbarui phar Anda saat ini, jalankan saja:
./humbug.phar self-update
Catatan: Menggunakan phar berarti perbaikan mungkin memerlukan waktu lebih lama untuk mencapai versi Anda, namun ada jaminan lebih untuk memiliki versi pengembangan yang stabil. Kunci publik hanya diunduh sekali. Ini digunakan kembali dengan pembaruan mandiri untuk memverifikasi rilis phar di masa depan.
Setelah rilis dimulai menuju stabil, akan ada rilis alfa, beta, RC, dan final. File phar jalur pengembangan Anda akan diperbarui secara otomatis hingga mencapai rilis stabil. Jika Anda ingin terus melacak phar tingkat pengembangan, Anda perlu menunjukkannya menggunakan salah satu tanda stabilitas:
./humbug.phar self-update --dev
Jika Anda mengalami masalah pembaruan otomatis dengan kesalahan openssl
atau SSL yang tidak terduga, pastikan Anda telah mengaktifkan ekstensi openssl
. Di Windows, Anda dapat melakukan ini dengan menambahkan atau menghapus komentar pada baris berikut di file php.ini
untuk PHP pada baris perintah (jika berbeda dengan file untuk server http Anda):
extension=php_openssl.dll
Kesalahan SSL tertentu lainnya mungkin timbul karena sertifikat hilang. Anda dapat memperbaikinya dengan mencari lokasinya di sistem Anda (misalnya C:/xampp/php/ext/cacert.pem
), atau sebagai alternatif, mengunduh salinannya dari http://curl.haxx.se/ca/cacert.pem. Kemudian pastikan opsi berikut mengarah dengan benar ke file ini:
openssl.cafile=C:/path/to/cacert.pem
Karena dependensi Humbug dipatok ke versi terbaru, menambahkan Humbug ke composer.json dapat menimbulkan konflik. Dua metode instalasi di atas lebih disukai jika hal ini terjadi. Namun Anda dapat menginstalnya secara global seperti alat serba guna lainnya:
composer global require ' humbug/humbug=~1.0@dev '
Dan jika Anda belum pernah melakukannya...tambahkan ini ke ~/.bash_profile
(atau ~/.bashrc
):
export PATH= ~ /.composer/vendor/bin: $PATH
Humbug saat ini berfungsi pada PHP 5.4 atau lebih tinggi.
Humbug masih dalam pengembangan jadi, sekali lagi, waspadalah terhadap sisi kasarnya.
Untuk mengonfigurasi omong kosong di proyek Anda, Anda dapat menjalankan:
humbug configure
Alat ini akan menanyakan beberapa pertanyaan yang diperlukan untuk membuat file konfigurasi Humbug ( humbug.json.dist
).
Di direktori dasar proyek Anda, buat file humbug.json.dist
:
{
"timeout" : 10 ,
"source" : {
"directories" : [
"src"
]
} ,
"logs" : {
"text" : "humbuglog.txt" ,
"json" : "humbuglog.json"
}
}
Anda dapat memasukkan humbug.json.dist
ke VCS Anda dan menimpanya secara lokal dengan file humbug.json
.
Sunting seperlunya. Jika Anda tidak menentukan setidaknya satu log, informasi rinci tentang mutan yang lolos tidak akan tersedia. Log Teks dapat dibaca manusia. Jika file sumber ada di direktori dasar, atau file di direktori sumber harus dikecualikan, Anda dapat menambahkan pola pengecualian (inilah pola untuk file di direktori dasar di mana vendor komposer dan direktori Tes dikecualikan):
{
"timeout" : 10 ,
"source" : {
"directories" : [
"."
] ,
"excludes" : [
"vendor" ,
"Tests"
]
} ,
"logs" : {
"text" : "humbuglog.txt"
}
}
Jika, dari direktori dasar proyek Anda, Anda harus menjalankan pengujian dari direktori lain, maka Anda juga dapat memberi sinyal ini. Anda tidak perlu menjalankan Humbug dari direktori mana pun selain direktori dasar proyek Anda.
{
"chdir" : "tests" ,
"timeout" : 10 ,
"source" : {
"directories" : [
"src"
] ,
}
}
Pastikan semua tes Anda dalam keadaan lulus (tes yang tidak lengkap dan dilewati diperbolehkan). Humbug akan berhenti jika salah satu pengujian Anda gagal.
Perintah ajaibnya, saat berada di direktori dasar proyek Anda (menggunakan unduhan PHAR) adalah:
./humbug.phar
atau jika Anda baru saja mengkloning Humbug:
../humbug/bin/humbug
atau jika Anda menambahkan Humbug sebagai ketergantungan komposer pada proyek Anda:
./vendor/bin/humbug
Selain php dengan ekstensi xdebug Anda juga dapat menjalankan Humbug melalui phpdbg:
phpdbg -qrr humbug.phar
Jika semuanya berjalan dengan baik, Anda akan mendapatkan sesuatu seperti:
_ _ _
| || |_ _ _ __ | |__ _ _ __ _
| __ | || | ' | '_ || / _` |
|_||_|_,_|_|_|_|_.__/_,___, |
|___/
Humbug version 1.0-dev
Humbug running test suite to generate logs and code coverage data...
361 [==========================================================] 28 secs
Humbug has completed the initial test run successfully.
Tests: 361 Line Coverage: 64.86%
Humbug is analysing source files...
Mutation Testing is commencing on 78 files...
(.: killed, M: escaped, S: uncovered, E: fatal error, T: timed out)
.....M.M..EMMMMMSSSSMMMMMSMMMMMSSSE.ESSSSSSSSSSSSSSSSSM..M.. | 60 ( 7/78)
...MM.ES..SSSSSSSSSS...MMM.MEMME.SSSS.............SSMMSSSSM. | 120 (12/78)
M.M.M...TT.M...T.MM....S.....SSS..M..SMMSM...........M...... | 180 (17/78)
MM...M...ESSSEM..MMM.M.MM...SSS.SS.M.SMMMMMMM..SMMMMS....... | 240 (24/78)
.........SMMMSMMMM.MM..M.SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS | 300 (26/78)
SSSSSSSSM..E....S......SS......M.SS..S..M...SSSSSSSS....MMM. | 360 (37/78)
.M....MM..SM..S..SSSSSSSS.EM.S.E.M............M.....M.SM.M.M | 420 (45/78)
..M....MMS...MMSSS................M.....EME....SEMS...SSSSSS | 480 (52/78)
SSSSS.EMSSSSM..M.MMMM...SSE.....MMM.M..MM..MSSSSSSSSSSSSSSSS | 540 (60/78)
SSS....SSSSSSSSMM.SSS..........S..M..MSSMS.SSSSSSSSSSSSSSSSS | 600 (68/78)
......E...M..........SM.....M..MMMMM.MMMMMSSSSSSSM.SS
653 mutations were generated:
284 mutants were killed
218 mutants were not covered by tests
131 covered mutants were not detected
17 fatal errors were encountered
3 time outs were encountered
Metrics:
Mutation Score Indicator (MSI): 47%
Mutation Code Coverage: 67%
Covered Code MSI: 70%
Remember that some mutants will inevitably be harmless (i.e. false positives).
Humbug results are being logged as JSON to: log.json
Humbug results are being logged as TEXT to: log.txt
Untuk menjelaskan keluaran kemajuan yang mungkin samar:
Pembunuhan, kesalahan, dan batas waktu semuanya dihitung sebagai mutasi yang terdeteksi. Kami melaporkan kesalahan dalam log jika Humbug sendiri mengalami kesalahan internal, yaitu bug yang akan dilaporkan sebagai masalah di sini!
Contoh hasil ringkasan melaporkan sejumlah skor metrik:
Jika Anda memeriksa metrik ini, masalah yang menonjol adalah MSI sebesar 47% adalah 18 poin lebih rendah dari Cakupan Kode yang dilaporkan sebesar 65%. Pengujian unit ini jauh kurang efektif dibandingkan yang dapat dideteksi oleh Cakupan Kode saja.
Menafsirkan hasil ini memerlukan konteks tertentu. Log akan mencantumkan semua mutasi yang tidak terdeteksi sebagai perbedaan dengan kode sumber aslinya. Meneliti hal ini akan memberikan wawasan lebih lanjut mengenai mutasi spesifik apa yang tidak terdeteksi.
Humbug memiliki beberapa opsi baris perintah yang perlu diperhatikan, selain yang biasanya dikaitkan dengan aplikasi Konsol Symfony.
Anda dapat mengatur ambang batas waktu secara manual untuk setiap pengujian:
humbug --timeout=10
Jika Anda hanya tertarik untuk memutasikan sebagian file, Anda dapat meneruskan sejumlah opsi --file
yang berisi nama file sederhana, gumpalan, atau ekspresi reguler. Pada dasarnya, ini semua diteruskan ke metode name()
Symfony Finder.
humbug --file=NewClass.php --file= * Driver.php
Hal ini sama sekali tidak membatasi pemeriksaan Humbug awal pada keseluruhan rangkaian pengujian yang masih dijalankan secara penuh untuk memastikan semua pengujian lulus dengan benar sebelum melanjutkan.
Jika Anda hanya ingin memutasi beberapa file tertentu, Anda dapat meneruskan sejumlah opsi --path
yang berisi nama file path lengkap. Opsi ini akan diteruskan ke filter Closure
yang akan memotong file yang ditemukan menggunakan opsi config dan/atau --file
dengan file yang Anda sediakan menggunakan opsi --path
.
humbug --path=src/Data/NewClass.php --path=src/Driver/Driver.php
Catatan: Ini sama sekali tidak membatasi pemeriksaan Humbug awal pada keseluruhan rangkaian pengujian yang masih dijalankan secara penuh untuk memastikan semua pengujian lulus dengan benar sebelum melanjutkan.
Analisis Inkremental (IA) adalah mode operasi eksperimental yang belum selesai di mana hasilnya disimpan dalam cache secara lokal di antara proses yang dijalankan dan digunakan kembali jika memungkinkan. Saat ini, mode ini beroperasi dengan sangat naif dengan menghilangkan proses pengujian yang mana file langsung sedang dimutasi dan pengujian yang relevan untuk baris yang bermutasi belum diubah sejak proses terakhir (sebagaimana ditentukan dengan membandingkan SHA1 dari file yang terlibat).
humbug --incremental
Mode IA menawarkan peningkatan performa yang signifikan untuk basis kode yang relatif stabil, dan Anda bebas mengujinya serta melihat performanya di kehidupan nyata. Di masa depan, ia perlu mempertimbangkan perubahan dalam file yang berisi kelas induk, sifat yang diimpor, dan kelas ketergantungan langsungnya, yang semuanya berdampak pada perilaku objek tertentu.
IA menggunakan cache permanen lokal, misalnya /home/padraic/.humbug
.
Pengujian Mutasi secara tradisional berjalan lambat. Konsepnya adalah menjalankan kembali rangkaian pengujian Anda untuk setiap mutasi yang dihasilkan. Untuk mempercepat secara signifikan, Humbug melakukan hal berikut:
Meskipun semua ini mempercepat Humbug, perlu diketahui bahwa proses Humbug akan lebih lambat dibandingkan pengujian unit. Rangkaian pengujian 2 detik mungkin memerlukan 30 detik untuk pengujian mutasi. Atau 5 menit. Itu semua tergantung pada interaksi antar baris kode, jumlah pengujian, tingkat cakupan kode, dan performa kode dan pengujian.
Humbug mengimplementasikan rangkaian dasar Mutator, yang pada dasarnya memberi tahu kita kapan token PHP tertentu dapat dimutasi, dan juga menerapkan mutasi tersebut ke serangkaian token.
Catatan: Kode sumber yang disimpan dalam fungsi (bukan metode kelas) tidak dimutasi saat ini.
Aritmatika Biner:
Asli | Bermutasi | Asli | Bermutasi |
---|---|---|---|
+ | - | /= | *= |
- | + | %= | *= |
* | / | **= | /= |
/ | * | & | | |
% | * | | | & |
** | / | ^ | & |
+= | -= | ~ | |
-= | += | >> | << |
*= | /= | << | >> |
Substitusi Boolean:
Ini untuk sementara mencakup mutator logis.
Asli | Bermutasi |
---|---|
BENAR | PALSU |
PALSU | BENAR |
&& | || |
|| | && |
Dan | atau |
atau | Dan |
! |
Batasan Bersyarat:
Asli | Bermutasi |
---|---|
> | >= |
< | <= |
>= | > |
<= | < |
Persyaratan yang Dinegasikan:
Asli | Bermutasi | Asli | Bermutasi |
---|---|---|---|
== | != | > | <= |
!= | == | < | >= |
<> | == | >= | < |
=== | !== | <= | > |
!== | === |
Peningkatan:
Asli | Bermutasi |
---|---|
++ | -- |
-- | ++ |
Nilai Pengembalian:
Asli | Bermutasi | Asli | Bermutasi |
---|---|---|---|
kembali benar; | kembali salah; | kembali 1.0>; | kembali -( + 1); |
kembali salah; | kembali benar; | kembalikan $ini; | kembalikan nol; |
kembali 0; | kembali 1; | mengembalikan fungsi(); | fungsi(); kembalikan nol; |
kembali ; | kembali 0; | kembalikan Kelas baru; | Kelas baru; kembalikan nol; |
kembali 0,0; | kembali 1.0; | kembali ( Anything ); | ( Anything ); kembalikan nol; |
kembali 1.0; | kembali 0,0; |
Angka Harafiah:
Asli | Bermutasi |
---|---|
0 | 1 |
1 | 0 |
Ke dalam > 1 | Int+1 |
Mengambang >= 1 / <= 2 | Mengambang + 1 |
Mengambang> 2 | 1 |
Jika Pernyataan:
Semua pernyataan if sebagian besar dicakup oleh mutator sebelumnya, namun ada kasus khusus seperti menggunakan fungsi asli atau metode kelas tanpa perbandingan atau operasi apa pun, misalnya is_int()
atau in_array()
. Ini tidak akan mencakup fungsi yang ditentukan dalam file karena fungsi tersebut tidak ada hingga waktu proses (sesuatu yang lain untuk dikerjakan!).
Asli | Bermutasi |
---|---|
jika(adalah_int(1)) | jika(!is_int(1)) |
Lebih banyak Mutator akan ditambahkan seiring waktu.
bin/humbug stats ../my-project/humbuglog.json ../my-project/list-of-classes.txt --skip-killed=yes [-vvv]
Mengurai statistik dari humbuglog.json atau log JSON bernama khusus Anda.
Referensi CLI:
humbug stats [humbuglog.json location] [class list location] [--skip-killed = yes] [-vvv]
humbuglog.json location, defaults to ./humbuglog.json
class list location, a path to a text file containing full class names, one per line.
only this files-related stats would be shown
--skip-killed=yes is used to completely skip output of "killed" section
various verbosity levels define amount of info to be displayed:
by default, there's one line per class with amount of mutants killed/escaped/errored/timed out (depending on output section)
-v adds one line per each mutant with line number and method name
-vv adds extra line for each mutant, displaying diff view of line mutant is detected in
-vvv shows full diff with several lines before and after
Ini dapat diuji pada omong kosong itu sendiri, dengan menjalankan direktori omong kosong:
statistik bin/omong kosong bin/omong kosong [-vvv]
Ini adalah daftar singkat masalah umum:
Atas perkenan Craig Davis yang melihat potensi dalam repositori yang dulunya kosong :P.
.:::::::::::...
.::::::::::::::::::::.
.::::::::::::::::::::::::.
::::::::::::::::::::::::::::.
::::::::::::::::::::::::::::::: .,uuu ...
:::::::::::::::::::::::::::::::: dHHHHHLdHHHHb
....:::::::'` ::::::::::::::::::' uHHHHHHHHHHHHHF
.uHHHHHHHHH' ::::::::::::::`. uHHHHHHHHHHHHHP"
HHHHHHHHHHH `:::::::::::',dHHuHHHHHHHHP".g@@g
J"HHHHHHHHHP 4H ::::::::' u$$$.
".HHHHHHHHP" .,uHP :::::' uHHHHHHHHHHP"",e$$$$$c
HHHHHHHF' dHHHHf `````.HHHHHHHHHHP",d$$$$$$$P%C
.dHHHP"" JHHHHbuuuu,JHHHHHHHHP",d$$$$$$$$$e=,z$$$$$$$$ee..
"" .HHHHHHHHHHHHHHHHHP",gdP" ..3$$$Jd$$$$$$$$$$$$$$e.
dHHHHHHHHHHHHHHP".edP " .zd$$$$$$$$$$$"3$$$$$$$$c
`???""??HHHHP",e$$F" .d$,?$$$$$$$$$$$$$F d$$$$$$$$F"
?be.eze$$$$$".d$$$$ $$$E$$$$P".,ede`?$$$$$$$$
4."?$$$$$$$ z$$$$$$ $$$$r.,.e ?$$$$ $$$$$$$$$
'$c "$$$$ .d$$$$$$$ 3$$$.$$$$ 4$$$ d$$$$P"`,,
"""- "$$".`$$" " $$f,d$$P".$$P zeee.zd$$$$$.
ze. .C$C"=^" ..$$$$$$P".$$$'e$$$$$P?$$$$$$
.e$$$$$$$"="$f",c,3eee$$$$$$$$P $$$P'd$$$$"..::.."?$%
4d$$$P d$$$dF.d$$$$$$$$$$$$$$$$f $$$ d$$$" :::::::::.
$$$$$$ d$$$$$ $$$$$$$$$$$$$$$$$$ J$$",$$$'.::::::::::::
"$$$$$$ ?$$$$ d$$$$$$$$$$$$$$$P".dP'e$$$$':::::::::::::::
4$$$$$$c $$$$b`$$$$$$$$$$$P"",e$$",$$$$$' ::::::::::::::::
' ?"?$$$b."$$$$.?$$$$$$P".e$$$$F,d$$$$$F ::::::::::::::::::
"?$$bc."$b.$$$$F z$$P?$$",$$$$$$$ ::::::::::::::::::::
`"$$c"?$$$".$$$)e$$F,$$$$$$$' ::::::::::::::::::::
':. "$b...d$$P4$$$",$$$$$$$" :::::::::::::::::::::
':::: "$$$$$".,"".d$$$$$$$F ::::::::::::::::::::::
:::: be."".d$$$4$$$$$$$$F :::::::::::::::::::::::
:::: "??$$$$$$$$$$?$P" :::::::::::::::::::::::::
:::::: ?$$$$$$$$f .::::::::::::::::::::::::::::
:::::::`"????"".::::::::::::::::::::::::::::::