Hello, World!

難しいことは書けません

はじめてテストを書きました

初めてテストを書いたんですよ、簡単なのですが
なので忘れないようにメモしておきます

テスト生成と実行コマンド

環境はLaravelで、PHPUnitで今回はログイン画面のテストを書いていこうと思います
まずテストの生成

php artisan make:test LoginTest

tests/Feature/LoginTest.php にファイルが作られます

テストを実行するには、ターミナルでphpunitコマンドを実行すれば大丈夫です

phpunit

テストファイルの命名規則

テストを作る際にルールがあります
・テストファイルはファイル名を、hogeTest.phpとすることでテスト対象となる
・メソッドは、testHoge()とするか、@testコメントをつけておくとtestと認識される

上記をふまえてテストを書いていきます

テストコード

まず前のテストデータが次に実行されるテストへ影響をあたえないように、各テストが終了するごとにデータベースをリセットさせるためトランザクションを使います

use DatabaseTransactions;

次にユーザーデータを作ります
テストを実行する前に行いたいのでsetUp()に書いていきます

<?php

    /**
    * @var \App\Models\User;
    */
    public $user;
    /**
    * Setup the test environment.
    */
    protected function setUp()
    {
        parent::setUp();
        $this->user = factory(User::class)->state('active')->create();
    }

UserFactory.phpのコードは省略します

あと factory()って何?ってなったかと思います
factory()とは

テスト実行前に、何件かのレコードをデータベースに挿入する必要があります。こうしたテストデータを作る時に、手動でそれぞれのカラムへ値を指定する代わりに、Laravelではモデルファクトリを使用します。
引用元:https://readouble.com/laravel/5.5/ja/database-testing.html

なるほど

準備は終わったのでテストコードを書いていきます

<?php
    /**
    * @test
    */
    public function ログインしていない状態ユーザーのみログイン画面が表示される()
    {
        //ログインしてない状態で/loginにアクセスした場合
        $response = $this->get('/login');
        $response->assertStatus(200);

        //ログインしている状態で/loginにアクセスした場合
        $response = $this->actingAs($this->user)->get('/login');
        $response->assertStatus(302);
    }

actingAs()を利用することで作ったユーザデータを認証済み状態にすることができ
ログインしてない状態で/loginにアクセスした場合、クライアントのレスポンスが200
ログインしている状態で/loginにアクセスした場合、クライアントのレスポンスが302
ならOKというテストを作りました

ログインしている状態で/loginにアクセスした場合クライアントから帰ってくるレスポンスが何番なのかわからない場合は、普通に調べてもいいけどChromeの検証で
Network → Preservelogをチェック → /loginにアクセス → 下の項目のloginをクリック → Status Codeを確認
すればOK
f:id:eeko-amaryllis:20190613095441p:plain:w600

実行結果
f:id:eeko-amaryllis:20190612182905p:plain:w600
緑になったので大丈夫

以下全体コード

<?php

namespace Tests\Feature;

use Tests\TestCase;
use App\Models\User;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class LoginTest extends TestCase
{
    use DatabaseTransactions;

    /**
    * @var \App\Models\User;
    */
    public $user;
    /**
    * Setup the test environment.
    */
    protected function setUp()
    {
        parent::setUp();
        $this->user = factory(User::class)->state('active')->create();
    }

    /**
    * @test
    */
    public function ログインしていない状態ユーザーのみログイン画面が表示される()
    {
        $response = $this->get('/login');
        $response->assertStatus(200);

        $response = $this->actingAs($this->user)->get('/login');
        $response->assertStatus(302);
    }
}