laravel5.5でテストのやり方
1, laravelでは最初からphpunitを拡張したテスト機能が実装されている
2, テストのやり方は、いつもphp artisanと入力しているコマンドライン上から vendor/bin/phpunit と入力すれば勝手にテストしてくれる。
1 2 3 4 5 6 7 8 |
$ vendor/bin/phpunit PHPUnit 6.5.12 by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: 368 ms, Memory: 14.00MB OK (2 tests, 2 assertions) |
3, テスト内容が実装されているのは、testsフォルダ内のFeature(機能テスト)とUnit(クラス単位)のテストの2種類がある。
tests
├─Feature
│ ExampleTest.php ←←← 機能をテスト
│
├─Unit
│ ExampleTest.php ←←← 単体機能をテスト
│ CreatesApplication.php
│ TestCase.php ←←← テストの前処理・後処理を記述(テストレコードの生成・変更・削除など。Setup(前処理)→テストメソッド→tearDown(後処理))
4, 新しくテストphpファイルを作るには、artisanで以下のようにして作る(–unitでユニットテスト。なければFeature)
1 |
$ php artisan make:test UserTest --unit |
5, とりあえず、Feature/ExampleTest.phpに追記
実行して問題がない事を確認する。一度記述すれば何回でも自動的にテストしてくれる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; class ExampleTest extends TestCase { // テスト・メソッド名は、testXXXXXとすれば自動的にテスト対象となる。 // テスト・メソッドのphpDocに @test と記述するやり方もある。 // それ以外は、メソッドを定義してもテスト時に実行されない! public function testBasicTest() { // ルートの/にアクセス $response = $this->get('/'); // HTTPステータスコードを見ている。 //$response->assertStatus(200); $response->assertStatus(302); } } |
参考URL: https://qiita.com/amymd/items/0a5f2705e29972d0d22e
6, 画面遷移などを伴うブラウザテスト(UIテスト、E2Eテスト)は、laravel5.4から導入されたlaravel Duskというパッケージを使う。
Dusk(ダースク) = twilight(たそがれ、太陽が沈んだけど、まだ明るい時間帯)の後半。暗くなる直前の事。もうすぐ終わりだよ~ってニュアンスか?
https://readouble.com/laravel/5.5/ja/dusk.html
6-a, 例によって、composer.jsonに、”laravel/dusk”: “^2.0″を追加してから、composer updateする
最新のlaravel/duskは4系だけど、3系以降はlaravel5.6以上が必要なのでエラーになる。なので2系を使うのしかない。
バージョン指定に、^(チルト)と~(キャレット)が混ざってて紛らわしい…。基本的に指定バージョン以上って意味だけど、微妙に違うのか?
http://blog.a-way-out.net/blog/2015/06/19/composer-version-tilde-and-caret/
6-b, php artisan dusk:install でduskに必要なファイル類をプロジェクトに追加(testsフォルダ内に、DuskTestCase.phpとBrowserフォルダが追加される)
以後は、php artisan duskコマンドが使えるようになる。
6-c, php artisan duskコマンドを使ってみると、エラーが…。
Facebook\WebDriver\Exception\UnknownServerException: unknown error: cannot find Chrome binary
Facebook/Webdriverが~、 Chrome binaryが~とエラーを吐く…。
Chrome binaryってなんだよ~。と思って調べてみたら、要するにテストコードでコマンドライン上でブラウザテストするから、ブラウザとしてchrome機能が必要らしい。
compserって、パッケージ依存関係管理ツールじゃないのかよ~と文句を言いつつ、rootになってサーバにインストールしたけど解決しない…。
色々とやってダメだったので、composer.jsonから一度削除してcomposer updateで削除。最初からやり直したら何故か上手く行った、なぜ?
6-d, tests/Browser/ExampleTest.phpファイルにサンプルがあるので、デフォルトと違う場合は適当に修正して、php artisan duskコマンドからエラーが出ないようにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace Tests\Browser; use Tests\DuskTestCase; use Laravel\Dusk\Browser; use Illuminate\Foundation\Testing\DatabaseMigrations; class ExampleTest extends DuskTestCase { /** * A basic browser test example. * * @return void */ public function testBasicExample() { $this->browse(function (Browser $browser) { $browser->visit('/') ->assertSee('Laravel'); }); } } |
7, テストしたい項目別にテストファイルを作る。
1 |
php artisan dusk:make LoginTest |
tests/Browser/LoginTest.phpというファイルが生成されるので、自分の実装に合わせてログイン処理を書き込む
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace Tests\Browser; use Tests\DuskTestCase; use Laravel\Dusk\Browser; use Illuminate\Foundation\Testing\DatabaseMigrations; class LoginTest extends DuskTestCase { public function testExample() { $this->browse(function ($browser) use ($user) { $browser->visit('section/login') ->type('section_auth_id', 'aaaaa') ->type('username', 'a1234567') ->type('password', 'a1234567') ->press('login_button') ->assertPathIs('/section'); }); } } |
8, php artisan duskしてエラーが出なければOK!これでブラウザの自動テストが出来るようなった!
ブラウザ操作は、ここにまとめて書いてあるので、色々と試せる。
https://readouble.com/laravel/5.5/ja/dusk.html