前のパートに戻る 完了して次のパートへ  

  1-2 Laravel アプリケーションにおけるテストの基本的な考え方

Laravel アプリケーションにおけるテストの基本的な考え方

Laravel は PHPUnit を拡張して組み込んでいます。また、テストを楽にするためのいくつかの便利な機能を提供しているので、実際に手を動かす前に、どんな方針で、どんな機能を使えばいいか、といった Laravel でのテストの作り方の基礎を学びます。

ユニットテストとフィーチャーテストの扱い

Laravel をインストールすると tests ディレクトリ以下に Unit と Feature というディレクトリが予め作られています。それぞれユニットテスト用、フィーチャーテスト用のディレクトリです。

PHPUnit で使うテストクラスを作るときは、通常 PHPUnit\Framework\TestCase というクラスを継承して作りますが、Laravel ではこのクラスを継承して独自の基底クラスを提供しています。

tests/TestCase.php を開いてください。CreatesApplication トレイトを使って、App\Console\Kernel::bootstrap() を呼び出しています。これにより、Facade の登録やコンフィグファイルの読み込みなどが行われます。つまり、Tests\TestCase クラスを継承することで Laravel の内部の機能にアクセスできるようになります。

これを踏まえて、tests/Unit/ExampleTest.php と tests/Feature/ExampleTest.php を開いてみてください。

tests/Unit/ExampleTest.php

tests/Feature/ExampleTest.php

Tests\TestCase を継承しているのは Feature のほうだけで、Unit にあるほうは PHPUnit が提供している基底クラスを継承しています。

これは、ユニットテストはフレームワークの機能に依存しない形で書くことが望ましい、という考え方に基づいています。

本教材でも基本的にこの方針でユニットテストを書くようにしますが、これはあくまで原則であって、フレームワークの機能(たとえば Facade など)を利用したユニットテストを書きたい場合は、継承元のクラスを Tests\TestCase に変更してください。

Laravel アプリケーションにおけるテストの特徴

モデルファクトリ

後の章でもう少し詳しく解説しますが、フィーチャーテストでデータベースにレコードが必要な場合、モデルファクトリを使ってデータを登録します。

認証

ログインした状態でないとアクセスできないページ・API のテストをする際は、 actingAs メソッドを使って、認証済みの状態にします。

データベースのロールバック

RefreshDatabase や DatabaseTransactions といったトレイトが用意されており、各テストケースを実行後、データベースを実行前の状態に戻します。

基本的には前者を使えばいいと思いますが、前者はテスト開始時に artisan migrate:fresh --seed を実行するのと同等なので、テスト用のデータベースを必ず用意してください(開発用のデータベースを共用していると、テスト実行時にデータが消えてしまいます)。

Laravel によって追加されたアサーションメソッド

主にフィーチャーテスト用のアサーションが追加になっています。

すべては紹介しませんが、よく使う HTTP レスポンス(HTML、JSON)のアサーションとデータベースのアサーションについて見ていきます。

assertStatus / assertOk / assertCreated etc.


assertSee / assertSeeText

assertView / assertViewHas

assertJson / assertJsonStructure

assertDatabaseHas / assertDatabaseMissing

本節では、Laravel がどのように PHPUnit を組み込み、拡張しているかについて解説しました。他にもテストのための便利な機能やアサーションがありますので、興味のある方は Illuminate\Foundation\Testing\TestCase クラスと関連するトレイトのソースコードを読んでみてください。

議論

0 質問

このコースの評価は?