Entropy は、PHPUnit でランダム化テストを操作するためのツールや、 rand
やshuffle
などの PHP のランダム関数を利用するシステムをテストするためのツールを提供するライブラリです。
単体テストでは、グローバル状態の変更が必要な場合や、その状態を変更する機能をカバーする必要がある場合があります。これは決して理想的な状況ではありませんが、多くの場合、他のテストに対する不注意な依存関係が作成される可能性があります。
Entropy のテスト シャッフル機能を有効にすると、テストの順序がランダムになり、これらの依存関係が強調されやすくなります。
Entropy のテスト シャッフルでは、PHPUnit の@depends
機能を使用してテストの順序が変更されることも回避されます。今後の作業では、適切な場合にこれらのテストでシャッフルが引き続き発生できるようにする予定です。
場合によっては、関数の入力の範囲が非常に広いため、それらの入力の一部を取得する方がリソースをより効率的に使用できるという状況に陥ることがあります。しかし、その断面にテストが失敗する可能性のある穴がある場合はどうなるでしょうか?
これを回避する 1 つの方法は、範囲のランダムな断面を取得するような方法で入力が生成される、ランダム化された入力を使用することです。言い換えれば、 rand
または別の非決定論的なアプローチを使用します。
このプロパティベースのテストの拡張は、既知の結果との同等性を正確にテストするのではなく、ランダムな入力をアプリケーションまたは関数に適用し、出力が特定のルールに準拠しているか、入力に対して特定のプロパティを持っているかを観察する実践です。セット。
Entropy では、テストのランダム シードを管理することで、これらのアプローチの使用が可能になるだけでなく、固定シードを受け入れるか、テスト スイートが合格するまで最後に失敗した実行から回復することによって、繰り返し可能にすることもできます。
Composer を使用して、このライブラリをプロジェクトに追加できます。
$ composer require datto/phpunit-entropy
構成が完了すると、テスト スイートを通常どおり実行できます。聞き手は自分自身のことを考えます。テストエラーまたは失敗の場合、使用されたシードは一時ファイルに保存されるため、次回の実行では、新しいシードが生成されるのではなく、再利用されます。
乱数発生器のシードは最大 4 つの場所から提供されます。ここでは優先順位に従って示します。
設定されている場合、 SEED
環境変数は他の設定をオーバーライドするために使用されます。これは、 export
経由で設定できますが、現在の実行に対してのみ設定することをお勧めします。
SEED=123456 phpunit -c phpunit.xml tests
シードは構成によって固定される場合があります。以下の「構成」セクションを参照してください。
テストの実行が失敗した場合、使用されたシードは一時ファイルに保存されます。これは後続のテストでロードされ、スイートが再び成功するまで保持されます。
上記の方法でシードが設定されていない場合、最後の方法は PHP のrand
関数を使用することです。
Composer 経由でインストールしたら、PHPUnit 構成ファイル (多くの場合phpunit.xml
) を変更するだけでテスト リスナーを構成できます。
< phpunit xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi : noNamespaceSchemaLocation = " http://schema.phpunit.de/4.1/phpunit.xsd "
backupGlobals = " false "
colors = " true "
bootstrap = " bootstrap.php "
>
< listeners >
< listener class = " DattoPHPUnitEntropyListener " >
< arguments >
< array >
< element key = " seeding " >
< array >
< element key = " enabled " >
< boolean >true</ boolean >
</ element >
< element key = " seed " >
< integer >1234567</ integer >
</ element >
< element key = " file " >
< string >/tmp/phpentropy-seed</ string >
</ element >
</ array >
</ element >
< element key = " shuffle " >
< boolean >true</ boolean >
</ element >
</ array >
</ arguments >
</ listener >
</ listeners >
</ phpunit >
true に設定すると、乱数ジェネレーターはリスナーによってシードされます。
この引数を介してシードを設定すると、この値のみが乱数ジェネレーターのシードに使用されます。以下のシード優先度に関するセクションを参照してください。
設定すると、このファイルは最後に失敗したランダム シードを保存するために使用されます。デフォルトは[TMPDIR LOCATION]/phpunit-entropy-seed
です。
true に設定すると、単体テストが実行される順序がランダム化されます ( @depends
が使用されているスイートを除く)。これは、テスト間の依存関係を判断および識別するのに役立ちます。
クリストファー・ホルト <[email protected]>