システム開発

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

2034年に向け急拡大するベトナム企業AI市場:最新の市場規模・シェアと未来予測

生成AIの急速な普及を背景に、世界各国で企業のAI活用が加速しています。 その中でもベトナムは、政府による積極的なAI政策やデジタル化の推進、海外企業による投資拡大を追い風に、東南アジア有数の成長市場として注目を集めています。 この記事では、最新の市場規模や市場シェア、成長を支える要因、主要企業の動向をもとに、2034年に向けたベトナム企業AI市場の将来性と日本企業に広がるビジネスチャンスについて詳しく解説します。 AI市場に興味がある方 ベトナムのIT市場に興味がある方 社内のIT人材が不足している方 これらに当てはまる方におすすめの記事となっています。これを読めばベトナム企業のAI市場規模がわかるのはもちろん将来の予測もわかりますよ。 (more…)

2 weeks ago

アジャイル・ウォーターフォール・ハイブリッド:企業価値を最大化する開発戦略の選び方

近年、システム開発で代表的な手法として長年利用されてきたのが「ウォーターフォール開発」と「アジャイル開発」を組み合わせた「ハイブリッド開発」が新たな選択肢として注目されています。 この記事ではそんな「ハイブリッド開発」について、どう言った特徴があるのかや、企業価値を最大化するためにはどのような視点で開発戦略を選択すべきかについて見ていきます。 アジャイル開発に興味がある方 DX化を進めたい方 社内のIT人材が不足している方 これらに当てはまる方におすすめの記事となっています。これを読めば「ウォーターフォール開発」と「アジャイル開発」のそれぞれの特徴と、それを掛け合わせた「ハイブリッド開発」の特徴が丸わかりですよ。 アジャイル開発の特徴とメリット アジャイル開発とは、「素早い」「俊敏な」という意味を持つ言葉の通り、変化に柔軟に対応しながらシステムを開発する手法です。 従来のウォーターフォール開発では、要件定義、設計、開発、テスト、リリースという工程を順番に進め、最後に完成したシステムを利用者へ提供します。 一方、アジャイル開発では短期間の開発サイクル(スプリント)を繰り返します。一般的には1〜4週間程度の期間で、優先度の高い機能を開発し、動作する状態で提供します。 その後、利用者から意見をもらい、次の開発に反映します。 この流れを繰り返すことで、利用者の本当のニーズに近いシステムを作りやすくなります。 例えばECサイトの決済機能を開発する場合、最初からすべての決済方法を実装するのではなく、まずクレジットカード決済だけを提供し、その後電子マネーやQR決済などを追加していくことが可能です。 この方法では、早い段階でサービスを市場へ投入でき、利用状況を確認しながら改善できます。 アジャイル開発の主なメリットは以下の通りです。…

2 weeks ago

7Rフレームワークとは?生成AI活用で加速するレガシーシステムマイグレーション

企業の基幹システムの多くは、10年、20年、あるいは30年以上にわたって運用され続けています。 しかし近年、こうしたレガシーシステムを取り巻く環境は大きく変化しています。 近年、注目されているのが「7Rフレームワーク」です。 7Rフレームワークは既存システムをクラウド環境へ移行する際に採用される代表的な意思決定モデルであり、システムごとに最適な移行戦略を選択するための考え方です。 この記事ではそんな7Rフレームワークについて、特徴を紹介していきます。 7Rフレームワークに興味がある方 生成AIを活用したい方 社内のIT人材が不足している方 これらに当てはまる方におすすめの記事となっています。これを読めば7Rフレームワークの特徴がわかるのはもちろん、AI時代での7Rフレームワークについて丸わかりですよ。 (more…)

3 weeks ago

構造変化に直面するオフショア開発:「量」の補完から「AI Native」への転換期

オフショア開発は従来の「量」の補完から、しかし、生成AIの急速な進化によってその前提が大きく変わろうとしています。 今後は「どれだけ高い生産性を実現できるか」が重要です。 この記事ではそのようなオフショア開発のあり方の変化について見ていきます。 オフショア開発に興味がある方 社内のIT人材が不足している方 AIを使った開発に興味がある方 これらに当てはまる方におすすめの記事となっています。これを読めばオフショア開発の変化についてわかるのはもちろん、AI Nativeについても丸わかりですよ。 (more…)

3 weeks ago

生成AI時代における「2030年に79万人IT人材不足」の再定義と構造変化

近年、日本のIT業界では「2030年に最大79万人のIT人材が不足する」という予測が繰り返し語られています。 この数字は、日本社会のDX推進や企業のシステム開発を支える人材の不足を警告する象徴的な指標として広く認知されています。 しかし、2022年末以降の生成AIの急速な発展により、この予測の前提条件は大きく変化しています。 かつては人間が手作業で行っていたプログラミング、設計書作成、テストケース生成、ドキュメント作成、データ分析などの業務が、AIによって大幅に自動化され始めているためです。 その結果、「79万人不足」という予測を単純に受け入れるのではなく、「どのような人材が不足し、どのような人材の需要が減少するのか」という質的な観点から再検討する必要が生じています。 この記事では、生成AI時代におけるIT人材不足の構造変化を分析し、2030年に向けて求められる人材像について考察をしていきます。 生成AI時代が気になる方 IT業界の方 社内のIT人材が不足している方 これらに当てはまる方におすすめの記事となっています。これを読めば「2030年79万人IT人材不足」問題について、新しい見解とその対策がわかりますよ。 (more…)

1 month ago

AIレガシーマイグレーション|従来の課題をDXへ導くDEHAの解決策

長年運用されてきた基幹システムは、企業活動を支える重要な存在である一方で、技術的負債の蓄積、保守人材不足、クラウド対応の遅れ、ブラックボックス化など、さまざまな問題を引き起こしています。 従来のマイグレーションでは、既存システムの解析からコード変換、データ移行、テスト、カットオーバーまで、多くの工程を人手に依存していました。 こうした背景の中、注目を集めているのが「AIレガシーマイグレーション」です。 この記事ではAIレガシーマイグレーションについて、どんな特徴があるのかやその強みに着目をしていきたいと思います。 AIレガシーマイグレーションが気になる方 製造業の方 DXをすすめたい企業の方 これらに当てはまる方におすすめの記事となっています。これを読めばAIレガシーマイグレーションがどう言ったものかがわかるのはもちろん、DEHAのAIレガシーマイグレーションについてもわかりますよ。 (more…)

1 month ago