【Laravel】APIテストを自動化してみよう

こんにちは。今回はLaravelのテスト機能を使用してWeb APIのテストをしてみたいと思います。Web APIは手動で検証すると結構時間がかかるので自動化すると楽ちんです。Laravelのテストは簡単な記述で細かく検証できるので筆者的にはかなりおすすめの機能です。それでは解説していきます。

今回作成したAPI

ユーザーを1件取得するAPIを作成しました。取得できるJSONは以下のとおりです。

http://localhost:8000/api/users/1

{
	"id": 1,
	"name": "joe",
	"email": "joe@xxx.xxx",
	"password": "",
	"remember_token": null,
	"created_at": null,
	"updated_at": "2021/07/31",
	"deleted_at": null,
}

テストの書き方

ここからはテストの書き方を解説します。

テストクラスを作成

まずはartisan make:testコマンドでテストクラスを作成します。今回はfeatureテストとして作成します。

php artisan make:test UserTest

tests/Feature/UserTest.phpが作成されました。

テストメソッドを作成

テストメソッドを作成します。雛形として作成済のtest_exampleは削除して、新たにtest_getUserを作成します。ここで一旦作成したメソッドを実行してみましょう。

$ php artisan test tests/Feature/UserTest.php 

   WARN  Tests\Feature\UserTest
  ! get user → This test did not perform any assertions  /home/e-seventh/src/sample/tests/Feature/UserTest.php:11

  Tests:  1 risked
  Time:   0.32s

テストメソッドが空の状態なので警告が出ますが、実行されていれば上述の結果となります。ではメソッドに処理を書いていきましょう。

リクエストを送信

まずAPIに対してリクエストを投げる処理を記述します。$this->getメソッドを使用します。httpのレスポンスは$responseオブジェクトに返るように設定します。$response->dumpメソッドでテスト実行時に$responseの内容をコンソールに表示して、テストコード自体のデバッグを行うことができます。

	public function test_getUser()
	{
		$response = $this->get('/api/users/1');

		$response->dump();
	}

実行した結果は以下のようになります。取得したUserモデルの内容が表示されています。

$ php artisan test tests/Feature/UserTest.php 
{#402
  +"id": 1
  +"name": "joe"
  +"email": "joe@xxx.xxx"
  +"password": ""
  +"remember_token": null
  +"created_at": null
  +"updated_at": "2021/07/31"
  +"deleted_at": null
}

   WARN  Tests\Feature\UserTest
  ! get user → This test did not perform any assertions  /home/e-seventh/src/sample/tests/Feature/UserTest.php:11

  Tests:  1 risked
  Time:   0.44s

ステータスコードを検証

いよいよレスポンスの検証(アサーション)です。まずはレスポンスコードが意図した通りかどうか確認するコードを記述します。

	public function test_getUser()
	{
		$response = $this->get('/api/users/1');

		$response->assertStatus(200);
	}

テストを実行すると今度は成功となりました。

$ php artisan test tests/Feature/UserTest.php 

   PASS  Tests\Feature\UserTest
  ✓ get user

  Tests:  1 passed
  Time:   0.43s

JSONの値を検証

次に、取得したJSONの値が正しいかどうかを検証したいと思います。assertJsonメソッドを使用します。

// id=1, name=joeであることを検証	
public function test_getUser()
	{
		$response = $this->get('/api/users/1');

		$response
		->assertStatus(200)
		->assertJson([
			'id' => 1,
			'name' => 'joe'
		]);
	}

assertJsonは前述したassertStatusにチェーンさせることができます。スッキリとしたわかりやすい記述ができています。それでは実行して成功することを確認してみましょう。

まとめ

今回はLaravelでWeb APIをテストする方法を解説しました。触りだけの紹介となってしまいましたが、非常に簡単な記述で実現できることがわかりました。JSONの内容検査については他にも様々な方法がありますので、別の記事で紹介できたらと思います。

Laravel

Posted by kobainmac