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の値
}