システム開発

Laravel+PHPUnitで認証付きAPIのテストを行う

PHPの人気のフレームワークLaravelではWebサイトの管理画面を開発することができます。

開発の手順に関しては以下の記事にて具体的に紹介をしていきました。

さらに開発後のデプロイの手順は以下で解説していきました。

この記事ではPHPUnitでLaravelのAPIテストをする方法について解説しています。

  • Laravelを使って構築をしたい方
  • Webサイト構築の具体的な手法が知りたい方

におすすめの記事となっています。これを読めばいよいよLaravelで開発した管理画面をリリースする準備ができますよ。

最低限やりたいことを決める

まず作業の前に、最低限やりたいことを決めておきます。
今回はLaravelの認証後のAPIのテストを書けるようにしたいので、以下の要件にしました。

● CookieのAPI認証の部分はテストせず、認証済として扱う
● 認証後の管理者ユーザーの一覧取得のAPIをテストする

Cookie認証のAPIは以前の記事で実装したものを利用します。

CookieによるAPI経由のユーザー認証機能を作る【Laravel6とNuxt.jsで作る管理画面】

テストを書くための前準備

LaravelではデフォルトでPHPUnitが使えるようになっていますが、
実際にテスト書いていくためには、いくつか準備が必要なので、そちらを進めていきます。

テスト用のDBを作成

開発環境のデータに影響を与えないようにするため、まずは、以下コマンドを実行してテスト用のDBを作成しましょう。

mysql> create database laravel_test;

PHPUnitではデフォルトでsqliteを使う設定になっていますが、本番DBと環境を揃えるため、テストでもMySQLを使うようにします。

テスト用の.envファイルを作成

次に下記コマンドでテスト用の.envファイルを作成します。

cp .env.example .env.testing

ファイルが作成できたら、以下の内容で.env.testingを修正します。

APP_NAME=Laravel
//testingに変更
APP_ENV=testing
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
//追加したデータベース名に変更
DB_DATABASE=laravel_test
DB_USERNAME=root
DB_PASSWORD=

修正が完了したら、次に以下コマンドでテスト用のAPP_KEYを作成します。

php artisan key:generate --env=testing

以下のような値が.env.testingに作成されればOKです。

APP_KEY=base64:XXXXXXX

PHPUnitの設定をMySQLを使うように変更

次に以下の内容でphpunit.xmlを変更します。

<php>
    <server name="APP_ENV" value="testing"/>
    <server name="BCRYPT_ROUNDS" value="4"/>
    <server name="CACHE_DRIVER" value="array"/>
    //ここを変更
    <server name="DB_CONNECTION" value="mysql"/>
    <server name="MAIL_DRIVER" value="array"/>
    <server name="QUEUE_CONNECTION" value="sync"/>
    <server name="SESSION_DRIVER" value="array"/>
</php>

PHPUnitは.env.{APP_ENVの値}の.envファイルを自動で読み込む作りになっています。
そのため、DB_DATABASE.env.testingの値が設定されるので、phpunit.xml側からは削除しています。

テスト用のDBにマイグレーションを実行

次に以下コマンドを実行します。

php artisan migrate --env=testing

以下のようにマイグレーションが反映されればOKです。

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.05 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
Migrating: 2020_05_09_010620_create_admin_users_table
Migrated:  2020_05_09_010620_create_admin_users_table (0.05 seconds)

テストコードの作成

事前準備が完了したので、ここからは実際にテストを書いていきます。

FeatureとUnitの使い分けについて

Laravelでは、testsディレクトリの下にFeatureディレクトリとUnitディレクトリがあり、
この中にテストコードを配置します。

FeatureにはControllerMiddlewareといったHTTPリクエストによる機能テスト、Unitにはそれ以外の単体テストについて書きます。

それ以外のディレクトリ構成にすることも出来ますが、基本の構成を踏襲した方が可読性が上がって良いでしょう。

今回はAPIのテストなので、Featureテストを書いていきます。

Featureテストの雛形ファイルを作成

まず以下のコマンドでFeatureテストのファイルを作成します。

php artisan make:test Api/AdminUserTest

次のような内容のtests/Feature/Api/AdminUserTest.phpが作られていればOKです。

<?php

namespace Tests\Feature\Api;

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

class AdminUserTest extends TestCase
{
    /**
     * A basic feature test example.
     *
     * @return void
     */    public function testExample()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

スクリプトファイルでテストを実行

Laravelは設定ファイルをキャッシュして高速化しているため、DBを扱うテストコードを実行する前には php artisan config:clear を実行することが公式ドキュメントで勧められています。

これをしておかないと、キャッシュで本番DBがリセットされてしまうという問題も起こりかねません。
そのため、以下の内容のtest.shというスクリプトファイルを作成します。

#!/bin/bash

php artisan config:clear
./vendor/bin/phpunit tests/Feature/Api

ファイルが出来たら下記コマンドでテストを実行します。

chmod +x test.sh //実行権限を付与(最初の1回だけでOK)
./test.sh

以下のような画面が出ればOKです。

管理者ユーザー用のFactoryを追加

ログインのテストをするために管理者ユーザーのアカウントを作成します。
こういったテスト用データの用意には、Factoryを使いましょう。

以下コマンドで管理者ユーザー用のFactoryを作成します。

php artisan make:factory AdminUserFactory --model=AdminUser

作成されたdatabase/factories/AdminUserFactory.phpを以下内容に編集します。

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\AdminUser;
use Faker\Generator as Faker;

$factory->define(AdminUser::class, function (Faker $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => Str::random(10),
    ];
});

これで管理者ユーザーを作ることが出来るようになりました。

一覧取得(Index)のテストケースを追加

次にtests/Feature/Api/AdminUserTest.phpを以下の内容に編集します。

<?php

namespace Tests\Feature\Api;

use App\AdminUser;

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

class AdminUserTest extends TestCase
{
    // テストデータのリセット
    use RefreshDatabase;
    // ミドルウェアの無効化
    use WithoutMiddleware;

    private $adminUser;

    public function testIndex()
    {
        // テストデータをFactoryで作成
        $adminUser1 = factory(AdminUser::class)->create();
        $adminUser2 = factory(AdminUser::class)->create();

        $response = $this->json('GET', '/api/admin_users');
        $response
            ->assertStatus(200)
            ->assertJson(
                [
                    [
                        'id' => $adminUser1->id,
                        'name' => $adminUser1->name,
                        'email' => $adminUser1->email,
                    ],
                    [
                        'id' => $adminUser2->id,
                        'name' => $adminUser2->name,
                        'email' => $adminUser2->email,
                    ]
                ]
            );
    }
}

Laravelでは便利な共通処理がtraitとして提供されており、上記のコードではRefreshDatabaseWithoutMiddlewareを利用しています。

今回使っているAPIではAjax以外の通信を403エラーにするMiddlewareを指定していますが、テストでは不要なため除外するようにしています。

動作を確認する

編集できたら、テスト実行後に以下のコマンドを実行します。

php artisan tinker --env=testing

テストが成功し、以下のようにデータがリセットされていればOKです。

おわりに

今回はPHPUnitでLaravelの認証付きAPIのテストを行いました。
本記事では一覧取得のテストケースのみ紹介しましたが、同様にCRUDのテストケースを書けますね。

本日紹介したようなものを外注してみるのはいかがでしょうか。 dehaソリューションズではオフショア開発によって低コストで迅速な開発をサポートしています。

Laravelに関して詳しくお話を聞きたい方、開発相談や無料お見積りをしたい方はこちらからご気軽にお問い合わせください。

▼ dehaソリューションへの簡単見積もりの依頼はこちら

Mai Tran

Recent Posts

【オフショア開発の価格高騰】各国の最新コスト動向と今後の展望

近年、IT開発の現場では「オフショア開発のコストが上昇している」という声が多く聞かれるようになりました。 かつてオフショア開発は「低コストで開発できる手段」として広く活用されてきましたが、現在ではその前提が変化しつつあります。 為替環境の変化、各国の人件費上昇、グローバル市場の競争激化などにより、オフショア開発の価格構造は大きく変わり始めています。 一方で、日本国内ではエンジニア不足が深刻化しており、企業は開発リソースを確保するために海外人材の活用を続けざるを得ない状況にあります。 つまり、オフショア開発は「安いから使う」ものから、「必要だから使う」ものへと役割が変化しているのです。 この記事では、オフショア開発の最新動向をもとに、各国のコスト動向、企業の発注傾向、案件内容の変化、契約形態の変化、そして今後の展望について詳しく解説します。 オフショア開発を検討している方 開発効率を上げたい方 社内のIT人材が不足している方 これらに当てはまる方におすすめの記事となっています。これを読めばオフショア開発のコスト面について最新の情報がわかるのはもちろん、今後の展望もわかりますよ。 (more…)

3 days ago

【不動産DX】不動産業界に最適なオークション形式とシステム選定のポイント

不動産業界は、これまで「対面営業」「紙契約」「属人的な価格交渉」といったアナログな手法が中心でした。 しかし近年、デジタル技術の進化と顧客行動の変化により、業界全体でDX(デジタルトランスフォーメーション)が加速しています。 この記事ではそんな不動産業界のDX化において、注目されている「オークション形式」についてどんな特徴があるのかや、システムを選定する際のポイントについて見ていきたいと思います。 DX化をすすめたい企業の方 不動産業界の方 社内のIT人材が不足している方 これらに当てはまる方におすすめの記事となっています。これを読めば不動産業界におけるオークション形式のポイントや注意点が丸わかりですよ。 不動産DXが求められる背景とオークションモデルの可能性 国土交通省の電子契約解禁やオンライン重要事項説明の普及により、売買・賃貸のプロセスは大きく変わりました。さらに、ポータルサイト依存型の集客モデルから脱却し、より収益性の高い販売手法を模索する動きが強まっています。 そこで注目されているのが「オークション形式」です。 従来の不動産取引は「売主が価格を提示し、買主が交渉する」という相対交渉モデルが一般的でした。 しかし、オークションモデルでは市場原理をより明確に反映させることが可能です。需要が集中するエリアや希少物件では価格が自然に上昇し、売主にとっては最大利益を得られる可能性があります。 また、オークション形式は透明性の向上にも寄与します。 価格決定のプロセスが明確になり、「なぜこの価格になったのか」という説明責任を果たしやすくなります。 これはコンプライアンス強化が求められる現代において大きな利点です。…

1 week ago

2026年のAIエージェント トレンド【Googleの調査】

2026年、AI活用は新たなフェーズへと突入します。これまでの「生成AIを使う」段階から、「AIエージェントが業務を遂行する」段階へと進化しています。 Google Cloudが発表したレポート『AI agent trends 2026』では、企業活動におけるAIの中心がAgentic AI(エージェント型AI)へ移行すると指摘しています。 AIエージェントとは、単に質問に答える存在ではありません。目標を理解し、計画を立て、複数のシステムを横断しながら実行まで行う「行動するAI」です。 この記事では、Googleの調査をもとに、2026年を形づくる5つのAIエージェントトレンドを詳しく解説します。 AIエージェントは何か知りたい方 業務効率を上げたい方 これらに当てはまる方におすすめの数となっています。これを読めばAIエージェントのトレンドがわかるのはもちろん、利用のポイントもわかりますよ。 すべての従業員にAIエージェントがつく時代(Agents for Every…

2 weeks ago

3層品質保証で実現する安心のITアウトソーシング体制

グローバル市場におけるITアウトソーシングでは、品質保証は単なる最終テスト工程ではありません。 品質は「工程の最後で確認するもの」ではなく、「開発の初期段階から設計され、統制されるべき経営基盤」です。  従来型のQAがリリース直前のテストに依存するのに対し、DEHA SOLUTIONSではTQA・PQA・SQAの3層構造により、技術・プロセス・サービス全体を横断的に管理しています。 これは単なる品質向上施策ではなく、リスクコントロールと持続的成長を実現するためのガバナンス設計です。  (more…)

2 weeks ago

システム開発におけるPMの役割を徹底解説|失敗や納期遅延を防ぐポイント

システム開発プロジェクトにおいて、成功と失敗を分ける最大の要因は「PM(プロジェクトマネージャー)」の力量だと言っても過言ではありません。 技術力の高いエンジニアが揃っていても、要件が曖昧だったり、スケジュールが破綻したり、関係者間の認識がずれたりすれば、プロジェクトは簡単に炎上します。 特に近年は、アジャイル開発やハイブリッド型開発など手法の多様化、オフショア開発の増加、DX推進によるスピード要求の高まりなど、PMに求められる能力はますます高度化しています。 この記事では、そんなシステム開発におけるPMの役割を体系的に整理し、失敗や納期遅延を防ぐための実践的なポイントを徹底解説します。 システム開発をしたい方 システム開発を効率よく行いたい方 社内にIT人材が不足している方 これらに当てはまる方におすすめの記事となっています。これを読めばシステム開発におけるPMの役割がわかるのはもちろん、失敗しないためのポイントも丸わかりですよ。 PMとは何か?システム開発における本質的な役割 システム開発におけるPM(プロジェクトマネージャー)は、単なる進捗管理者ではありません。 PMの本質的な役割は、「プロジェクトを成功に導くための総責任者」であることです。 プロジェクトには必ず「QCD(品質・コスト・納期)」という制約があります。さらに、近年では「スコープ(範囲)」や「リスク」、「ステークホルダー満足度」も重要な要素です。 PMはこれらすべてを統合的に管理し、バランスを取りながら意思決定を行います。PMの主な責任領域は以下の通りです。 目的・ゴールの明確化 要件定義の統括…

2 weeks ago

アジャイル・ウォーターフォールハイブリッド開発の手法とは?オフショア開発に効果?

アジャイル・ウォーターフォールハイブリッド開発は、ウォーターフォール開発の計画性・文書化・統制力と、アジャイル開発の柔軟性・反復改善・顧客密着型の進め方を組み合わせる手法です。 この記事では、そんなアジャイル・ウォーターフォールハイブリッド開発の基本概念から具体的な実践方法、さらにオフショア開発における効果や導入時の注意点まで、体系的に解説していきます。 アジャイル・ウォーターフォールハイブリッド開発が気になる方 オフショア開発に興味がある方 開発効率を上げたい方 これらに当てはまる方におすすめの記事となっています。これを読めばアジャイル・ウォーターフォールハイブリッド開発について特徴わかるだけでなく、導入のポイントも丸わかりですよ。 なぜ今「ハイブリッド開発」が注目されているのか 近年、ITシステム開発の現場では「スピード」と「品質」の両立が強く求められています。市場環境は急速に変化し、顧客ニーズも多様化しています。 その一方で、セキュリティ要件や法規制への対応、社内ガバナンスの強化など、開発プロジェクトに求められる統制レベルは年々高まっています。 このような背景の中で、従来型のウォーターフォール開発だけでは変化への対応が難しく、またアジャイル開発だけでは大規模案件や厳格な要件管理が必要なプロジェクトに対応しきれないケースも増えています。 そこで注目されているのが、「アジャイル・ウォーターフォールハイブリッド開発」です。 これは、ウォーターフォール開発の計画性・文書化・統制力と、アジャイル開発の柔軟性・反復改善・顧客密着型の進め方を組み合わせる手法です。 単なる折衷案ではなく、プロジェクトの特性やフェーズに応じて最適な開発アプローチを選択・融合する実践的な方法論といえます。 特にオフショア開発においては、言語・文化・時差・契約形態といった要素が絡み合うため、開発手法の選択はプロジェクトの成否を左右します。 日本国内で要件定義を固めた上で海外チームに実装を委託するケース、あるいは海外側に一部設計まで任せるケースなど、形態はさまざまです。…

3 weeks ago