Laravelにデフォルトで組み込まれている「PHPUnit」を使ってユニットテスト(単体テスト)を実施してみます。
今回は、Webアプリケーションに正しくアクセスできているか、HTTPテストを実施します。
公開済みのLaravelプロジェクトを対象とします。
- Laravel 7.30.6
- PHPUnit 8.5.31
テスト用スクリプトの用意
テスト用スクリプトは、サンプル「tests/Feature/ExampleTest.php」が用意されているので、これを複製し、例えば「HelloTest.php」として以下のファイルを作成します。
namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; class HelloTest extends TestCase { public function testBasicTest() { $response = $this->get('/'); $response->assertStatus(200); $response = $this->get('/about'); $response->assertStatus(200); $response = $this->get('/contact'); $response->assertStatus(200); ... } }
このように記述する事で、例えばページ「/about」にリクエストした際に、正常にアクセスできているか、つまりステータスコード200を返しているかどうかテストする事ができます。
コンテンツリストやサイトマップなど仕様書から、全ページ分のコードを記述します。
テストの実行
テストの実行には、コマンドラインより「/vendor/bin/phpunit」を実行します。
$ ./vendor/bin/phpunit PHPUnit 8.5.31 by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: 14.44 seconds, Memory: 82.00 MB OK (3 tests, 123 assertions)
「OK」と表示されれば、全てのテストケースを通過したことを示しています。
エラーの場合は、以下のように「FAILURES!」と表示され、エラーが発生したコードの行数が出力されるので、確認します。
... .../tests/Feature/HelloTest.php:112 ... FAILURES! Tests: 3, Assertions: 49, Failures: 1.
また、artisanコマンドを使用することで、より詳細なテスト結果を得る事ができます。
$ php artisan test (中略) RUNS Tests\Feature\HelloTest • basic test Tests: 4 passed, 1 pending PASS Tests\Feature\HelloTest ✓ basic test Tests: 5 passed Time: 12.59s
認証が必要なページのテスト
認証が必要なページにはアクセスできない、つまりステータスコード302が返ってくる事をテストできます。
$response = $this->get('/mypage'); $response->assertStatus(302);
さらに認証後にアクセスできる事を確認します。
$user = factory(User::class)->create(); $response = $this->actingAs($user)->get('/mypage'); $response->assertStatus(200);
以後、認証状態が保持されるので、必要に応じて以下のようにログアウトする事もできます。
$response = $this->post('logout');
APIのテスト
APIについても、以下のようにしてアクセスできている事をテストできます。
$response = $this->getJson('/api/user'); $response->assertStatus(200);
上記はGETメソッドなので「getJson」を使用しましたが、「postJson」「putJson」「patchJson」「deleteJson」なども用意されています。
例えば、ユーザを追加するPOSTメソッドをテストする場合、以下のようにパラメータをセットで記述することができます。
$response = $this->postJson('/api/user', [ 'name' => 'テスト太郎', 'mail' => 'test@helog.jp', ]); $response->assertStatus(200);
その他、多くのメソッドが用意されており、より詳細にテストできそうなので、いろいろ試してみます。
コメントする