カテゴリ: Laravel 更新日: 2026/07/11

LaravelでHTTPリクエストをテストする方法(GET, POSTなど)

LaravelでHTTPリクエストをテストする方法(GET, POSTなど)
LaravelでHTTPリクエストをテストする方法(GET, POSTなど)

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

生徒

「Laravelで作ったページが正しく動いているか確認するにはどうすればいいですか?」

先生

「HTTPリクエストのテストを書けば、実際にブラウザを開かなくても自動でチェックできますよ。」

生徒

「HTTPリクエストって何ですか?GETとかPOSTって聞いたことがあるんですが...」

先生

「HTTPリクエストはウェブページにアクセスしたり、フォームを送信したりする通信のことです。それでは、テストの書き方を詳しく見ていきましょう!」

1. HTTPリクエストとは?

1. HTTPリクエストとは?
1. HTTPリクエストとは?

HTTPリクエストとは、ウェブブラウザがサーバーに対して送る要求のことです。例えるなら、レストランで店員さんに注文を伝えることに似ています。お客さん(ブラウザ)が店員さん(サーバー)に「このメニューをください」と伝えると、店員さんが料理を持ってきてくれますよね。これと同じように、ブラウザがサーバーに「このページを見せてください」や「このデータを保存してください」と要求するのがHTTPリクエストです。

HTTPリクエストには主に以下のような種類があります。

  • GETリクエスト: ページを表示したり、データを取得するときに使います。ブラウザでURLを入力してページを開く操作がこれにあたります。
  • POSTリクエスト: フォームからデータを送信するときに使います。ログインフォームや問い合わせフォームの送信がこれにあたります。
  • PUTリクエスト: データを更新するときに使います。ユーザー情報の編集などで使われます。
  • DELETEリクエスト: データを削除するときに使います。投稿を削除する機能などで使われます。

Laravelでは、これらのHTTPリクエストを簡単にテストできる便利なメソッドが用意されています。実際にブラウザを操作しなくても、コードだけで動作確認ができるため、開発効率が大幅に向上します。

2. GETリクエストのテスト方法

2. GETリクエストのテスト方法
2. GETリクエストのテスト方法

GETリクエストは最も基本的なHTTPリクエストで、ページの表示をテストするときに使います。例えば、トップページが正しく表示されるかをテストしてみましょう。

<?php

namespace Tests\Feature;

use Tests\TestCase;

class HomePageTest extends TestCase
{
    public function test_トップページが表示される()
    {
        $response = $this->get('/');
        
        $response->assertStatus(200);
    }
}

このテストでは、$this->get('/')でトップページにアクセスしています。assertStatus(200)は、HTTPステータスコードが200(成功)であることを確認するメソッドです。HTTPステータスコードとは、サーバーがリクエストに対してどのような結果を返したかを示す3桁の数字です。200は「正常に処理されました」という意味で、404は「ページが見つかりません」という意味です。

商品一覧ページのように、特定のURLにアクセスするテストも書けます。

public function test_商品一覧ページが表示される()
{
    $response = $this->get('/products');
    
    $response->assertStatus(200);
    $response->assertSee('商品一覧');
}

assertSeeメソッドは、レスポンス(サーバーからの返答)に指定した文字列が含まれているかを確認します。この例では、ページに「商品一覧」という文字が表示されているかをチェックしています。

3. POSTリクエストのテスト方法

3. POSTリクエストのテスト方法
3. POSTリクエストのテスト方法

POSTリクエストは、フォームからデータを送信するときに使用します。例えば、お問い合わせフォームの送信をテストする場合は以下のようになります。

<?php

namespace Tests\Feature;

use Tests\TestCase;

class ContactFormTest extends TestCase
{
    public function test_お問い合わせフォームが送信できる()
    {
        $response = $this->post('/contact', [
            'name' => '山田太郎',
            'email' => 'yamada@example.com',
            'message' => 'お問い合わせ内容です'
        ]);
        
        $response->assertStatus(302);
        $response->assertRedirect('/contact/complete');
    }
}

$this->post()メソッドの第一引数にはURL、第二引数には送信するデータを配列で指定します。この例では、名前、メールアドレス、メッセージの3つのデータを送信しています。

assertStatus(302)は、リダイレクト(ページ転送)が発生したことを確認しています。302は「一時的な移動」を意味するステータスコードで、フォーム送信後に完了ページに転送される場合によく使われます。assertRedirectメソッドで、どのページに転送されたかも確認できます。

4. データベースへの保存をテストする

4. データベースへの保存をテストする
4. データベースへの保存をテストする

フォームから送信されたデータがデータベースに正しく保存されるかをテストすることも重要です。例えば、商品登録機能をテストする場合は以下のようになります。

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ProductCreateTest extends TestCase
{
    use RefreshDatabase;
    
    public function test_商品が登録できる()
    {
        $response = $this->post('/products', [
            'name' => 'ノートパソコン',
            'price' => 80000,
            'description' => '高性能なノートパソコンです'
        ]);
        
        $this->assertDatabaseHas('products', [
            'name' => 'ノートパソコン',
            'price' => 80000
        ]);
        
        $response->assertRedirect('/products');
    }
}

RefreshDatabaseトレイトを使うと、テストが終わるたびに自動的にデータベースがリセットされます。トレイトとは、複数のクラスで共通して使える機能をまとめたものです。これにより、テスト同士が影響し合わず、いつも同じ状態からテストを始められます。

assertDatabaseHasメソッドは、指定したテーブルに指定したデータが存在するかを確認します。この例では、productsテーブルに商品名が「ノートパソコン」で価格が80000円のレコード(データの行)が保存されているかをチェックしています。

5. PUTリクエストとDELETEリクエストのテスト

5. PUTリクエストとDELETEリクエストのテスト
5. PUTリクエストとDELETEリクエストのテスト

データの更新にはPUTリクエスト、削除にはDELETEリクエストを使います。これらもLaravelでは簡単にテストできます。

まず、商品情報を更新するPUTリクエストのテストを見てみましょう。

public function test_商品情報が更新できる()
{
    $product = Product::create([
        'name' => 'ノートパソコン',
        'price' => 80000
    ]);
    
    $response = $this->put('/products/' . $product->id, [
        'name' => 'ノートパソコン',
        'price' => 75000
    ]);
    
    $this->assertDatabaseHas('products', [
        'id' => $product->id,
        'price' => 75000
    ]);
}

このテストでは、まず商品を作成してから、その商品の価格を更新しています。$this->put()メソッドを使って更新データを送信し、データベースが正しく更新されたかを確認しています。

次に、商品を削除するDELETEリクエストのテストです。

public function test_商品が削除できる()
{
    $product = Product::create([
        'name' => 'ノートパソコン',
        'price' => 80000
    ]);
    
    $response = $this->delete('/products/' . $product->id);
    
    $this->assertDatabaseMissing('products', [
        'id' => $product->id
    ]);
}

assertDatabaseMissingメソッドは、指定したデータがデータベースに存在しないことを確認します。削除機能が正しく動作しているかをテストする際に使用します。

6. レスポンスの内容を詳しくテストする

6. レスポンスの内容を詳しくテストする
6. レスポンスの内容を詳しくテストする

HTTPリクエストのテストでは、ステータスコードだけでなく、レスポンスの内容も詳しく確認できます。例えば、JSONデータが返ってくるAPI(アプリケーション間でデータをやり取りする仕組み)をテストする場合は以下のようになります。

public function test_商品APIが正しいJSONを返す()
{
    $product = Product::create([
        'name' => 'ノートパソコン',
        'price' => 80000
    ]);
    
    $response = $this->get('/api/products/' . $product->id);
    
    $response->assertStatus(200);
    $response->assertJson([
        'name' => 'ノートパソコン',
        'price' => 80000
    ]);
}

assertJsonメソッドは、レスポンスが指定したJSON構造を含んでいるかを確認します。JSONとは、データを整理して保存・送信するための形式の一つで、JavaScriptオブジェクト記法と呼ばれます。APIの開発では頻繁に使用される形式です。

また、特定の文字列がレスポンスに含まれていないことを確認するassertDontSeeメソッドもあります。

public function test_削除された商品は表示されない()
{
    $response = $this->get('/products');
    
    $response->assertDontSee('削除された商品');
}

このように、様々なアサーションメソッドを組み合わせることで、細かい動作まで確認できます。

7. 認証が必要なページのテスト

7. 認証が必要なページのテスト
7. 認証が必要なページのテスト

ログインしていないとアクセスできないページをテストする場合、テスト用のユーザーを作成してログイン状態を再現する必要があります。LaravelではactingAsメソッドを使って簡単にログイン状態をシミュレートできます。

<?php

namespace Tests\Feature;

use Tests\TestCase;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;

class DashboardTest extends TestCase
{
    use RefreshDatabase;
    
    public function test_ログインユーザーはダッシュボードにアクセスできる()
    {
        $user = User::factory()->create();
        
        $response = $this->actingAs($user)->get('/dashboard');
        
        $response->assertStatus(200);
        $response->assertSee('ダッシュボード');
    }
    
    public function test_未ログインユーザーはログインページにリダイレクトされる()
    {
        $response = $this->get('/dashboard');
        
        $response->assertRedirect('/login');
    }
}

User::factory()->create()は、テスト用のダミーユーザーを自動的に作成するメソッドです。ファクトリーとは、テストデータを簡単に生成するための仕組みです。actingAs($user)を使うことで、そのユーザーとしてログインした状態でリクエストを送信できます。

未ログインの状態をテストする場合は、actingAsを使わずに直接リクエストを送信します。認証が必要なページにアクセスすると、通常はログインページにリダイレクトされることを確認できます。

8. CSRFトークンとテスト

8. CSRFトークンとテスト
8. CSRFトークンとテスト

通常、LaravelのフォームにはCSRFトークンというセキュリティトークンが必要です。CSRFとはクロスサイトリクエストフォージェリの略で、悪意のあるサイトから不正な操作をされるのを防ぐ仕組みです。しかし、テストでは自動的にこのトークンが処理されるため、開発者が特別に意識する必要はありません。

もしCSRF保護を無効にしてテストしたい場合は、テストクラスで以下のように設定できます。

protected function setUp(): void
{
    parent::setUp();
    $this->withoutMiddleware(\App\Http\Middleware\VerifyCsrfToken::class);
}

setUpメソッドは、各テストメソッドが実行される前に毎回呼ばれる特別なメソッドです。ここでCSRF検証を無効にすることで、すべてのテストでCSRFトークンを気にせずにリクエストを送信できます。ただし、通常のテストではLaravelが自動的に処理してくれるため、この設定は不要です。

9. HTTPリクエストテストでよく使うアサーションメソッド

9. HTTPリクエストテストでよく使うアサーションメソッド
9. HTTPリクエストテストでよく使うアサーションメソッド

LaravelのHTTPテストでは、様々なアサーションメソッドが用意されています。よく使うものを一覧で紹介します。

メソッド名 説明
assertStatus(200) HTTPステータスコードが指定した値であることを確認
assertSee('文字列') レスポンスに指定した文字列が含まれていることを確認
assertDontSee('文字列') レスポンスに指定した文字列が含まれていないことを確認
assertRedirect('/path') 指定したパスにリダイレクトされることを確認
assertJson([...]) JSONレスポンスが指定した構造を含むことを確認
assertViewIs('view.name') 指定したビューファイルが使われていることを確認

これらのメソッドを組み合わせることで、ページの表示からデータの保存、削除まで、あらゆる動作を自動的にテストできます。一度テストを書いておけば、プログラムを修正したときに既存の機能が壊れていないかを瞬時に確認できるため、安心して開発を進められます。

HTTPリクエストのテストは、Laravelアプリケーション開発において非常に重要なスキルです。最初は難しく感じるかもしれませんが、実際に手を動かしてテストを書いていくうちに、自然と身についていきます。簡単なテストから始めて、徐々に複雑なテストにチャレンジしていきましょう。

まとめ

まとめ
まとめ

ここまで、LaravelにおけるHTTPリクエストのテスト方法について詳しく解説してきました。Webアプリケーション開発において、テストコードを書くことは、単にバグを見つけるためだけではなく、将来の自分やチームメンバーが安心してコードを修正・拡張するための「命綱」となります。

本記事の主要なポイントを改めて振り返ってみましょう。まず、HTTPリクエストにはGET、POST、PUT、DELETEといった種類があり、それぞれ「ページの表示」「データの新規作成」「データの更新」「データの削除」という役割を担っています。Laravelでは、これらの操作をPHPユニットテストの中で直感的なメソッド名を使ってシミュレートできるのが大きな強みです。

テストコードの実装ポイント再確認

実際の開発現場でよく使われる、ステータスコードの検証やデータベースの確認方法を、コード例を交えておさらいします。特に、テスト実行ごとにデータベースをクリーンな状態に保つRefreshDatabaseトレイトの使用は、テストの信頼性を担保するために欠かせません。

基本的なテスト構造の例

例えば、特定の記事詳細ページが正しく表示され、適切なステータスコードが返却されるかを確認するコードは以下のようになります。

public function test_記事詳細ページが正常に表示される()
{
    // 1. テストデータの準備
    $post = Post::factory()->create([
        'title' => 'テスト記事タイトル',
        'content' => 'これはテスト内容です。',
    ]);

    // 2. GETリクエストの実行
    $response = $this->get('/posts/' . $post->id);

    // 3. アサーション(検証)
    $response->assertStatus(200);
    $response->assertSee('テスト記事タイトル');
}

また、フォーム送信後の動作を検証する際は、リダイレクト先やデータベースへの書き込み内容までチェックすることが推奨されます。

public function test_新規投稿がデータベースに保存される()
{
    $data = [
        'title' => '新機能のお知らせ',
        'body' => 'Laravelのテスト機能は非常に強力です。',
    ];

    // POSTリクエストでデータを送信
    $response = $this->post('/posts', $data);

    // データベースに指定したデータが存在するか確認
    $this->assertDatabaseHas('posts', [
        'title' => '新機能のお知らせ'
    ]);

    // 送信後のリダイレクト先を確認
    $response->assertRedirect('/posts');
}

実践的なテスト運用のコツ

テストを書く際に意識したいのは、「正常系」だけでなく「異常系」のテストも網羅することです。

  • バリデーションエラーの確認:正しくないデータを送信した際に、適切なエラーメッセージが返るか、あるいは元の入力画面にリダイレクトされるかを確認します。
  • 権限の確認:ログインしていないユーザーが管理画面にアクセスしようとした場合、しっかりとログインページへ弾かれる(302リダイレクト)かをチェックします。
  • データの整合性:更新処理(PUT)や削除処理(DELETE)を行った後、他のデータに影響が出ていないか、または意図したレコードだけが変更されているかをassertDatabaseMissingなどで厳密に確認します。

Laravelのテスト機能は、非常に人間に読みやすい(読み口が自然な)メソッド名で構成されています。そのため、テストコード自体が「このシステムはどう動くべきか」という仕様書の役割も果たしてくれます。最初は1つのGETリクエストを確認するだけの小さなテストからで構いません。少しずつ積み重ねていくことで、変更に強く、品質の高いアプリケーションを構築できるようになります。

先生と生徒の振り返り会話

生徒

「先生、まとめを読んでHTTPテストの重要性がさらによく分かりました。でも、テストをたくさん書くと開発の時間が削られてしまう気がするのですが、そのあたりはどう考えればいいでしょうか?」

先生

「鋭い質問ですね。確かに最初はテストを書く分、少し時間がかかるかもしれません。でも、想像してみてください。後から機能を一つ追加したときに、他のどこかが壊れていないか全部手動でブラウザを開いて確認する手間を。テストがあれば、コマンド一つで全ての機能が正常か数秒で確認できます。長い目で見れば、確実に時間を節約できるんですよ。」

生徒

「なるほど。手動で何度もポチポチ確認するより、コードに任せたほうが正確だし早いってことですね。assertStatus(200)以外の数字が出てきたら、何かがおかしいとすぐに気づけますもんね。」

先生

「その通りです!例えば、ログインが必要なページに未ログインでアクセスしたときに、意図せず200(成功)が返ってきたら、それはセキュリティ上の重大なバグだと分かります。テストは、開発者が意図した通りの『防壁』が機能しているかを証明してくれるんです。」

生徒

「あと、データベースのテストで使ったRefreshDatabaseというのも便利ですね。自分でデータを消したり戻したりしなくていいのは助かります。」

先生

「そうですね。テストごとに真っさらな状態から始められるので、前のテストで作ったデータが邪魔をして次のテストが失敗する、といったトラブルも防げます。まさにテストのための『魔法の道具』です。まずは一番よく使うページのGETリクエストテストから、自分のプロジェクトに導入してみてくださいね。」

生徒

「はい!まずはトップページと、大事なお問い合わせフォームの送信テストから書いてみます。ありがとうございました!」

関連記事:
カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyとは?PHPの堅牢なフレームワークの特徴と活用シーン
New2
Laravel
Laravelのプロジェクト構造を理解しよう!初心者向けディレクトリ解説
New3
Laravel
Laravelのモック化を完全解説!MockeryとFacadesでテストを簡単にする方法
New4
CodeIgniter
CodeIgniterバリデーションのよくある失敗例と対策!初心者向けエラーチェック完全ガイド
人気記事
No.1
Java&Spring記事人気No1
Symfony
Symfonyの抽象コントローラとは?AbstractControllerを初心者向けにやさしく解説
No.2
Java&Spring記事人気No2
PHP
PHPで定数を定義する方法!defineとconstの違いと使い分けを徹底比較
No.3
Java&Spring記事人気No3
Symfony
Symfonyでバリデーションメッセージを多言語対応する方法!初心者でもわかる国際化の基本
No.4
Java&Spring記事人気No4
Laravel
LaravelのBlade構文まとめ!@if @foreach など基本ディレクティブ解説
No.5
Java&Spring記事人気No5
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.6
Java&Spring記事人気No6
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.7
Java&Spring記事人気No7
Laravel
Laravelのルーティングの基本構文と書き方をやさしく解説!初心者でも理解できるWebルートの仕組み
No.8
Java&Spring記事人気No8
Laravel
Laravelのテンプレート継承の使い方(@extends, @section, @yield)