このパッケージは非推奨です。代わりに Infection を確認してください。
Humbug は、PHP 用のミューテーション テスト フレームワークです。現在開発中であるため、実際には非常にうまく機能しますが、手先のチームが懸命に取り組んでいる荒削りな部分もあります。ゲートから落ちた場合は警告されます ;)。
$ git remote set-url upstream https://github.com/humbug/humbug.git
upstream
ローカルで使用するリモートの名前に置き換えます。 upstream
が一般的に使用されますが、他のものを使用している可能性があります。別の URL (例: [email protected]:mockery/mockery.git) を使用することもできます。 git remote -v
実行して、実際に何を使用しているかを確認します。
目次
ミューテーション テストは、一言で言えば、お金を払って単体テストを実行できるようにするものです。これには、ソース コードに小さな欠陥を挿入し、単体テストがそれに気づくかどうかをチェックすることが含まれます。存在する場合、単体テストによって突然変異が「削除」されたことになります。そうでない場合、突然変異は検出を逃れています。単体テストは回帰を防ぐことを目的としているため、実際の回帰が気づかれずに合格するのは悪いことです。
コード カバレッジでは、テストでどのようなコードが実行されているかがわかりますが、ミューテーション テストは、単体テストが実際にどの程度実行されているか、およびどこを改善できるかを判断するのに役立つことを目的としています。
ミューテーション テストが価値がある理由については、「嘘、ひどい嘘、コード カバレッジ: ミューテーション テストに向けて」で詳しく書きました。
Humbug は、誰からのプル リクエストや問題も歓迎するオープンソース プロジェクトです。プル リクエストを開く前に、短いコントリビュート ガイドをお読みください。
Composer を使用して、Humbug の依存関係を複製してインストールできます。
git clone https://github.com/humbug/humbug.git
cd humbug
/path/to/composer.phar install
humbug コマンドは bin/humbug にあります。
master ブランチを直接追跡したくない場合は、次のように Humbug phar をインストールできます。
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
Windows では、ブラウザーを使用するか、次のコマンドを使用して Powershell v3 からダウンロードできます。ここで、 wget
は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
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 は openssl 秘密キーを使用して署名されます。公開鍵ファイルを使用するには、常に phar ファイルの横に保存する必要があります。たとえば、 humbug.phar
名前をhumbug
に変更した場合、キーの名前もhumbug.phar.pubkey
からhumbug.pubkey
に変更します。
現在、phar のリリースは手動で行われているため、git master と同じ頻度で更新されることはありません。現在の phar を更新するには、次を実行するだけです。
./humbug.phar self-update
注: phar を使用すると、修正がバージョンに反映されるまでに時間がかかる可能性がありますが、安定した開発バージョンを確実に入手できるようになります。公開キーは 1 回だけダウンロードされます。これは、将来の phar リリースを検証するために自己更新によって再利用されます。
安定版に向けてリリースが開始されると、アルファ、ベータ、RC、そして最終リリースが存在します。開発トラックの phar ファイルは、安定したリリースに達するまで自動的に自己更新されます。開発レベルのファーの追跡を継続したい場合は、安定性フラグのいずれかを使用してこれを示す必要があります。
./humbug.phar self-update --dev
予期しないopenssl
または SSL エラーによる自己更新の問題が発生した場合は、 openssl
拡張機能が有効になっていることを確認してください。 Windows では、コマンド ラインで PHP のphp.ini
ファイルに次の行を追加またはコメント解除することでこれを行うことができます (http サーバーのファイルと異なる場合)。
extension=php_openssl.dll
証明書の欠落により、他の特定の SSL エラーが発生する可能性があります。これを修正するには、システム上の場所 (例: C:/xampp/php/ext/cacert.pem
) を見つけるか、http://curl.haxx.se/ca/cacert.pem からコピーをダウンロードします。次に、次のオプションがこのファイルを正しく指していることを確認します。
openssl.cafile=C:/path/to/cacert.pem
Humbug の依存関係は最近のバージョンに固定されているため、Humbug をcomposer.json に追加すると競合が発生する可能性があります。このような場合には、上記の 2 つのインストール方法をお勧めします。ただし、他の汎用ツールとしてグローバルにインストールできます。
composer global require ' humbug/humbug=~1.0@dev '
まだ行っていない場合は、これを~/.bash_profile
(または~/.bashrc
) に追加します。
export PATH= ~ /.composer/vendor/bin: $PATH
Humbug は現在、PHP 5.4 以降で動作します。
Humbug はまだ開発中であるため、繰り返しになりますが、荒削りな部分には注意してください。
プロジェクトで humbug を設定するには、次のコマンドを実行します。
humbug configure
このツールは、Humbug 構成ファイル ( humbug.json.dist
) を作成するために必要ないくつかの質問をします。
プロジェクトのベース ディレクトリにhumbug.json.dist
ファイルを作成します。
{
"timeout" : 10 ,
"source" : {
"directories" : [
"src"
]
} ,
"logs" : {
"text" : "humbuglog.txt" ,
"json" : "humbuglog.json"
}
}
humbug.json.dist
VCS にコミットし、ローカルでhumbug.json
ファイルでオーバーライドできます。
必要に応じて編集します。少なくとも 1 つのログを定義しない場合、エスケープされたミュータントに関する詳細情報は利用できません。テキスト ログは人間が判読可能です。ソース ファイルがベース ディレクトリに存在する場合、またはソース ディレクトリ内のファイルを除外する必要がある場合は、除外パターンを追加できます (ここでは、コンポーザー ベンダーと Tests ディレクトリが除外されるベース ディレクトリ内のファイルのパターンを示します)。
{
"timeout" : 10 ,
"source" : {
"directories" : [
"."
] ,
"excludes" : [
"vendor" ,
"Tests"
]
} ,
"logs" : {
"text" : "humbuglog.txt"
}
}
プロジェクトのベース ディレクトリから別のディレクトリからテストを実行する必要がある場合は、これを通知することもできます。プロジェクトのベース ディレクトリ以外のディレクトリから Humbug を実行する必要はありません。
{
"chdir" : "tests" ,
"timeout" : 10 ,
"source" : {
"directories" : [
"src"
] ,
}
}
テストがすべて合格状態であることを確認します (不完全なテストやスキップされたテストは許可されます)。いずれかのテストが失敗すると、Humbug は終了します。
プロジェクトのベース ディレクトリにあるマジック コマンド (PHAR ダウンロードを使用) は次のとおりです。
./humbug.phar
または、Humbug のクローンを作成したばかりの場合:
../humbug/bin/humbug
または、Humbug をコンポーザーの依存関係としてプロジェクトに追加した場合:
./vendor/bin/humbug
xdebug 拡張子を付けた php の代わりに、phpdbg 経由で Humbug を実行することもできます。
phpdbg -qrr humbug.phar
すべてがうまくいけば、次のような結果が得られます。
_ _ _
| || |_ _ _ __ | |__ _ _ __ _
| __ | || | ' | '_ || / _` |
|_||_|_,_|_|_|_|_.__/_,___, |
|___/
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
おそらく不可解な進行状況の出力を説明するには、次のようにします。
キル、エラー、タイムアウトはすべて、検出された変異としてカウントされます。 Humbug 自体が内部エラー、つまり、ここで問題として報告されるバグが発生した可能性があるため、ログにエラーを報告します。
要約結果の例では、多数のメトリック スコアが報告されています。
これらのメトリクスを調べると、顕著な問題は、MSI の 47% が、報告されているコード カバレッジの 65% よりも 18 ポイント低いことです。これらの単体テストは、コード カバレッジだけで検出できるよりもはるかに効果的ではありません。
これらの結果を解釈するには、いくつかのコンテキストが必要です。ログには、検出されなかったすべての変異が元のソース コードとの差分としてリストされます。これらを調べることで、どのような特定の変異が検出されなかったのかについてさらなる洞察が得られます。
Humbug には、Symfony コンソール アプリケーションに通常関連付けられているもの以外に、注目すべきコマンドライン オプションがいくつかあります。
単一のテストのタイムアウトしきい値を手動で設定できます。
humbug --timeout=10
ファイルのサブセットの変更のみに興味がある場合は、単純なファイル名、グロブ、または正規表現を含む--file
オプションをいくつでも渡すことができます。基本的に、これらはすべて Symfony Finder のname()
メソッドに渡されます。
humbug --file=NewClass.php --file= * Driver.php
これは、テスト スイート全体に対する最初の Humbug チェックを制限するものではなく、続行する前にすべてのテストが正しく合格することを確認するために完全に実行されます。
少数の特定のファイルのみを変更する場合は、フル パス ファイル名を含む--path
オプションを任意の数だけ渡すことができます。このオプションは、config および/または--file
オプションを使用して見つかったファイルと、 --path
オプションを使用して提供されたファイルを交差するフィルターClosure
に渡されます。
humbug --path=src/Data/NewClass.php --path=src/Driver/Driver.php
注: これは、テスト スイート全体に対する最初の Humbug チェックを制限するものではなく、続行する前にすべてのテストが正しく合格することを確認するために完全に実行されます。
増分分析 (IA) は、実験的な未完成の操作モードであり、実行の間に結果がローカルにキャッシュされ、必要に応じて再利用されます。現時点では、このモードは、変更されている直接のファイルと、変更された行に関連するテストの両方が最後の実行以降変更されていないテスト実行を排除することによって、非常に単純に動作します (関係するファイルの SHA1 を比較することによって決定されます)。
humbug --incremental
IA モードでは、比較的安定したコード ベースのパフォーマンスが大幅に向上するため、自由にテストして実際の動作を確認できます。将来的には、親クラス、インポートされた特性、およびその直接の依存関係のクラスを含むファイルの変更を考慮する必要があります。これらはすべて、特定のオブジェクトの動作に影響を与えます。
IA は、ローカルの永続キャッシュ ( /home/padraic/.humbug
など) を利用します。
突然変異テストは伝統的に時間がかかりました。コンセプトは、生成された変異ごとにテスト スイートを再実行することです。処理を大幅に高速化するために、Humbug は次のことを行います。
これらすべてにより Humbug の速度が向上しますが、Humbug の実行は単体テストよりも遅くなることに注意してください。 2 秒のテスト スイートでは、突然変異テストに 30 秒かかる場合があります。または5分。それはすべて、コード行間の相互作用、テストの数、コード カバレッジのレベル、およびコードとテストの両方のパフォーマンスによって決まります。
Humbug はミューテーターの基本スイートを実装しています。これは基本的に、特定の PHP トークンがいつ変更できるかを示し、その変更をトークンの配列に適用します。
注: 現時点では、(クラス メソッドではなく) 関数内に保持されているソース コードは変更されていません。
2 進数演算:
オリジナル | 変異した | オリジナル | 変異した |
---|---|---|---|
+ | - | /= | *= |
- | + | %= | *= |
* | / | **= | /= |
/ | * | & | | |
% | * | | | & |
** | / | ^ | & |
+= | -= | ~ | |
-= | += | >> | << |
*= | /= | << | >> |
ブール置換:
これには一時的に論理ミューテーターが含まれます。
オリジナル | 変異した |
---|---|
真実 | 間違い |
間違い | 真実 |
&& | || |
|| | && |
そして | または |
または | そして |
! |
条件付き境界:
オリジナル | 変異した |
---|---|
> | >= |
< | <= |
>= | > |
<= | < |
否定された条件文:
オリジナル | 変異した | オリジナル | 変異した |
---|---|---|---|
== | != | > | <= |
!= | == | < | >= |
<> | == | >= | < |
=== | !== | <= | > |
!== | === |
増分:
オリジナル | 変異した |
---|---|
++ | -- |
-- | ++ |
戻り値:
オリジナル | 変異した | オリジナル | 変異した |
---|---|---|---|
true を返します。 | false を返します。 | 1.0> を返します。 | 戻り値 -( + 1); |
false を返します。 | true を返します。 | $this を返します。 | null を返します。 |
0を返します。 | 1を返します。 | 戻り関数(); | 関数(); null を返します。 |
戻る ; | 0を返します。 | 新しいクラスを返します。 | 新しいクラス; null を返します。 |
0.0を返します。 | 1.0 を返します。 | return ( Anything ); | ( Anything ); null を返します。 |
1.0 を返します。 | 0.0を返します。 |
リテラル数値:
オリジナル | 変異した |
---|---|
0 | 1 |
1 | 0 |
整数 > 1 | 整数 + 1 |
浮動小数点数 >= 1 / <= 2 | フロート+1 |
浮動小数点 > 2 | 1 |
If ステートメント:
すべての if ステートメントの大部分は前のミューテーターでカバーされていますが、比較や演算を行わずにネイティブ関数やクラス メソッドを使用するなどの特殊なケースもあります (例: is_int()
やin_array()
。ファイル内で定義された関数は実行時まで存在しないため (他の作業が必要です!)、これには含まれません。
オリジナル | 変異した |
---|---|
if(is_int(1)) | if(!is_int(1)) |
時間の経過とともにさらに多くのミューテーターが追加されます。
bin/humbug stats ../my-project/humbuglog.json ../my-project/list-of-classes.txt --skip-killed=yes [-vvv]
humbuglog.json またはカスタム名付き JSON ログからの統計を解析します。
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
これは、humbug のディレクトリで実行することで、humbug 自体でテストできます。
bin/ハムバグ ビン/ハムバグ統計 [-vvv]
これは既知の問題の短いリストです。
かつて空だったリポジトリに可能性を見出した Craig Davis 氏のご厚意により提供: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 .::::::::::::::::::::::::::::
:::::::`"????"".::::::::::::::::::::::::::::::