Laravelでテストを始める方法!PHPUnitとartisan testの基礎
生徒
「Laravelで作ったプログラムが正しく動いているか確認する方法はありますか?」
先生
「はい、Laravelには自動テストという機能があります。PHPUnitやartisan testを使えば、プログラムが正しく動作しているか自動でチェックできるんですよ。」
生徒
「自動テストって何ですか?手動でチェックするのとは違うんですか?」
先生
「手動だと毎回ブラウザで確認する必要がありますが、自動テストなら一度書いておけば何度でも自動でチェックできます。それでは基本から見ていきましょう!」
1. Laravelのテストとは?
Laravelのテストとは、作成したプログラムが正しく動作しているかを自動的に確認する仕組みです。例えるなら、料理を作った後に味見をするようなものです。味見をせずに料理を出すと失敗する可能性がありますよね。プログラムも同じで、テストをすることでバグ(プログラムの不具合)を早期に発見できます。
Laravelには最初からPHPUnitという人気のテストツールが組み込まれています。PHPUnitは、PHP言語で書かれたプログラムをテストするための専用ツールです。また、Laravelにはartisan testという便利なコマンドも用意されており、初心者でも簡単にテストを実行できるようになっています。
2. テストファイルの場所と構造
Laravelプロジェクトを作成すると、testsというフォルダが自動的に作られます。このフォルダの中に、テスト用のファイルを保存していきます。testsフォルダには2つの重要なサブフォルダがあります。
- Featureフォルダ:実際のユーザー操作に近いテストを書く場所です。例えば、ログイン機能や商品購入機能など、複数の処理をまとめてテストします。
- Unitフォルダ:小さな機能単位でテストを書く場所です。例えば、計算処理や文字列処理など、一つの関数やメソッドだけをテストします。
最初からサンプルのテストファイルが入っているので、それを参考にしながら学習を進めることができます。テストファイルの名前は必ずTestで終わる必要があります。例えばUserTest.phpやLoginTest.phpのような名前です。
3. 最初のテストを書いてみよう
それでは実際に簡単なテストを書いてみましょう。まずはコマンドラインで新しいテストファイルを作成します。コマンドラインとは、黒い画面に文字を入力してパソコンを操作する方法です。Windowsではコマンドプロンプトやターミナルと呼ばれるアプリを使います。
以下のコマンドを実行すると、Unitテスト用のファイルが自動生成されます。
php artisan make:test CalculatorTest --unit
このコマンドを実行すると、tests/Unit/CalculatorTest.phpというファイルが作成されます。それでは、このファイルを開いて、簡単な計算テストを書いてみましょう。
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
public function test_足し算が正しく動作する()
{
$result = 2 + 3;
$this->assertEquals(5, $result);
}
}
このコードでは、2と3を足した結果が5になることをテストしています。assertEqualsメソッドは、2つの値が等しいかどうかを確認するメソッドです。もし結果が5でなければ、テストは失敗します。メソッド名は日本語でも書けるので、何をテストしているのか分かりやすくなります。
4. テストを実行する方法
テストを書いたら、実際に実行してみましょう。Laravelでは2つの方法でテストを実行できます。
方法1:artisan testコマンドを使う
これが最も簡単な方法です。プロジェクトのルートディレクトリ(プロジェクトフォルダの一番上の階層)で、以下のコマンドを実行します。
php artisan test
このコマンドを実行すると、testsフォルダ内のすべてのテストが実行され、結果が見やすく表示されます。成功したテストは緑色、失敗したテストは赤色で表示されるので、一目で状態が分かります。
方法2:PHPUnitコマンドを直接使う
より詳細な情報が必要な場合は、PHPUnitコマンドを直接使うこともできます。
./vendor/bin/phpunit
この方法では、より詳しいテスト結果やエラーメッセージが表示されます。初心者の方は、まずphp artisan testから始めることをおすすめします。
5. アサーションメソッドの基本
アサーション(assertion)とは、「主張」や「断言」という意味で、テストの中で「この値はこうなっているはずだ」と確認することです。PHPUnitには様々なアサーションメソッドが用意されています。
よく使われる基本的なアサーションメソッドをいくつか紹介します。
public function test_様々なアサーション()
{
// 値が等しいか確認
$this->assertEquals(10, 5 + 5);
// 値が真(true)であるか確認
$this->assertTrue(true);
// 値が偽(false)であるか確認
$this->assertFalse(false);
// 配列に特定の値が含まれているか確認
$fruits = ['りんご', 'バナナ', 'オレンジ'];
$this->assertContains('バナナ', $fruits);
}
これらのアサーションメソッドを組み合わせることで、様々なパターンのテストが書けるようになります。例えば、ユーザー登録機能をテストする場合、メールアドレスが正しく保存されているか、パスワードが暗号化されているか、などを確認できます。
6. Featureテストの書き方
Featureテストでは、実際のユーザー操作をシミュレートしたテストが書けます。例えば、ウェブページにアクセスしたときに正しく表示されるかをテストできます。
まず、Featureテスト用のファイルを作成します。
php artisan make:test HomePageTest
次に、トップページが正しく表示されるかテストしてみましょう。
<?php
namespace Tests\Feature;
use Tests\TestCase;
class HomePageTest extends TestCase
{
public function test_トップページが表示される()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
このテストでは、get('/')でトップページにアクセスし、assertStatus(200)でHTTPステータスコードが200(成功)であることを確認しています。HTTPステータスコードとは、ウェブサーバーがリクエストに対してどのような結果を返したかを示す番号です。200は「正常に表示できました」という意味です。
7. データベースを使ったテスト
実際のアプリケーション開発では、データベースを使った機能をテストすることが多くあります。Laravelでは、テスト用の専用データベースを使うことで、本番のデータに影響を与えずにテストができます。
データベースを使うテストでは、RefreshDatabaseという機能を使います。これは、テストが終わるたびにデータベースをリセットしてくれる便利な機能です。例えば、ユーザー登録のテストを書く場合、毎回同じ状態から始められるので、テスト結果が安定します。
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Models\User;
class UserTest extends TestCase
{
use RefreshDatabase;
public function test_ユーザーが作成できる()
{
$user = User::create([
'name' => '山田太郎',
'email' => 'yamada@example.com',
'password' => bcrypt('password123')
]);
$this->assertDatabaseHas('users', [
'email' => 'yamada@example.com'
]);
}
}
assertDatabaseHasメソッドは、データベースの指定したテーブルに、指定した値を持つレコード(データの行)が存在するかを確認します。このテストでは、ユーザーが正しくデータベースに保存されたかをチェックしています。
8. テスト実行時のオプション
テストを実行する際に、様々なオプションを指定することで、より効率的にテストができます。
| オプション | 説明 |
|---|---|
--filter |
特定の名前を含むテストだけを実行します |
--testsuite |
FeatureまたはUnitだけを実行します |
--parallel |
複数のテストを同時に実行して時間を短縮します |
例えば、Calculatorという名前のテストだけを実行したい場合は、以下のようにします。
php artisan test --filter=Calculator
Unitテストだけを実行したい場合は、以下のコマンドを使います。
php artisan test --testsuite=Unit
これらのオプションを使いこなすことで、開発効率が大きく向上します。特に大規模なプロジェクトでは、全てのテストを実行すると時間がかかるため、変更した部分に関連するテストだけを実行することが一般的です。
9. テストを書くメリットと習慣化
プログラミング初心者の方は、「テストを書くのは面倒くさい」と感じるかもしれません。しかし、テストを書く習慣をつけることで、長期的には大きなメリットがあります。
まず、バグの早期発見ができます。手動でテストすると見落としがちな小さなバグも、自動テストなら確実に見つけられます。また、コードを修正したときに、他の部分が壊れていないか簡単に確認できます。これをリグレッションテスト(退行テスト)と呼びます。
次に、ドキュメントとしての役割も果たします。テストコードを読めば、その機能がどのように動くべきかが分かります。特にチームで開発する場合、テストがあることで他の開発者があなたのコードを理解しやすくなります。
さらに、テストを先に書いてからプログラムを作るテスト駆動開発(TDD)という手法もあります。これは、最初に「こういう動作をするべきだ」というテストを書き、そのテストが通るようにプログラムを作っていく方法です。この方法を使うと、必要最小限のコードだけを書くことができ、無駄なプログラムを減らせます。
最初は簡単なテストから始めて、徐々に複雑なテストにチャレンジしていきましょう。毎日少しずつテストを書く習慣をつけることで、自然とテストの書き方が身についていきます。
まとめ
今回の記事では、Laravelでのテストの始め方について、初心者の方でもスムーズに一歩を踏み出せるように詳しく解説してきました。PHPUnitやartisan testといったツールを使いこなすことで、プログラムの品質を保ちながら、自信を持って開発を進めることができるようになります。
テストコードを書くことは、最初は少し手間に感じるかもしれません。しかし、プロジェクトの規模が大きくなるにつれて、その真価を発揮します。既存の機能を壊していないか(デグレードしていないか)をコマンド一つで瞬時に確認できる安心感は、エンジニアにとって何物にも代えがたい財産となります。まずは、もっともシンプルな「Unitテスト」から書き始めて、徐々に「Featureテスト」へとステップアップしていきましょう。
学習の振り返りポイント
ここまでの内容で特に重要なポイントを整理しました。これらを意識するだけでも、テストに対する理解がぐっと深まります。
- テストの種類を使い分ける: 単一の機能を検証するUnitテストと、一連のユーザー操作を検証するFeatureテストの役割を理解すること。
- アサーションを味方につける:
assertEqualsやassertStatusなど、期待する結果を宣言するメソッドを使いこなすこと。 - データベースのリセット:
RefreshDatabaseトレイトを使い、常にクリーンな状態でテストを実行する習慣をつけること。 - 効率的な実行:
--filterオプションなどを使って、必要なテストだけを素早く実行して開発リズムを整えること。
応用的なテストコードの例
まとめとして、もう少し実戦に近いサンプルを紹介します。例えば、特定のユーザーとしてログインし、会員専用のページが表示されるかどうかを確認するFeatureテストは以下のようになります。
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
class DashboardTest extends TestCase
{
use RefreshDatabase;
public function test_ログインユーザーがダッシュボードにアクセスできる()
{
// 1. テスト用のユーザーを作成
$user = User::factory()->create();
// 2. 作成したユーザーとしてログインしてリクエストを送る
$response = $this->actingAs($user)->get('/dashboard');
// 3. ステータスコードが200であることを確認
$response->assertStatus(200);
// 4. 画面に特定の文字が表示されているか確認
$response->assertSee('ようこそ');
}
}
このように、actingAsメソッドを使うことで、ログイン状態のシミュレーションが簡単にできます。こうしたテクニックを一つずつ覚えていくことで、より高度な自動テストが書けるようになります。
テストは「正解」を確認するだけでなく、「設計」を見直すきっかけにもなります。もしテストが書きにくいと感じたら、それはプログラム自体が複雑になりすぎているサインかもしれません。テストを通じて、より美しく、メンテナンスしやすいコードを目指していきましょう。
生徒
「先生、お疲れ様です!テストの基本について一通り学んでみましたが、思ったよりシンプルで驚きました。特にphp artisan testの結果が緑色で表示されると、なんだか達成感がありますね!」
先生
「そうですね、その『オールグリーン』の安心感こそが自動テストの醍醐味です。最初は計算テストのような小さなものからでいいんです。慣れてくると、テストなしでコードを書くのが怖くなるくらいですよ。」
生徒
「たしかに、後でプログラムを書き換えたときに、どこかが壊れていないか一瞬でチェックできるのは心強いです。でも、全部の機能にテストを書くのは大変そうですね……。」
先生
「初心者のうちは、完璧を目指さなくても大丈夫です。まずは『絶対に間違えたくない重要なロジック』や『不具合が起きやすい複雑な処理』から優先的に書いてみましょう。少しずつ積み重ねていけばいいんですよ。」
生徒
「なるほど。まずは重要な部分からですね!今回学んだRefreshDatabaseも、データベースを汚さずにテストできるので積極的に使っていこうと思います。他にも便利なコマンドはありますか?」
先生
「いい質問ですね!例えば、失敗したテストだけを再実行する--failingオプションや、テストの途中で止めて中身を確認するデバッグ手法など、便利な使い方はまだまだあります。これらは実際に開発を進める中で、必要に応じて覚えていくのが上達の近道ですよ。」
生徒
「分かりました!まずは今日作ったサンプルを自分でアレンジして、いろいろ動かしてみます。エラーが出ても、それがテストの役割だと思って前向きに取り組んでみます!」
先生
「その意気です!エラー(赤色)が出るのは、バグを未然に防げたという成功体験でもあります。これからも楽しみながらLaravelの学習を進めていきましょうね。」