PHPUnitは、PHPで書かれたアプリケーションのユニットテストを行うためのフレームワークです。
ユニットテストは、コードの個々の部分が期待通りに機能するかを確認することができます。
今回はLaravelでPHPUnitを使う方法を説明します。
LaravelにおけるPHPUnitの使い方
Laravelをインストールすると、PHPUnitはデフォルトでセットアップされます。
そのため、PHPUnitを別途インストールする必要はありません。
テストを書くためにはtests
ディレクトリを使います。
この中には二つのサブディレクトリ、Feature
とUnit
があります。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
に含まれるテストだけが実行されます。
全てのテストコードが問題なく実行されればテストは成功です。