はじめてテストを書きました
初めてテストを書いたんですよ、簡単なのですが
なので忘れないようにメモしておきます
テスト生成と実行コマンド
環境は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
実行結果
緑になったので大丈夫
以下全体コード
<?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); } }