WHITEPLUS TechBlog

株式会社ホワイトプラスのエンジニアによる開発ブログです。

LaravelでHTTPテストを実装しました

はじめに

こんにちは、ホワイトプラスのコアシステム開発Gのエンジニアのyamauchiです。 今回、新たにHTTPテストを実装したため、実装時に発覚した問題とその解決法を共有したいと思います。

HTTPテストとは

HTTPテストとは、擬似的なHTTPリクエストを生成し対象のエンドポイントに投げ、返却されたレスポンスが期待したものかチェックするテストです。

背景

現在、コアシスが担当しているシステムでは、手動でテストを行う余地が残されており、リファクタリングを積極的に進める現状では、安全性や効率性をより高めたいという背景がありました。 そのためリグレッションテストの自動化を進め、手動で確認する割合を減らしたいと考えています。

ただし、無闇にテストの数を増やすのではなく、テストピラミッドのルールに従って効率的かつ効果的なテストを作成していく方針です。

実装方法

弊社のシステムではPHPのフレームワークにLaravelを採用しているため、Laravel標準機能を使用しました。 以下は標準機能を使用したサンプルコードです。

<?php
namespace Tests\Sample;

use Tests\TestCase;

class RequestRootUrlTest extends TestCase
{
    public function test_request_root_url()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

ルートURL "/" に対してGETをリクエストした際にステータスコード200が返却されていることを確認するテスト

認証が必要な場合のテストケースも標準機能で作成できます。

<?php
namespace Tests\Sample;

use Tests\TestCase;
use User;

class RequestRequiresAuthenticationTest extends TestCase
{
    public function test_request_requires_authentication()
    {
        $user = User::factory()->create();

        $response = $this->actingAs($user)
                         ->withSession(['banned' => false])
                         ->get('/');
    }
}
生成したUserインスタンスの認証に成功させた状態でGETをリクエストする。

参考:HTTPテスト 10.x Laravel

課題

Lenetに存在するルーティングには一部セッションの情報から動的にルート定義を行っているものが存在します。 ユニットテスト実行時には、Webからアクセスする際に保持されるサーバー変数やセッション変数は存在しないため、 それらの値を利用して動的にルーティングを生成することが出来ません。 そのままの状況でhttpテストを実行しても期待した結果は得られませんでした。

解決方法

以下のようにテスト実行時に予めルーティングの定義の読み込みを行うことで動的にルーティングの生成を行うことができるようになります。

<?php
namespace Tests/ShowSampleView;

use App\Providers\RouteServiceProvider;
use Illuminate\Routing\Router;
use SampleController;

class ShowSampleViewTest extends TestCase
{
    public function test_sampleページを表示する()
    {
        // given
        $sampleId = 100

+       // sessionに格納する値を定義
+       session(['sampleId' => $sampleId]);
+
+       // 動的ルーティングに対応するため、ルート定義を読み込みさせる
+       (new RouteServiceProvider(app()))->boot();

        // when
        $response = $this->actingAs($this->makeUser())->get("/sample/$sampleId");

        // then
        $response->assertStatus(200);
    }
}

おわりに

チーム全体で通常業務と並行して既存機能のリファクタリングを進めているため、今後もリグレッションテストを行う機会が増えていきます。 テストピラミッドの比率を壊さない範囲で積極的にテストを作成し、生産性を上げていきたいと思います。

ホワイトプラスでは、ビジョンバリュー、そしてホワイトプラスの開発文化に共感していただけるエンジニアを募集しています!

ネットクリーニングの「リネット」など「生活領域×テクノロジー」で事業を展開している会社です。どんな会社か気になった方はオウンドメディア「ホワプラSTYLE」をぜひご覧ください。

オンラインでカジュアル面談もできますので、今回の記事の内容に興味を持っていただけたら、ぜひお気軽にお問い合わせください。

open.talentio.com