B3S
menu close

Laravel

【Laravel】テストコードを書いてみた(初級編)


きーぼう

公開日:2023/02/27



こんにちは、きーぼうです。
開発で追加実装していた際にデグレが発生したり、デバッグの工数を削減したいと思うことがでてきたので
テストコードについて調べてみました。

目次

まず、テストコードとは

実装したコードに対して、テスト実行を行い動作を確認すること

テストコードを書くメリット

  1. バグを発見できる
  2. テストを意識した実装をするようになりコードが綺麗になる
  3. 仕様把握に使える

テストコードを書くデメリット

  1. 開発工数が増える
  2. 初学者にはハードルが高い(個人的見解)

Laravelでテストコードを書く前提知識

Laravelでは、PHPUnitをサポート

  • PHPUnit
    • PHPで記述可能なユニットテストツール
      • 使い方
        • テストクラスを作成
        • テストクラス内にテストメソッドを記述

FeatureテストとUnitテスト

テストは、2種類あります。

  1. リクエスト単位でテストを行うFeatureテスト(フィーチャーテスト)
  2. メソッド単位でテストを行うUnitテスト(ユニットテスト)

実装方法にもよりますが、2つのテストの違いは以下になります。

Featureテスト(結合テスト)

  • リクエスト単位のテスト
  • 大きな単位のため、テスト実行に時間がかかる
  • Laravelアプリケーションの立ち上げが必要

Unitテスト(単体テスト)

  • メソッド単位のテスト
  • 小さな単位のため、テスト実行に時間がかからない。
  • PHPが動く環境で動作可能

テストコードを実際に書く手順

  1. テストコードを作成
    • 設計フェーズとしてあるべき姿を作成する(クラス名の選定等)
    • テストケースを実行して失敗することを確認
  2. 最短でテストが成功するコードを実装する
    • テストケースを実行して成功することを確認
  3. リファクタリング。実装を綺麗にしていく。

テストコードの初歩。
全ページが正しく表示されるか(エラーがでてないか)を確認してみました。

  1. プロジェクトを作成してphpunitの動作確認を行う

    プロジェクトの作成

    composer create-project --prefer-dist laravel/laravel sandbox "8.55"

    phpunitの動作確認

    ./vendor/bin/phpunit

    コマンド結果の表示

  2. テストクラスとテストメソッドの作成

    artisanコマンドでテストクラスの作成

    php artisan make:test HttpStatusTest

    以下の場所にファイルが生成されます。

    \プロジェクト名\tests\Feature\HttpStatusTest.php

    メソッドの実装

    namespace Tests\Feature;
    
    use Illuminate\Foundation\Testing\RefreshDatabase;
    use Illuminate\Foundation\Testing\WithFaker;
    use Tests\TestCase;
    
    class HttpStatusTest extends TestCase
    {
        /**
         * A basic feature test example.
         *
         * @return void
         */
        public function test_example()
        {
            $response = $this->get('/');
    
            $response->assertStatus(200);
        }
    
        /**
         * ステータスコードのテスト
         * 200 成功
         * 300 リダイレクト
         * 400 クライアントエラー
         * 500 サーバーエラー
         *
         * @return void
         */
        public function testRequestStatus()
        {
            // とってくるリクエストメソッド
            $response = $this->get('/');
            // 結果が想定しているものかチェック
            $response->assertStatus(200);
        }
    }
  3. テスト実行

    成功した場合

    失敗した場合

まとめ

  • テストコードと聞くと、難しくとっつきにくいイメージがあったが今回のようなステータスコードのテストから入ってみるのは簡単でおすすめでした。
  • 実装をレベルアップするためにもテストの実装は必要と感じました。
  • 今後はテストコードも書きながらトータルの開発工数を減らしていけるように精進したいと思います。