Laravel テストコードを書いてみよう

# 目的

- Laravelのフューチャーテストコードの書き方をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.8 | Homwbrewを用いて導入 |
| Laravel バージョン | 8.6.0 | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 前提条件

- 実施環境と同じ、もしくは準ずる環境が構築されていること。

# 前提情報

- Laravelのテストはフューチャーテストとユニットテストが存在しこの記事ではフューチャーテストの方法を紹介する。
- MacのローカルにLaravelアプリを作成し`$ php artisan serve`コマンドを用いてローカルサーバを起動して確認するものする。
- 「特定の文字がビューに表示されているか」と「Httpステータスコードの200が帰ってくるか」を確認する。

# 概要

1. アプリの作成
1. ルート情報の記載
1. コントローラーファイルの作成と記載
1. ビューファイルの作成と記載
1. テストコードの作成と記載
1. テストの実行

# 詳細

1. アプリの作成
    1. 任意のディレクトリで下記コマンドを実行してLaravelアプリを作成する。

        ```terminal
        $ laravel new feature_test
        ```
    1. 先のコマンドで作成された`feature_test`ディレクトリに移動する。
1. ルート情報の記載
    1. feature_testディレクトリで下記コマンドを実行してルーティングファイルを開く。

        ```terminal
        $ vi routes/web.php
        ```
    1. 下記のルーティング情報を追記する。

        ```feature_test/routes/web.php
        Route::get('/hello', 'App\Http\Controllers\HelloController@index');
        ```
    1. 追記後のルーティングファイルの内容を下記に記載する。

        ```feature_test/routes.web.php
        <?php
        
        use Illuminate\Support\Facades\Route;
        
        /*
        |--------------------------------------------------------------------------
        | Web Routes
        |--------------------------------------------------------------------------
        |
        | Here is where you can register web routes for your application. These
        | routes are loaded by the RouteServiceProvider within a group which
        | contains the "web" middleware group. Now create something great!
        |
        */
        
        Route::get('/', function () {
            return view('welcome');
        });
        // 下記を追記する。
        Route::get('/hello', 'App\Http\Controllers\HelloController@index');
        ```
1. コントローラーファイルの作成と記載
    1. feature_testディレクトリで下記コマンドを実行してコントローラファイルを作成する。

        ```terminal
        $ php artisan make:controller HelloController
        ```
    1. feature_testディレクトリで下記コマンドを実行して先に作成したコントローラファイルを開く。

        ```terminal
        $ vi app/Http/Controllers/HelloController.php
        ```
    1. 開いたコントローラファイルに下記のアクションを追記する。

        ```feature_test/app/Http/Controllers/HelloController.php
            public function index()
        {
            return view('hello/index');
        }
        ```
    1. 追記後のコントローラファイルの内容を下記に記載する。

        ```feature_test/test/Http/Controllers/HelloController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use Illuminate\Http\Request;
        
        class HelloController extends Controller
        {
            public function index()
            {
                return view('hello/index');
            }
        }
        ```
1. ビューファイルの作成と記載
    1. feature_testディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。

        ```terminal
        $ mkdir resources/views/hello
        ```
    1. feature_testディレクトリで下記コマンドを実行してビューファイルを作成する。

        ```terminal
        $ vi resources/views/hello/index.blade.php
        ```
    1. 開いたファイルに下記の内容を記載する。

        ```resources/views/hello/index.blade.php
        <h1>hello japan!</h1>
        ```
    1. feature_testディレクトリで下記コマンドを実行してローカルサーバを起動する。

        ```terminal
        $ php artisan serve
        ```
    1.  下記にアクセスして「Hello japan!」の文字が表示されていることを確認する。
        - [http://127.0.0.1:8000/hello](http://127.0.0.1:8000/hello)
1. テストコードの作成と記載
    1. feature_testディレクトリで下記コマンドを実行してテストコード用のファイルを作成する。

        ```terminal
        $ php artisan make:test HelloIndexPageTest
        ```
    1. feature_testディレクトリで下記コマンドを実行して先に作成したテストコードファイルを開く。

        ```terminal
        $ vi tests/Feature/HelloIndexPageTest.php
        ```
    1. 開いたテストコードファイルを下記の様に追記・修正をする。

        ```feature_test/tests/Feature/HelloIndexPageTest.php
        <?php
        
        namespace Tests\Feature;
        
        use Illuminate\Foundation\Testing\RefreshDatabase;
        use Illuminate\Foundation\Testing\WithFaker;
        use Tests\TestCase;
        
        class HelloIndexPageTest extends TestCase
        {
            /**
             * A basic feature test example.
             *
             * @return void
             */
            public function testStatusCode()
            {
                $response = $this->get('/hello');
        
                $response->assertStatus(200);
            }
        
            public function testBody()
            {
                $response = $this->get('/hello');
        
                $response->assertSeeText('hello japan!');
            }
        }
        ```
1. テストの実行
    1. feature_testディレクトリで下記コマンドを実行してテストを実行する。

        ```terminal
        $ vendor/bin/phpunit tests/Feature/HelloIndexPageTest.php
        ```
    1. 下記の様に出力されればテストは完了であり、当該ページはテスト条件を満たしている。

        ```terminal
        OK (2 tests, 2 assertions)
        ```

# 参考文献

- [Laravel 8.x テスト: テストの準備](https://readouble.com/laravel/8.x/ja/testing.html)