Laravelを使ってUnitTestをする場合の注意点など。
Contents
事前準備
まずはアプリのディレクトリにあるphpunit.xmlに下記の記述を追加します。(追加分のみ+で表記。)
1 2 3 4 5 6 7 |
<php> <env name="APP_ENV" value="testing"/> <env name="CACHE_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/> <env name="QUEUE_DRIVER" value="sync"/> +<env name="DB_DATABASE" value="test_db"/> </php> |
上記に使うデータベースを追加し、実際に作ってあげましょう。
テストデータ作成機能
Laravelにはテストデータを作る機能が付いています。(fackerと言うライブラリのようです。)
これを使わなくてもテストをすることができますが、実際にはあると活躍してくれるでしょう。
./database/factories/ModelFactory.php
1 2 3 4 5 6 7 8 9 |
//ここにモデルのクラス名を入れます。 $factory->define(App\Model\Item::class, function (Faker\Generator $faker) { static $password; $faker = Faker\Factory::create('ja_JP'); return [ 'title' => $faker->name, 'url' => $faker->url, ]; }); |
上記には実際に入力するデータのタイプを決めます。
こうすることで人名なのか、emailなのか、urlなのかと言うことを決定できます。このランダム系の処理はかなり便利だと思います。
どういうデータタイプがあるかは、下記のfakerのドキュメントを見て見ましょう。
https://github.com/fzaninotto/Faker
Perlの時はこれを自力で作ってました、便利ですね・・・・
実際のテストコード
./tests/Unit/HelloTest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<?php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\DatabaseMigrations; use App\Model\Item; class HelloTest extends TestCase { //↓migration機能(テーブルの自動作成、ドロップ) //差分が発生するのでいらないかも・・・ //use DatabaseMigrations; public $item; public function setup() { parent::setUp(); //データの定義とインサート factory(Item::class)->create([ 'title' => 'rookeis', 'url' => 'http://www.yahoo.co.jp' ]); factory(Item::class,10)->create(); $this->item = new Item(); } /** * A basic test example. * * @return void */ public function testExample() { //ここが実際のテストを行う部分 $this->item->hogehoge2('aaaaa'); $this->assertTrue(true); } public function tearDown() { $this->item->truncate(); parent::tearDown(); } ?> |
ちなみにテストコードの雛形は
1 |
php artisan make:test HelloTest |
で作れます。
一般的に./tests/FeatureにはControllerのテストが入ることが多いようで、サンプルとしてある.ExampleTestにはそのような処理が書かれていますね・・・。
./tests/UnitTestには上記のようなモデルのメソッドを書いたUnitTestを書くようです。
上記でやっていることは、下記のような流れです。
- Laravelのmigrationは使わない(経験上使わなくなり、コードの定義と実際のデータベースの差分が出てしまう)ためuse DatabaseMigrationsをコメントアウト
- setUpでテスト実行前の処理を記述、tearDownでテスト終了後の処理を記述する。
- setUpにはダミーデータを入れる処理、tearDownにはtruncateの処理を書く。
比較的楽に実装することができました。マイグレーションに関してはコードからデータベースを作れるらしいので慣れればこれでやった方がいいかもしれません・・・私はやっていませんが。
あとはアプリのディレクトリ直下で
1 |
./vendor/bin/phpunit |
と実行すれば全メソッドが走り下記のような結果が出力されます。
1 2 3 4 5 6 7 8 |
PHPUnit 5.7.27 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 147 ms, Memory: 12.00MB OK (1 test, 1 assertion) |
Cakeの時も思いましが、もっと早く知っておくべきでしたね・・・これがあると一つのメソッドを作るのが格段に便利になります。