ApiTestCaseは、Symfony API 開発者としての作業をはるかに容易にする PHPUnit テストケースです。基本的な Symfony WebTestCase をいくつかの優れた機能で拡張します。
PHP-Matcher のおかげで、その Readme によれば、「ギャングのように予想される JSON 応答を書く」ことができます。私たちも間違いなく同意します。
また、Doctrine フィクスチャの読み込みを容易にするために、Alice も使用されます。
特徴:
Composer がすでにグローバルにインストールされていると仮定します。
composer require --dev lchrusciel/api-test-case
そして完成です! ApiTestCase はデフォルト構成で動作します。
テスト ケースには、JsonApiTestCase と XmlApiTestCase という 2 つの基本クラスが提供されます。作成する API の形式に基づいていずれかを選択します。
基本的な TDD ワークフローは次のとおりです。
assertResponse
アサーション メソッドを使用して、応答の内容が期待どおりであるかどうかを確認します。応答ファイルの名前が必要です。src/AppBundle/Tests/Responses/Expected/hello_world.json
に配置する必要があります。簡単な例を見てみましょう!次のテストを作成します。
namespace AppBundle Tests Controller HelloWorldTest ;
use ApiTestCase JsonApiTestCase ;
class HelloWorldTest extends JsonApiTestCase
{
public function testGetHelloWorldResponse ()
{
$ this -> client -> request ( ' GET ' , ' / ' );
$ response = $ this -> client -> getResponse ();
$ this -> assertResponse ( $ response , ' hello_world ' );
}
}
次に、予期される応答ファイルを定義します。
{
"message" : " Hello ApiTestCase World! "
}
テストを実行します。
vendor/bin/phpunit
テストはいくつかのエラーで失敗するはずです。おそらくコントローラーとルーティングが欠落しているので、先に進んでそれらを定義してください。コントローラーを実装し、適切なルーティングを構成したらすぐに、テストを再度実行できます。
応答の内容が期待と一致する場合、コンソールには簡単なメッセージが表示されます。
OK (1 tests, 2 assertions)
それ以外の場合は、受信したメッセージの差分が表示されます。
" Hello ApiTestCase World " does not match " Hello ApiTestCase World! " .
@@ -1,4 +1,3 @@
{
- " message " : " Hello ApiTestCase World! "
+ " message " : " Hello ApiTestCase World "
}
-
まず、関数assertResponse
応答コード(デフォルトの応答コードは200)をチェックし、次に応答のヘッダーにapplication/json
・タイプが含まれているかどうかをチェックします。最後に、応答内容が期待どおりかどうかを確認します。場合によっては、応答内の一部の値 (データベースからの自動生成された日付や ID など) を予測できないことがあります。 PHP-Matcher が補助機能を備えているため、ここでは魔法は必要ありません。これらは利用可能なパターンのほんの一例です:
@string@
@integer@
@boolean@
@array@
詳細については、PHP-Matcher のドキュメントを確認してください。
これらのパターンを使用すると、期待される応答は次のようになります。
{
"message" : " @string@ "
}
これを設定すると、キーmessage
の下の任意の文字列がパターンと一致します。より複雑な予想される応答は次のようになります。
[
{
"id" : " @integer@ " ,
"name" : " Star-Wars T-shirt " ,
"sku" : " SWTS " ,
"price" : 5500 ,
"sizes" : " @array@ " ,
"created_at" : " @[email protected]() "
},
{
"id" : " @integer@ " ,
"name" : " Han Solo Mug " ,
"sku" : " HSM " ,
"price" : 500 ,
"sizes" : " @array@ " ,
"created_at" : " @[email protected]() "
}
]
次の製品リストと一致します。
array (
array (
' id ' => 1 ,
' name ' => ' Star-Wars T-shirt ' ,
' sku ' => ' SWTS ' ,
' price ' => 5500 ,
' sizes ' => array ( ' S ' , ' M ' , ' L ' ),
' created_at ' => new DateTime (),
),
array (
' id ' => 2 ,
' name ' => ' Han Solo Mug ' ,
' sku ' => ' HSM ' ,
' price ' => 500 ,
' sizes ' => array ( ' S ' , ' L ' ),
' created_at ' => new DateTime (),
),
)
ApiTestCase はnelmio/alice
と統合されています。この素晴らしいライブラリのおかげで、必要なときにフィクスチャを簡単にロードできます。フィクスチャを定義し、適切なディレクトリに配置する必要があります。ここでは、フィクスチャとユースケースを定義する方法の例をいくつか示します。フィクスチャを定義する方法の詳細については、Alice のドキュメントを確認してください。
Doctrine で Alice を使用するには、2 つの追加バンドルを有効にする必要があります。
シンフォニー 4.0+
// config/bundles.php
return [
// ...
Nelmio Alice Bridge Symfony NelmioAliceBundle::class => [ ' test ' => true ],
Fidry AliceDataFixtures Bridge Symfony FidryAliceDataFixturesBundle::class => [ ' test ' => true ],
];
ここで、アプリケーションに Book というマップされた Doctrine エンティティがあるとします。
class Book
{
private $ id ;
private $ title ;
private $ author ;
// ...
}
テスト用のフィクスチャをロードするには、 src/AppBundle/Tests/DataFixtures/ORM/books.yml
に単純なYAML
ファイルを定義する必要があります。
ApiTestCaseTestEntityBook :
book1 :
title : " Lord of The Rings "
author : " J. R. R. Tolkien "
book2 :
title : " Game of Thrones "
price : " George R. R. Martin "
最後に、これらのフィクスチャをテストで使用するには、適切なメソッドを呼び出すだけです。
public function testBooksIndexAction ()
{
// This method require subpath to locate specific fixture file in your DataFixtures/ORM directory.
$ this -> loadFixturesFromFile ( ' books.yml ' );
// There is another method that allows you to load fixtures from directory.
$ this -> loadFixturesFromDirectory ( ' big_library ' );
}
テスト スイートの構成をカスタマイズするには、phpunit.xml にさらにいくつかのオプションを追加します。
< php >
< server name = " KERNEL_CLASS " value = " AcmeKernel " />
< server name = " EXPECTED_RESPONSE_DIR " value = " /path/to/expected/responses/ " />
< server name = " FIXTURES_DIR " value = " /path/to/DataFixtures/ORM/ " />
< server name = " OPEN_ERROR_IN_BROWSER " value = " true/false " />
< server name = " OPEN_BROWSER_COMMAND " value = " open %s " />
< server name = " IS_DOCTRINE_ORM_SUPPORTED " value = " true/false " />
< server name = " TMP_DIR " value = " /tmp/path/to/temporary/folder/ " />
< server name = " ESCAPE_JSON " value = " true/false " />
</ php >
KERNEL_CLASS
使用すると、カーネルをセットアップするためにどのクラスを使用するかを正確に指定できます。ERESPONSE_DIR
変数には、予想される応答が含まれるフォルダーへのパスが含まれます。 APIの結果と既存のjsonファイルを比較する際に使用されます。この値が設定されていない場合、ApiTestCase は応答の場所を推測し、コントローラー テスト クラスに相対的に位置するフォルダー「../Responses」内で応答を探します。FIXTURES_DIR
変数には、データ フィクスチャを含むフォルダーへのパスが含まれています。デフォルトでは、この変数が設定されていない場合、テスト クラスに相対的に位置する../DataFixtures/ORM/
が検索されます。フォルダーが存在しない場合、または読み込むファイルがない場合、ApiTestCase は RunTimeException をスローします。OPEN_ERROR_IN_BROWSER
は、ブラウザ ウィンドウでのエラー表示をオンにするフラグです。デフォルト値は false です。OPEN_BROWSER_COMMAND
は、例外を除いてブラウザを開くために使用されるコマンドです。IS_DOCTRINE_ORM_SUPPORTED
は、便利なデータ フィクスチャ ローダーとデータベース パージャーを含むドクトリン サポートをオンにするフラグです。TMP_DIR
変数には、ログ ファイルが保存される一時フォルダーへのパスが含まれています。ESCAPE_JSON
、JSON 出力を予期されるデータと比較する前に、その出力のエスケープ (Unicode 文字とスラッシュ) をオンにするフラグです。デフォルト値は false です。このフラグは、ApiTestCase の以前のバージョンとの下位互換性 (オンになっている場合) のためにのみ存在し、将来のバージョンでは削除される予定です。 test/
ディレクトリには、このライブラリを使用するために必要な最小限の構成を備えたサンプル Symfony プロジェクトがあります。
PHPUnit テスト スイートを実行するには、次のコマンドを実行します。
composer install
test/app/console doctrine:database:create
test/app/console doctrine:schema:create
vendor/bin/phpunit
バグを見つけた場合、または改善のための優れたアイデアがある場合は、このリポジトリで問題を開いてください。
リリースには、 major.minor.patch
という形式で番号が付けられます。
そして、次のガイドラインに従って構築されました。
SemVer の詳細については、semver.org Web サイトをご覧ください。
ライセンスはここで確認できます。
このライブラリは元々次の者によって作成されました。
Lakion 社の https://github.com/Lakion/ApiTestCase リポジトリにあります。
寄稿者のリストをご覧ください。