LaravelでPHPUnitを使ってCRUDのテストをする

PHPUnitは、PHPで書かれたアプリケーションのユニットテストを行うためのフレームワークです。
ユニットテストは、コードの個々の部分が期待通りに機能するかを確認することができます。
今回はLaravelでPHPUnitを使う方法を説明します。

LaravelにおけるPHPUnitの使い方

Laravelをインストールすると、PHPUnitはデフォルトでセットアップされます。
そのため、PHPUnitを別途インストールする必要はありません。
テストを書くためにはtestsディレクトリを使います。
この中には二つのサブディレクトリ、FeatureUnitがあります。Featureディレクトリは機能テストに、Unitディレクトリはユニットテストに使われます。

テストを作る

テストケースを作成するには、artisanコマンドを使用します。例えば、Articleモデルのためのユニットテストを作成する場合は、以下のコマンドを実行します。

まずは以下のコマンドを実行してtests/Feature/ArticleTest.phpというテストファイルを作成します。

php artisan make:test ArticleTest

テストを実行するには、以下のコマンドをターミナルで実行します。

./vendor/bin/phpunit

簡単なCRUDのテストを作成してみる

<?php

namespace Tests\Feature;

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

class 記事のテスト extends TestCase
{
    use RefreshDatabase;

    // 記事作成テスト
    public function test記事を作成できる()
    {
        $article = Article::factory()->make();
        $response = $this->post('/articles', $article->toArray());

        $response->assertStatus(200);
        $this->assertDatabaseHas('articles', ['title' => $article->title]);
    }

    // 記事読み取りテスト
    public function test記事を読み取れる()
    {
        $article = Article::factory()->create();

        $response = $this->get('/articles/' . $article->id);
        $response->assertStatus(200);
        $this->assertDatabaseHas('articles', ['title' => $article->title]);
    }

    // 記事更新テスト
    public function test記事を更新できる()
    {
        $article = Article::factory()->create();
        $article->title = 'Updated Title';

        $response = $this->put('/articles/' . $article->id, $article->toArray());

        $response->assertStatus(200);
        $this->assertDatabaseHas('articles', ['title' => 'Updated Title']);
    }

    // 削除テスト
    public function test記事を削除できる()
    {
        $article = Article::factory()->create();

        $response = $this->delete('/articles/' . $article->id);

        $response->assertStatus(200);
        $this->assertDatabaseMissing('articles', ['id' => $article->id]);
    }
}

各メソッドの前に /** @test */ を記述することで、PHPUnitにそのメソッドをテストメソッドとして認識させています。
use RefreshDatabase; はテストケース実行後にデータベースを初期状態にリセットする役割を果たします。

// 記事作成テスト
public function test記事を作成できる()
{
    $article = Article::factory()->make();
    $response = $this->post('/articles', $article->toArray());

    $response->assertStatus(200);
    $this->assertDatabaseHas('articles', ['title' => $article->title]);
}

上記の test記事を作成できる メソッドでは、まず Article::factory()->make(); によりテスト用のArticleモデルを生成しています。続いて $this->post('/articles', $article->toArray()); により、生成したArticleモデルをPOSTリクエストで送信して記事を作成しています。そのレスポンスのステータスが200(成功)であること、そしてデータベースにその記事が存在することを確認しています。

// 記事読み取りテスト
public function test記事を読み取れる()
{
    $article = Article::factory()->create();

    $response = $this->get('/articles/' . $article->id);
    $response->assertStatus(200);
    $this->assertDatabaseHas('articles', ['title' => $article->title]);
}

test記事を読み取れる メソッドでは、まず Article::factory()->create(); によりテスト用のArticleモデルを生成してデータベースに保存しています。その後、$this->get('/articles/' . $article->id); によりその記事の詳細ページにアクセス(GETリクエストを送信)しています。レスポンスが200であり、データベースにその記事が存在することを確認しています。

// 記事更新テスト
public function test記事を更新できる()
{
    $article = Article::factory()->create();
    $article->title = 'Updated Title';

    $response = $this->put('/articles/' . $article->id, $article->toArray());

    $response->assertStatus(200);
    $this->assertDatabaseHas('articles', ['title' => 'Updated Title']);
}

test記事を更新できる メソッドでは、Articleモデルを生成してデータベースに保存した後、記事のタイトルを更新し、その更新内容をPUTリクエストで送信して記事を更新しています。レスポンスが200であり、データベースに更新した記事が存在することを確認しています。

// 削除テスト
public function test記事を削除できる()
{
    $article = Article::factory()->create();

    $response = $this->delete('/articles/' . $article->id);

    $response->assertStatus(200);
    $this->assertDatabaseMissing('articles', ['id' => $article->id]);
}

最後に、test記事を削除できる メソッドでは、Articleモデルを生成してデータベースに保存した後、その記事をDELETEリクエストで削除しています。レスポンスが200であり、その記事がデータベースから削除されていることを確認しています。

最後に以下のコマンドを打ってテストを実行します。

./vendor/bin/phpunit tests/Feature/PostTest.php

これにより、PostTest.phpに含まれるテストだけが実行されます。
全てのテストコードが問題なく実行されればテストは成功です。

コメントを残す

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。