カテゴリ: Laravel 更新日: 2026/03/29

Laravelテストの例外処理を完全攻略!初心者でもデバッグができる追跡方法

Laravelでテスト時の例外を追跡・デバッグする方法
Laravelでテスト時の例外を追跡・デバッグする方法

先生と生徒の会話形式で理解しよう

生徒

「Laravelで自動テストを書いているのですが、エラーが起きたときに『なぜ失敗したのか』が分からなくて困っています。」

先生

「テスト中のエラーは、通常の画面表示と違って少し特殊な見え方をしますからね。例外の追跡方法を知ると、デバッグがぐっと楽になりますよ。」

生徒

「追跡…なんだか探偵みたいですね!具体的にどうやってエラーの正体をつかむんですか?」

先生

「Laravelにはテスト専用のデバッグ機能が備わっています。まずは基本から一緒に見ていきましょう!」

1. 自動テストと例外の基本を知ろう

1. 自動テストと例外の基本を知ろう
1. 自動テストと例外の基本を知ろう

プログラミングにおける自動テストとは、人間が手作業で確認する代わりに、パソコンに「この機能は正しく動いているかな?」と自動でチェックさせる仕組みのことです。パソコンを触ったことがない方に例えると、工場の検品作業を全自動ロボットに任せるようなイメージです。そして、そのチェック中に発生する予定外のトラブルを例外(エラー)と呼びます。

通常、Laravelはエラーが起きると、ユーザーに親切なエラー画面を見せようとします。しかし、テスト中はこの「親切心」が仇となり、本当の原因が隠されてしまうことがあります。テストの結果が「失敗(Fail)」とだけ表示され、中身がわからない状態を解決するのが、今回のデバッグ(不具合探し)の目的です。

2. withoutExceptionHandlingでエラーを丸裸にする

2. withoutExceptionHandlingでエラーを丸裸にする
2. withoutExceptionHandlingでエラーを丸裸にする

Laravelのテスト機能には、エラーを優しく包み込んで隠してしまう「例外ハンドリング」という機能が備わっています。これを一時的に解除するのが withoutExceptionHandling(ウィズアウト・エクセプション・ハンドリング)という魔法の言葉です。これを使うと、隠されていたエラーの正体がコンソール(黒い画面)にそのまま表示されるようになります。

以下のコードは、テストの中でわざとエラーの詳細を露出させる方法です。原因が分からなくて詰まったときに、まず最初に試すべきテクニックです。


public function test_example_error()
{
    // 例外ハンドリングを無効化して、エラーの正体を表示させる
    $this->withoutExceptionHandling();

    // 存在しないページにアクセスして、あえてエラーを起こしてみる
    $response = $this->get('/non-existent-page');

    $response->assertStatus(200);
}

この命令を一行入れるだけで、なぜテストが失敗したのかという詳細な足跡(スタックトレース)が画面に溢れ出します。これを見れば、どのファイルの何行目が間違っているのかが一目瞭然になります。

3. 実行結果のダンプ表示を活用する

3. 実行結果のダンプ表示を活用する
3. 実行結果のダンプ表示を活用する

テスト中に「今のデータの状態はどうなっているんだろう?」と中身を覗き見したくなることがあります。そんな時に便利なのが dump()(ダンプ)という命令です。これは、プログラムの変数の内容を一時的に画面に書き出す機能です。

例えば、サーバーからの返事(レスポンス)の内容を詳しく見たいときは、以下のように書きます。パソコン初心者の方は、箱の中身をぶちまけて確認する作業だと思ってください。


public function test_response_data()
{
    $response = $this->get('/');

    // レスポンスの内容を画面に表示して確認する
    $response->dump();

    $response->assertStatus(200);
}

実行すると、テストの結果と一緒に、HTMLの中身やデータの一覧が表示されます。これによって、自分の予想と実際の動きがどうズレているのかを確認できます。

4. dumpの後で処理を止めるddの威力

4. dumpの後で処理を止めるddの威力
4. dumpの後で処理を止めるddの威力

dump() は中身を表示してそのまま処理を続けますが、表示した瞬間にプログラムを完全に停止させたい時は dd() を使います。これは「Dump and Die(表示して死ぬ)」の略で、非常に強力なデバッグツールです。不具合が起きている場所を特定するために、少しずつ移動させながら実行するのがコツです。


public function test_check_user_status()
{
    $user = \App\Models\User::factory()->create();

    // ここでユーザー情報を表示して、以降の処理を中断する
    $this->dd($user);

    $response = $this->get('/profile');
    $response->assertStatus(200);
}

テストが膨大にある場合、最後まで実行されるのを待つのは時間がかかります。dd() を使えば、気になる箇所でピンポイントに止めて、その瞬間の「証拠」をじっくり観察できるのです。

5. 例外が発生したことをテストする

5. 例外が発生したことをテストする
5. 例外が発生したことをテストする

デバッグとは逆に、「この操作をしたら正しくエラーが発生すること」を確認するテストもあります。例えば、パスワードを間違えたときにちゃんと拒否されるか、といった確認です。これには assertThrows(アサート・スローズ)を使います。これは「例外が投げられることを確信(アサート)する」という意味です。


public function test_exception_is_thrown()
{
    // 指定した例外が発生することを期待するテスト
    $this->assertThrows(function () {
        // わざと間違った処理を実行
        throw new \Exception('予期せぬトラブル発生!');
    }, \Exception::class);
}

エラーが起きるのが「正常な動き」である場合、このようにテストを組むことで、将来プログラムを書き換えたときに「エラーが起きるはずなのに起きなくなった」というバグを未然に防ぐことができます。

6. ログファイルを確認するデバッグ術

6. ログファイルを確認するデバッグ術
6. ログファイルを確認するデバッグ術

テストの結果画面に表示されない情報は、Laravelの「ログ」という日記帳に書き込まれていることがあります。storage/logs/laravel.log というファイルです。テスト中に何か深刻なエラーが起きると、Laravelはこの日記にこっそり内容を書き残します。

もしテストが失敗しているのに理由が一切表示されない場合は、このログファイルをメモ帳などで開いてみてください。そこにはエラーが発生した時刻や原因が詳しく記録されています。パソコンを触ったことがない方にとってファイルを開くのは緊張するかもしれませんが、日記を読むだけだと思えば怖くありません。

7. PHPUnitの構成ファイルでデバッグを楽にする

7. PHPUnitの構成ファイルでデバッグを楽にする
7. PHPUnitの構成ファイルでデバッグを楽にする

Laravelのテストは、裏側で「PHPUnit」という別のツールが動いています。このツールの設定ファイルである phpunit.xml を少し書き換えるだけで、テストのたびにデバッグ情報を出しやすくすることができます。例えば、データベースをテスト専用のものに切り替えるなどの設定がここで行われます。

難しい設定は必要ありませんが、「テスト専用の環境設定がある」ということを知っておくだけで、本番のデータやファイルを壊さずに安心してデバッグ作業ができるようになります。安全な実験室で作業しているような感覚ですね。

8. Rayなどの外部デバッグツールとの連携

8. Rayなどの外部デバッグツールとの連携
8. Rayなどの外部デバッグツールとの連携

Laravelには、ログをより綺麗に、リアルタイムに表示してくれる「Ray」のような便利な外部ツールも存在します。これを使うと、テストを実行しながら別のウィンドウでデータが流れていく様子を眺めることができます。初心者のうちは標準の dump で十分ですが、慣れてきたらこうしたツールを取り入れると、プログラミングがどんどん楽しくなります。

デバッグは、犯人探しではなく「対話」です。プログラムが何を伝えようとしているのかを理解するために、様々な道具を使ってみましょう。例外を追跡し、原因を特定して修正するたびに、あなたのプログラミングスキルは確実に向上していきます!

関連記事:
カテゴリの一覧へ
新着記事
New1
Symfony
Twigのテンプレート分割と再利用を完全解説!初心者向けinclude・embedの使い方
New2
Laravel
Laravelのマイグレーション構文まとめ!table・column・indexをやさしく解説
New3
PHP
PHPの文法ルールまとめ!セミコロンや大文字小文字の区別を初心者に解説
New4
Symfony
Twigでセッションとユーザー情報を表示する方法!Symfony初心者向け完全ガイド
人気記事
No.1
Java&Spring記事人気No1
CodeIgniter
CodeIgniterのフィルタ機能を完全ガイド!初心者でもわかるイベント・フィルタの使い方
No.2
Java&Spring記事人気No2
CodeIgniter
CodeIgniter 4のインストール方法まとめ(Composer・手動)
No.3
Java&Spring記事人気No3
Laravel
Laravelでtry-catchを使いこなす!例外処理の基本と効果的なパターン
No.4
Java&Spring記事人気No4
Symfony
Symfonyでアップロードファイル名を安全に変更・管理する方法を完全解説
No.5
Java&Spring記事人気No5
Laravel
Laravelのプロジェクト構造を理解しよう!初心者向けディレクトリ解説
No.6
Java&Spring記事人気No6
CodeIgniter
CodeIgniterのルーティングとは?仕組みと役割を基礎から解説
No.7
Java&Spring記事人気No7
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.8
Java&Spring記事人気No8
CodeIgniter
CodeIgniterの認証チェックをフィルタで実装する方法!初心者でもわかる完全ガイド