第8回 APIのテストとデバッグ

Laravel WebAPI開発

こんにちは、PHP開発者の皆さん!この連載の第8回では、Laravel 10を使ってAPIのテストとデバッグを行う方法について詳しく解説します。APIの品質を保ち、バグを迅速に発見して修正するためには、テストとデバッグが不可欠です。それでは、始めましょう!

1. PHPUnitによるテストの設定

Laravelでは、PHPUnitを使用してテストを実行します。テストの設定は、phpunit.xml ファイルで行います。

PHPUnitのインストール

LaravelプロジェクトにはデフォルトでPHPUnitが含まれていますが、念のためにインストールしておきましょう。

./vendor/bin/sail composer require --dev phpunit/phpunit
Bash

2. ユニットテストの作成

ユニットテストは、個々のメソッドや機能をテストするためのものです。ここでは、モデルのメソッドをテストする例を示します。

モデルのテスト

例えば、Post モデルのテストを作成しましょう。

namespace Tests\Unit;

use Tests\TestCase;
use App\Models\Post;
use Illuminate\Foundation\Testing\RefreshDatabase;

class PostTest extends TestCase
{
    use RefreshDatabase;

    public function test_title_is_required()
    {
        $post = Post::factory()->make(['title' => null]);

        $this->assertFalse($post->save());
    }
}
PHP

このテストでは、タイトルがnullの場合、保存が失敗することを確認しています。

3. フィーチャーテストの作成

フィーチャーテストは、アプリケーションの特定の機能が期待通りに動作するかをテストします。ここでは、APIエンドポイントのテストを行います。

APIエンドポイントのテスト

例えば、投稿の取得エンドポイントをテストします。

namespace Tests\Feature;

use Tests\TestCase;
use App\Models\Post;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;

class PostApiTest extends TestCase
{
    use RefreshDatabase;

    public function test_can_fetch_single_post()
    {
        $user = User::factory()->create();
        $post = Post::factory()->create(['user_id' => $user->id]);

        $response = $this->getJson("/api/posts/{$post->id}");

        $response->assertStatus(200)
                 ->assertJson([
                     'data' => [
                         'id' => $post->id,
                         'title' => $post->title,
                         'body' => $post->body,
                     ],
                 ]);
    }

    public function test_can_fetch_all_posts()
    {
        $user = User::factory()->create();
        $posts = Post::factory()->count(3)->create(['user_id' => $user->id]);

        $response = $this->getJson('/api/posts');

        $response->assertStatus(200)
                 ->assertJsonStructure([
                     'data' => [
                         '*' => ['id', 'title', 'body'],
                     ],
                 ]);
    }
}
PHP

このテストでは、投稿の取得とすべての投稿の取得が期待通りに動作することを確認しています。

4. テストの実行

テストは以下のコマンドで実行します。

./vendor/bin/sail artisan test
Bash

もしくは、特定のテストファイルだけを実行することもできます。

./vendor/bin/sail artisan test --filter PostApiTest
Bash

5. デバッグの設定

テスト中にバグを見つけた場合、デバッグツールを使用して問題を特定できます。Laravelでは、Xdebugなどのデバッグツールを使用できます。

Xdebugのインストール

Docker環境でXdebugをインストールするには、docker-compose.yml ファイルに以下を追加します。

docker-compose.yml
services:
    laravel.test:
        build:
            context: .
            dockerfile: ./docker/8.1/Dockerfile
            args:
                ...
                INSTALL_XDEBUG: 1
        ...
YAML

その後、Xdebugを有効にするためにDockerコンテナを再ビルドします。

./vendor/bin/sail build --no-cache
./vendor/bin/sail up -d
Bash

Xdebugの設定

次に、Xdebugの設定を行います。php.ini ファイルに以下の設定を追加します。

php.ini
[xdebug]
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
INI

これで、VSCodeなどのIDEでデバッグセッションを開始できます。

6. デバッグの使用

ブレークポイントの設定

IDEでブレークポイントを設定し、コードの実行を一時停止して変数の値を確認できます。例えば、投稿の取得エンドポイントにブレークポイントを設定し、リクエスト処理の流れを確認します。

デバッグセッションの開始

デバッグセッションを開始するには、IDEのデバッグツールを使用します。VSCodeでは、Run メニューから Start Debugging を選択します。

7. まとめ

この記事では、Laravel 10を使ってAPIのテストとデバッグを行う方法について解説しました。テストを通じてAPIの品質を保証し、デバッグツールを使用してバグを迅速に発見して修正する方法を学びました。次回は、APIのパフォーマンスチューニングについて学びます。それでは、次の記事でお会いしましょう!

次の記事: 第9回 パフォーマンスとセキュリティの向上

コメント

タイトルとURLをコピーしました