LoginSignup
9
13

More than 3 years have passed since last update.

LaravelでPHPUnit入門

Last updated at Posted at 2019-12-20

本記事は、Laravelで認証用APIのテストを書くの記事を、APIではなくWeb画面用に書き換えたものです。
また、PHP Unitを実行しやすくするために、Laravel環境を利用+認証画面のセットアップも手順に含んでいます。

テストコードを書く理由

  1. テストのコストを下げるため
    ※ ユニットテストはコードを網羅的に動かすため、一度書いてしえばリグレッションテストのコストを下げられる
  2. テストをしやすいコードにすることで疎結合なプログラムを意識してかけるようになるため
    ※ つまり 「メンテナンスしやすいコード」 が書けるようになる
  3. テストコード自体がプログラマーに向けての仕様書になるから ※ 設計書(ドキュメント)として仕様を管理するのか、テストコードとして仕様を管理するかの違い
    ※ ドキュメントを書かないなら、テストケースは書きたい
  4. テストコードを考えることによって、要件への理解が深まるから
  5. プログラムの変更/追加に伴うデグレを検知しやすくなるから

こちらにアップされている資料が神がかり的に分かりやすいので、一読を推奨

事前準備

ライブラリ依存管理ツールの用意

  • コマンドラインからcomposerとnpmコマンドが実行できるようにしておく

Laravelプロジェクトを作成

composer create-project "laravel/laravel=6.*" test-sample
cd test-sample

必要なnpmライブラリのインストール+ビルド

npm install
npm run dev

テストで利用する認証系のルーティング+ビューを用意

composer require laravel/ui --dev
php artisan ui vue --auth

ref: https://readouble.com/laravel/6.x/ja/authentication.html

Laravelの機能を使い、ビルドインウェブサーバを立ち上げる

cd test-sample
php artisan serve

動作確認

※ DBのセットアップをしていないので、画面からユーザ登録やログインはできない(設定すればできるので、興味ある人は調べてみてください)

テスト作成

Laravelインストール時に最初から用意されている「UserFactory」を利用し、上記で作成したユーザ認証機能のテストを作成する

テストケースの作成

php artisan make:test AuthenticationTest

テストケースの修正

tests/Feature/AuthenticationTest.php
   <?php

   namespace Tests\Feature;

   use App\User;

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

   class AuthenticationTest extends TestCase
   {
       use RefreshDatabase;

       protected $user;
       protected $password = 'i-love-laravel';

       public function setUp(): void
       {
           parent::setUp();

           // テストユーザ作成
           $this->user = factory(User::class)->create([
               'password' => bcrypt($this->password)
           ]);
       }

       /**
        * ログイン認証テスト
        */
       public function testLogin(): void
       {
           // 作成したテストユーザのemailとpasswordで認証リクエスト
           $response = $this->post(route('login'), [
               'email' => $this->user->email,
               'password' => $this->password,
           ]);

           // リクエスト送信後、正しいくリダイレクト処理されていることを確認
           $response->assertRedirect('/home');

           // 指定したユーザーが認証されていることを確認
           $this->assertAuthenticatedAs($this->user);
       }

       /**
        * ログアウトテスト
        */
       public function testLogout(): void
       {
           // actingAsヘルパで現在認証済みのユーザーを指定する
           $response = $this->actingAs($this->user);

           // ログアウトページへリクエストを送信
           $response->post(route('logout'));

           // ユーザーが認証されていないことを確認
           $this->assertGuest();
       }
   }

テストの実行

  1. プロジェクトルートで、以下コマンドを実行 bash ./vendor/bin/phpunit
  2. 以下の様に結果が表示されていればOK phpunit.png

解説

  • Laravelインストール時にComposerが最初に用意してくれているPHP Unitを利用
  • phpunit.xmlの初期設定で、インメモリのSQLiteを利用する設定を利用している(そのため、DBをセットアップしていなくてもfactoryでデータの作成+テストが可能になっている)
  • assertAuthenticatedAsassertGuestなど、Laravel側が用意してくれているアサーションを利用することで、セッション情報などをチェックせずとも手軽にテストが可能となっている

参考サイト

9
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
13