こんにちは、かつコーチです。
Laravelで開発を進めると、最終的にテストをして、デプロイ(リリース)になります。
しかし、このテストについて解説されているものが少ないので、ここでまとめておきたいと思います。
テストとは?
プロジェクトをリリースする前に行うテストは、システムが正しく動作するか、バグやエラーがないか、
期待通りの結果が得られるかを確認する重要なプロセスです。
テストは主に以下のような目的で行われます。
テストの目的
- 動作確認: アプリケーションが仕様通りに動作することを確認します。
- エラーチェック: バグやエラーがないか、予期せぬ動作をしないかを確認します。
- リグレッション防止: 新しいコードが既存の機能に悪影響を与えないことを保証します。
- パフォーマンス確認: アプリケーションが適切な速度や負荷で動作するかをテストします。
- セキュリティ確認: システムの脆弱性や、データ漏洩のリスクを確認します。
テストの種類
テストにはいくつかの種類があります。
それぞれの段階で行う内容が異なり、プロジェクト全体を網羅的にテストするために
複数の種類を組み合わせて使用します。
- ユニットテスト(Unit Test):
- 個々の機能やメソッドが期待通りに動作するかを確認します。
- 特に関数やクラスのメソッドに焦点を当て、単体でテストを行います。
- 例: ユーザーのパスワードの暗号化処理が正しく動作するか。
- 統合テスト(Integration Test):
- 複数のコンポーネントやシステムのモジュールが正しく連携して動作するかを確認します。
- 例: フォームからデータを送信したときに、データベースに正しく保存され、期待通りのレスポンスが返されるか。
- 機能テスト(Feature Test):
- アプリケーション全体の機能が期待通りに動作するかを確認します。
- 例: ユーザーのログイン機能が正常に動作するか、リダイレクトが正しいか。
- エンドツーエンドテスト(End-to-End Test):
- システム全体の流れが期待通りに動作するかを確認します。
- 例: ユーザーがログインし、投稿を作成して、一覧に表示されるまでの一連の流れをテストします。
- リグレッションテスト(Regression Test):
- 既存の機能が変更や修正によって壊れていないかを確認します。
- 例: 新しい機能を追加した後、既存のユーザー管理機能が問題なく動作しているかを確認する。
- セキュリティテスト:
- システムにセキュリティ上の脆弱性がないかを確認します。
- 例: SQLインジェクションやクロスサイトスクリプティング(XSS)攻撃ができないかをテストする。
Laravelにおけるテスト
Laravelには、テストを効率的に行うためのフレームワークが組み込まれています。
LaravelではPHPUnitをデフォルトのテストフレームワークとして使用していますが、
最近はPestというシンプルで読みやすいテストフレームワークも人気です。
1. PHPUnit:
- Laravelに組み込まれているデフォルトのテストフレームワークです。
- クラスベースで、比較的詳細なテストケースを書くことが可能です。
- テストファイルは、
tests/Unit
やtests/Feature
ディレクトリに格納されます。 - PHPUnitは非常に強力ですが、記述がやや冗長になることもあり、複雑なテストを書きやすい半面、コードが長くなりがちです。
PHPUnitの例:
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
/** @test */
public function it_can_create_a_user()
{
$user = User::factory()->create();
$this->assertDatabaseHas('users', ['email' => $user->email]);
}
}
2. Pest:
- Pestは、PHPUnitの上に構築されたテストフレームワークで、シンプルで読みやすい記述が特徴です。
- 記述が短く、簡潔なテストコードを実現できるため、初心者から上級者まで利用されています。
- Laravelプロジェクトでも簡単に導入でき、より直感的にテストが書けるというメリットがあります。
Pestの例:
it('can create a user', function () {
$user = User::factory()->create();
expect($user->email)->toBeInDatabase('users');
});
PHPUnitとPestの違い
- 記述スタイル: PestはPHPUnitよりもシンプルで直感的に書ける。PHPUnitはクラスベースでより詳細な設定や拡張が可能です。
- シンプルさ: Pestはシンプルなテストを書くのに最適で、学習コストが低い。一方、PHPUnitは複雑なテストケースにも対応しやすいが、その分記述量が増えやすい。
- 導入のしやすさ: PHPUnitはデフォルトでLaravelに組み込まれているため、特別なインストールが不要。Pestは後からインストールする必要がありますが、簡単にセットアップできます。
テストの流れ
- テストの準備:
- 開発中のコードに対して、適切なテストケースを準備します。まずはユニットテストや機能テストを中心に、小さい単位からテストを始めます。
- テストの実行:
- コマンドを使ってテストを実行します。Laravelでは、
php artisan test
コマンドでPHPUnitやPestのテストを簡単に実行できます。
- コマンドを使ってテストを実行します。Laravelでは、
- エラーやバグの修正:
- テスト結果に基づいて、バグやエラーが見つかった場合は修正します。修正したら、再度テストを実行して問題が解決したか確認します。
- 継続的なテスト:
- 新しい機能を追加したり、コードを修正する際には、リグレッションテストを行い、既存の機能が壊れていないか確認します。
まとめ
- テストはプロジェクトの品質を保つために非常に重要な工程であり、ユニットテストや機能テストをはじめ、様々な種類のテストを適切に行う必要があります。
- Laravelでは、PHPUnitが標準でサポートされていますが、Pestのようなシンプルなフレームワークも人気です。
- フロントエンドとバックエンドの統合的なテスト(E2Eテスト)も含めて、テストを継続的に実施することで、安定したアプリケーションをリリースすることができます。