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)という手法もあります。これは、最初に「こういう動作をするべきだ」というテストを書き、そのテストが通るようにプログラムを作っていく方法です。この方法を使うと、必要最小限のコードだけを書くことができ、無駄なプログラムを減らせます。
最初は簡単なテストから始めて、徐々に複雑なテストにチャレンジしていきましょう。毎日少しずつテストを書く習慣をつけることで、自然とテストの書き方が身についていきます。