システム開発

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

【製造業におけるIFS活用】統合プロセスによる生産管理自動化の方式とプロセスモデル

近年、製造業はかつてないほどの環境変化に直面しています。 需要変動の激化、多品種少量生産への対応、グローバルサプライチェーンの複雑化、人手不足、原材料価格の高騰など、経営・現場の両面で不確実性が増大しているのです。 このような状況下において、多くの企業が課題として挙げるのが生産管理の属人化・分断化です。 販売計画と生産計画が連動していない 在庫情報がリアルタイムに把握できない 工程進捗が見えず、計画変更が後手に回る システムは導入しているが、Excelや紙運用が残っている これらの問題は、部分最適なシステム導入や、部門ごとに分断された業務プロセスによって引き起こされることが多いです。 こうした背景の中で注目されているのが、IFS(Industrial and Financial Systems)を活用した統合型生産管理の自動化。 この記事では、IFSの特長を踏まえながら、製造業における生産管理自動化の方式と、それを支えるプロセスモデルについて詳しく解説していきます。 IFSとは何か:製造業に強いERPの特長 IFSとは、製造業・エンジニアリング業・アフターサービス分野を主軸として発展してきたERPパッケージです。…

2 weeks ago

IFSオフショアサービスの最適解 ベトナムから提供する高品質・高効率なアジャイルの開発体制確保

近年、製造業、エンジニアリング業、エネルギー、サービス業を中心に、ERPパッケージ「IFS」の導入・活用が急速に進んでいます。 IFSは、EAM(設備資産管理)、FSM(フィールドサービス管理)、製造、サプライチェーン、プロジェクト管理など、現場業務に強いERPとして評価されており、グローバル展開を前提とした柔軟なアーキテクチャを特徴としています。 一方で、IFS導入プロジェクトやその後の保守・改修フェーズにおいて、以下のような課題を抱える企業も少なくありません。 IFS技術者の慢性的な人材不足 国内開発コストの高騰 アジャイル開発への対応力不足 グローバル展開に伴う24時間体制の必要性 継続的な改善(Continuous Improvement)を支える体制構築の難しさ これらの課題を解決する選択肢として、近年注目を集めているのが「IFSオフショアサービス」です。 特にベトナムを拠点としたオフショア開発体制は、「高品質」「高効率」「コスト競争力」「アジャイル適性」を兼ね備えた最適解として、多くのグローバル企業から支持されているのです。 この記事では、そんなIFSオフショアサービスの価値を整理するとともに、なぜベトナムが最適なのか、どのように高品質なアジャイル体制を確保できるのかを、実務視点で詳しく解説していきたいと思います。 IFSオフショアサービスとは何か IFSオフショアサービスとは、IFSに関する設計、開発、カスタマイズ、テスト、保守・運用といった一連の業務を、海外拠点(オフショア)にて提供するサービス形態を指します。 対象となる業務領域は非常に幅広く、IFS導入時におけるアドオン開発をはじめ、IFS…

2 weeks ago

失敗しないIFS導入のため、プロジェクト成功に不可欠な「プロセス品質保証」の重要性と具体的な手法

IFS ERPは、製造業・エンジニアリング業・サービス業・エネルギー業界など、アセット集約型・プロジェクト型ビジネスに強みを持つERPとして高く評価されています。 一方で、「IFS導入は難易度が高い」「プロジェクトが長期化しやすい」といった声が聞かれるのも事実です。 しかし、その原因はIFS ERPそのものにあるわけではありません。多くのケースで問題となるのは、導入プロジェクトにおける“進め方”や“管理の仕組み”です。 特に、要件定義から設計・開発・テスト・本番移行に至るまでの各工程で、プロセスの品質をどのように担保するかが成否を大きく左右します。 そこで重要となるのが「プロセス品質保証(Process Quality Assurance)」です。 この記事では、IFS導入を成功に導くために不可欠なプロセス品質保証の考え方と、その具体的な手法について詳しく解説します。 IFS導入を検討している方 製造業・エンジニアリング業・サービス業・エネルギー業界の方 これらに当てはまる方におすすめの記事となっています。これを読めばIFS導入の具体的な方法が丸わかりですよ。 (more…)

3 weeks ago

【DX推進のカギ】IFS ERPで実現する業務プロセス自動化と生産性最大化

「DXを進めること」が当たり前となった一方で、期待した成果が出ていないと感じている企業は少なくありません。 ITツールを導入しても業務は属人化したまま、部門間の連携も不十分で、生産性向上につながらないケースが多く見られます。 本来DXとは、単なるデジタル化ではなく、業務プロセスを見直し、データを経営価値へと変える取り組みです。そのためには、全社の業務を横断的に支える基盤が欠かせません。 IFS ERPは、業務プロセス中心の設計と高い柔軟性により、業務プロセス自動化と可視化を実現し、生産性最大化を支援します。 この記事では、DX推進の課題を整理しながら、IFS ERPが果たす役割とその価値を解説していきます。 (more…)

4 weeks ago

IFS ERPとは?導入前に知っておくべき特徴・業務プロセス・メリットを徹底解説

近年、製造業・建設業・エンジニアリング企業では、複雑化する生産プロセスや高度化する顧客要求に対応するため、ERP(Enterprise Resource Planning)の導入が急速に進んでいます。 ERPとは、企業のさまざまな情報や業務を一元的に管理するための基幹システムの総称であり、経営資源を最適に活用しながら生産性を向上させ、企業競争力を高めるための中心的なツールです。 その中でも、IFS ERPは国際的に高い評価を受けており、特に製造業・設備保守業(EAM)・プロジェクト型産業に強みを持つERPとして知られています。 モジュール構成の柔軟性、ユーザーインターフェイスの使いやすさ、そしてクラウド・オンプレミスの双方に対応できる拡張性を兼ね備え、多様な企業に適応できる点が大きな特徴です。 この記事では、画像資料として提示された「IFS導入サービス」「工場調査プロセス」「GAP分析」「開発プロセス」「アジャイル開発体制」などの情報をもとに、IFS ERPの全体像、導入ステップ、具体的なメリットを総合的に解説します。 IFS導入を検討している企業の方 ERPシステムの比較・理解を進めたい方 製造業の方 これらに当てはまる方におすすめの記事になっております。これを読めばIFS導入について具体的な方法がわかりますよ。 (more…)

1 month ago

TQA(技術品質保証)とは? 開発プロセスにおけるその役割と導入メリット

ソフトウェア開発において、品質の確保はプロジェクト成功の最重要テーマの一つです。 市場のニーズは高度化し、リリースサイクルは短期化し、開発チームの構成は複雑化しています。このような状況の中で注目されているのが TQA(Technical Quality Assurance:技術品質保証) です。 TQAは従来のQAと異なり、単にテスト工程で不具合を検出するだけではなく、開発工程全体の技術的な品質を可視化し改善するという役割を担います。 この記事では、TQAとは何か、その役割から導入メリットまで詳しく解説します。 TQAが気になる方 TQAの開発プロセスが気になる方 社内のIT人材が不足している方 これらに当てはまる方におすすめの記事となっています。これを読めばTQAとは何かがわかるのはもちろん、導入メリットもわかりますよ。 (more…)

1 month ago