WEB/システム/IT技術ブログ

LaravelでPHPUnitを使ったHTTPテスト

Laravelにデフォルトで組み込まれている「PHPUnit」を使ってユニットテスト(単体テスト)を実施してみます。
今回は、Webアプリケーションに正しくアクセスできているか、HTTPテストを実施します。

公開済みのLaravelプロジェクトを対象とします。

  • Laravel 6.20.44
  • PHPUnit 7.5.20

テスト用スクリプトの用意

テスト用スクリプトは、サンプル「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 7.5.20 by Sebastian Bergmann and contributors.

...                                                                 3 / 3 (100%)

Time: 4.16 seconds, Memory: 32.00 MB

OK (3 tests, 50 assertions)

「OK」と表示されれば、全てのテストケースを通過したことを示しています。
エラーの場合は、以下のように「FAILURES!」と表示され、エラーが発生したコードの行数が出力されるので、確認します。

...
.../tests/Feature/HelloTest.php:112
...
FAILURES!
Tests: 3, Assertions: 49, Failures: 1.

認証が必要なページのテスト

認証が必要なページにはアクセスできない、つまりステータスコード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);

その他、多くのメソッドが用意されており、より詳細にテストできそうなので、いろいろ試してみます。

B!

Comment

コメントはありません

コメントする

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Monthly Archives