Laravel

テストとデプロイ

正常系だけでなく失敗も自動で確認し、安全に公開する準備をしましょう。

01

テストの種類を知る

Unitテストは小さなクラスやメソッドを、Featureテストは複数の部品が協力する機能を確認します。Webアプリでは、ルート、認証、DB、レスポンスまでを確認するFeatureテストが大きな安心につながります。

作成と実行COMMAND
php artisan make:test PostTest
php artisan make:test PriceCalculatorTest --unit
php artisan test
小さく失敗させる テストが失敗したら、期待値、入力、ルート、DB状態を一つずつ確認します。テストを通すためだけに実装を弱めないことが大切です。
02

HTTPテストを書く

ブラウザー操作を自動化しなくても、HTTPリクエストを送ってステータス、画面の文字、リダイレクトを検証できます。

Feature TestPHP
test('投稿一覧を表示できる', function () {
    $post = Post::factory()->create([
        'title' => '確認用の投稿',
    ]);

    $this->get(route('posts.index'))
        ->assertOk()
        ->assertSee('確認用の投稿');
});
未認証の確認PHP
test('未ログインでは作成画面へ進めない', function () {
    $this->get(route('posts.create'))
        ->assertRedirect('/login');
});
03

DBの状態も検証する

RefreshDatabaseでテストごとにDBを初期化し、画面だけでなく行が作成されたか、作成されなかったかを確認します。

登録と検証PHP
uses(RefreshDatabase::class);

test('ログイン利用者は投稿を作成できる', function () {
    $user = User::factory()->create();

    $this->actingAs($user)->post(route('posts.store'), [
        'title' => '新しい投稿',
        'body' => '本文です',
    ]);

    $this->assertDatabaseHas('posts', [
        'user_id' => $user->id,
        'title' => '新しい投稿',
    ]);
});

入力エラーならassertSessionHasErrors、権限不足なら403、APIならJSON構造とステータスコードを検証します。

04

CIで毎回テストする

GitHub ActionsなどのCIで、Pull Requestごとに依存関係のインストール、静的解析、テストを実行します。人が覚えておく手順を自動化し、未確認の変更を取り込まない仕組みを作ります。

実行する手順の例COMMAND
composer install --no-interaction --prefer-dist
cp .env.example .env
php artisan key:generate
php artisan migrate --force
php artisan test
秘密情報を登録しない CIの環境変数へ登録したキーをログへ表示しません。リポジトリへ.envをコミットせず、必要な値はCIや本番環境の安全な設定へ登録します。
05

公開前に確認する

Webサーバーの公開先はLaravelプロジェクトのpublicディレクトリーに限定します。デバッグ表示を無効にし、HTTPS、DB、ストレージ、キュー、スケジューラー、バックアップを確認します。

本番で確認するコマンド例COMMAND
php artisan about
php artisan migrate --force
php artisan optimize
php artisan queue:restart
公開チェック
  • APP_ENV=productionAPP_DEBUG=false
  • HTTPSと安全なCookie設定
  • 書き込み可能なstorageとキャッシュ
  • ログ監視、メール、キュー、定期実行
  • DBバックアップと復旧手順
PRACTICE

練習問題

総合課題の読書メモアプリについて、一覧表示、未認証の作成拒否、空タイトルの入力エラー、他人のメモの更新拒否をテストしてください。

完成条件
  • テスト用DBへ本番データが入らない
  • 4つの異なる失敗・成功条件を自動で検証する
  • 全テストをphp artisan testで実行できる
  • 本番用の秘密情報をテストコードへ直書きしない