Laravelの中にはPHPUnitを継承したテストケース用クラスである\Illuminate\Foundation\Testing\TestCaseが用意されています。テスト: テストの準備 6.x Laravel
このクラスを継承して作ったテストケースクラス内ではid, passwordを無視したログイン、HTTPリクエストとレスポンスの再現など便利な機能が使えます。この便利機能は大体 $this-> から予測補完を眺めると存在に気付けるのですが、これ以外にも任意でリッチな機能のON/OFFを決めるtraitが用意されています。
traitの機能の扱い方は基本的にuseの有無のみです。useすると大体次の様な感じでuseされていたら実行、という処理が走り出します。
// ExampleTest <?php namespace Tests\Unit; use Illuminate\Foundation\Testing\DatabaseTransactions; use Tests\TestCase; class ExampleTest extends TestCase { use DatabaseTransactions; // こんな感じにuseするだけで動く } // \Illuminate\Foundation\Testing\TestCase /** * Boot the testing helper traits. * * @return array */ protected function setUpTraits() { // useしているtraitを集める $uses = array_flip(class_uses_recursive(static::class)); // useしているかチェックして、useされていれていたらメソッドを実行 if (isset($uses[RefreshDatabase::class])) { $this->refreshDatabase(); } if (isset($uses[DatabaseMigrations::class])) { $this->runDatabaseMigrations(); } if (isset($uses[DatabaseTransactions::class])) { $this->beginDatabaseTransaction(); } if (isset($uses[WithoutMiddleware::class])) { $this->disableMiddlewareForAllTests(); } if (isset($uses[WithoutEvents::class])) { $this->disableEventsForAllTests(); } if (isset($uses[WithFaker::class])) { $this->setUpFaker(); } return $uses; }
この記事では上記コードにある6つのtraitの機能を紹介します。
RefreshDatabase
和訳公式ページの各テスト後のデータベースリセットに説明があります。
データベースのテスト 6.x Laravel
これはテスト開始時にartisan migrate:freshし、テスト中にトランザクションを張り続け、テスト終了時にロールバックする機能です。これを使うと常にまっさらなデータベースでテストができます。これはデータベースの種別が異なっても同じ様な動作をするらしいです(試したことなし)。
DatabaseMigrations
テスト開始時にmigrate:freshしてテスト終了時にmigrate:rollbackするのみです。
DatabaseTransactions
テスト開始時にトランザクションを開始してテスト終了時にロールバックするのみです。私的に一番よく使います。テストでバグ(テスト自体でもテスト対象でも)が起きても整合性が取れていると確信できるテストデータを壊さずに済みます。
WithoutMiddleware
その名の通りテスト中にミドルウェア(app/Http/Middlewareなどで定義しているアレ)の動作を止めます。セキュリティの都合で外せないが、テストでは外したい、といったミドルウェア達をまとめて無視する時などに使います。実装がちょっと特殊で処理実体はtrait先でなく\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests::withoutMiddlewareにあります。
WithoutEvents
その名の通りテスト中にイベントの動作を止めます。これも実装がちょっと特殊で処理実体はtrait先でなく\Illuminate\Foundation\Testing\Concerns\MocksApplicationServices::withoutEventsにあります。
WithFaker
その名の通りfakerのついたテストを書けます。factoryでモデルのダミーを作るほどではないけれど……といったちょっとしたダミーデータを作る時に使うのが便利です。
public function testBasicTest() { $this->faker->name; // Fakerによるそれらしいランダムなnameの値 }