スナップショット テストは、実際のテスト ケースを作成せずにテストを行う方法です。
Laravel のテスト コースのこの無料ビデオで詳細を学ぶことができます。このパッケージは Laravel 以外のプロジェクトでも使用できるので、心配しないでください。
SpatieSnapshotsMatchesSnapshots を使用;クラス OrderTest {MatchesSnapshots を使用する;パブリック関数 test_it_casts_to_json() {$order = new Order(1);$this->assertMatchesJsonSnapshot($order->toJson()); } }
最初の実行時に、テスト ランナーは新しいスナップショットを作成します。
> ./vendor/bin/phpunit There was 1 incomplete test: 1) OrderTest::test_it_casts_to_json Snapshot created for OrderTest__test_it_casts_to_json__1 OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1.
以降の実行では、スナップショットが変更されない限り、テストは合格します。
> ./vendor/bin/phpunit OK (1 test, 1 assertion)
回帰があれば、テストは失敗します。
$orderId = 新しい注文(2); // 退行! 「1」でした
> ./vendor/bin/phpunit 1) OrderTest::test_it_casts_to_json Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ Failed asserting that '{"id":2}' matches JSON string "{ "id": 1 } FAILURES! Tests: 1, Assertions: 1, Failures: 1.
私たちはクラス最高のオープンソース パッケージの作成に多くのリソースを投資しています。有料製品のいずれかを購入することで、私たちをサポートできます。
当社のどのパッケージを使用しているかについて、故郷から葉書を送っていただき、誠にありがとうございます。当社の住所は、お問い合わせページに記載されています。受け取ったすべてのポストカードをバーチャル ポストカード ウォールに公開します。
パッケージは、composer 経由でインストールできます。
コンポーザーには --dev spatie/phpunit-snapshot-assertions が必要です
スナップショット アサーションを作成するには、テスト ケース クラスでSpatieSnapshotsMatchesSnapshots
トレイトを使用します。これにより、一連のアサーション メソッドがクラスに追加されます。
assertMatchesSnapshot($actual)
assertMatchesFileHashSnapshot($actual)
assertMatchesFileSnapshot($actual)
assertMatchesHtmlSnapshot($actual)
assertMatchesJsonSnapshot($actual)
assertMatchesObjectSnapshot($actual)
assertMatchesTextSnapshot($actual)
assertMatchesXmlSnapshot($actual)
assertMatchesYamlSnapshot($actual)
assertMatchesImageSnapshot($actual)
単純な文字列「foo」に対してスナップショット アサーションを実行してみましょう。
パブリック関数 test_it_is_foo() {$this->assertMatchesSnapshot('foo'); }
アサーションが初めて実行されるときは、文字列を比較するためのスナップショットがありません。テスト ランナーは新しいスナップショットを生成し、テストを不完全としてマークします。
> ./vendor/bin/phpunit There was 1 incomplete test: 1) ExampleTest::test_it_matches_a_string Snapshot created for ExampleTest__test_it_matches_a_string__1 OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1.
スナップショット ID は、テストおよびテストケースの名前に基づいて生成されます。基本的なスナップショットは、実際の値のプレーン テキストまたは YAML 表現を返します。
ふー
テストを再実行してみましょう。テスト ランナーは、アサーションのスナップショットがすでに存在することを確認し、比較を行います。
> ./vendor/bin/phpunit OK (1 test, 1 assertion)
実際の値を「bar」に変更すると、スナップショットは依然として「foo」を返すため、テストは失敗します。
パブリック関数 test_it_is_foo() {$this->assertMatchesSnapshot('bar'); }
> ./vendor/bin/phpunit 1) ExampleTest::test_it_matches_a_string Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'foo' +'bar' FAILURES! Tests: 1, Assertions: 1, Failures: 1.
値の変更が予想される場合は、テストを失敗させる代わりに、既存のスナップショットを更新するようにテスト ランナーに指示する必要があります。これは、 -d --update-snapshots
フラグをphpunit
コマンドに追加するか、 UPDATE_SNAPSHOTS
環境変数をtrue
に設定することで可能になります。
> ./vendor/bin/phpunit -d --update-snapshots OK (1 test, 1 assertion)
その結果、スナップショット ファイルは「foo」ではなく「bar」を返します。
バー
MatchesSnapshots
トレイトは、ファイルが最初にテストを実行したときに作成されたスナップショットと同一であることを確認する 2 つの方法を提供します。
assertMatchesFileHashSnapshot($filePath)
アサーションは、関数に渡されたファイルのハッシュとスナップショットに保存されたハッシュが一致することをアサートします。このアサーションは高速であり、使用するディスク容量はほとんどありません。この主張の欠点は、テストが失敗した場合に 2 つのファイルがどのように異なるかを確認する簡単な方法がないことです。
assertMatchesFileSnapshot($filePath)
アサーションは、ファイル全体を実際にスナップショット ディレクトリに保存することを除いて、ファイル ハッシュ アサーションとほぼ同じように機能します。アサーションが失敗した場合は、失敗したファイルがスナップショット ファイルの隣に配置されるため、手動で簡単に比較できます。永続化された失敗したファイルは、テストに合格すると自動的に削除されます。このアサーションは、画像や PDF のように手動で比較する必要があるバイナリ ファイルを操作する場合に最も役立ちます。
assertImageSnapshot
使用するには、spatie/pixelmatch-php パッケージがインストールされている必要があります。
指定されたイメージが、最初にテストを実行したときに作成されたスナップショットとほぼ同一である場合、このアサーションは合格します。 2 番目の引数をアサーションに渡すことで、しきい値をカスタマイズできます。値が大きいほど、比較の感度が高くなります。しきい値は 0 から 1 の間である必要があります。
$this->assertMatchesImageSnapshot($imagePath, 0.1);
スナップショット ID は、 MatchesSnapshot
特性のgetSnapshotId
メソッドを介して生成されます。メソッドをオーバーライドして ID をカスタマイズします。デフォルトでは、テスト名、テスト ケース名、および増加する値のスナップショット ID が存在します (例: Test__my_test_case__1
)。
__
区切り文字を--
に置き換える保護された関数 getSnapshotId(): string{return (new ReflectionClass($this))->getShortName().'--'.$this->name().'--'.$this->snapshotIncrementor; }
デフォルトでは、スナップショットはテスト クラスに相対的な__snapshots__
ディレクトリに保存されます。これは、 getSnapshotDirectory
メソッドをオーバーライドすることで変更できます。
__snapshots__
ディレクトリの名前をsnapshots
に変更する保護された関数 getSnapshotDirectory(): string{return dirname((new ReflectionClass($this))->getFileName()).DIRECTORY_SEPARATOR.'snapshots'; }
データのシリアル化に使用されるドライバーは、 assertMatchesSnapshot
メソッドの 2 番目の引数として指定できるため、ニーズに合ったものを選択できます。
SpatieSnapshotsDriversJsonDriver を使用する;SpatieSnapshotsMatchesSnapshots を使用する;クラス OrderTest {MatchesSnapshots を使用する;パブリック関数 test_snapshot_with_json_driver() {$order = new Order(1);$this->assertMatchesSnapshot($order->toJson(), new JsonDriver()); } }
ドライバーは、さまざまな種類のデータを独自の方法でシリアル化し、照合できるようにします。ドライバーはSpatieSnapshotsDriver
インターフェイスを実装するクラスであり、 serialize
、 extension
、 match
3 つのメソッド実装が必要です。
JsonDriver
を簡単に見てみましょう。
名前空間 SpatieSnapshotsDrivers; PHPUnitFrameworkAssert を使用; SpatieSnapshotsDriver を使用; SpatieSnapshotsExceptionsCantBeSerialized を使用; クラス JsonDriver は Driver を実装します {パブリック関数serialize($data): string{if (! is_string($data)) {throw new CantBeSerialized('文字列のみをjsonにシリアル化できます'); }return json_encode(json_decode($data), JSON_PRETTY_PRINT).PHP_EOL; }パブリック関数拡張(): string{return 'json'; }パブリック関数 match($expected, $actual) { Assert::assertJsonStringEqualsJsonString($actual, $expected); } }
serialize
メソッドは、スナップショット ファイルに書き込まれる文字列を返します。 JsonDriver
では、json 文字列をデコードして再エンコードして、スナップショットがきれいに印刷されることを確認します。
json スナップショットを json ファイルとして保存したいので、ファイル拡張子としてjson
使用します。
予想されるデータと実際のデータを照合するときは、PHPUnit の組み込み json アサーションを使用する必要があるため、特定のassertJsonStringEqualsJsonString
メソッドを呼び出します。
ドライバーは、 assertMatchesSnapshot
の 2 番目の引数として渡すことで使用できます。
$this->assertMatchesSnapshot($something->toYaml(), new MyYamlDriver());
継続的インテグレーションでテストを実行する場合、スナップショットの作成を無効にすることができます。
--without-creating-snapshots
パラメーターを使用するか、 CREATE_SNAPSHOTS
環境変数をfalse
に設定すると、スナップショットが存在しない場合、PHPUnit は失敗します。
> ./vendor/bin/phpunit -d --without-creating-snapshots 1) 例Test::test_it_matches_a_string スナップショット「ExampleTest__test_it_matches_a_string__1.txt」は存在しません。 `CREATE_SNAPSHOTS=false` 環境変数、または PHPUnit の CLI 引数の `-d --no-create-snapshots` を削除することで、自動的に作成できます。
Paratest などのツールを使用してテストを並列実行したり、Laravel のphp artisan test --parallel
コマンドを使用してテストを並列実行したい場合は、環境変数を使用する必要があります。
> CREATE_SNAPSHOTS=false php 職人テスト --Parallel 1) 例Test::test_it_matches_a_string スナップショット「ExampleTest__test_it_matches_a_string__1.txt」は存在しません。 `CREATE_SNAPSHOTS=false` 環境変数、または PHPUnit の CLI 引数の `-d --no-create-snapshots` を削除することで、自動的に作成できます。
Windows ユーザーは、行末を.gitattributes
で設定する必要があります。
# テストで使用されるスナップショットはシリアル化されたデータを保持し、その行末は変更しないでおく必要がありますtests/**/__snapshots__/** binary
最近の変更点の詳細については、CHANGELOG を参照してください。
作曲家テスト
詳細については、「貢献」を参照してください。
セキュリティに関するバグを見つけた場合は、問題トラッカーを使用する代わりに [email protected] にメールを送信してください。
このパッケージを自由に使用できますが、実稼働環境に届いた場合は、どのパッケージを使用しているかを記載したポストカードを故郷から送っていただければ幸いです。
私たちの住所は、Spatie, Kruikstraat 22, 2018 Antwerp, Belgiumです。
いただいたはがきはすべて当社ホームページに掲載しております。
セバスチャン・デ・デイン
アレックス・ヴァンダービスト
すべての貢献者
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。