テスト時にDBを差し替える設定
<proj_root>/phpunit.xmlに下記を追記
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
+ <env name="DB_DATABASE" value="app_test"/>
テスト用DB作る~MySQLの場合
- rootでmysqlに入る
CREATE DATABASE app_test;
USE app_test;
- アプリケーションでDBを使うユーザ(ここでは
default
)にいろいろ権限付与
GRANT SELECT,CREATE,DELETE,ALTER,INSERT,UPDATE,DELETE,DROP ON *.* TO "default"@"%";
テスト書く
php artisan make:test --unit HogeTest
-
<proj_root>/tests/Unit/HogeTest.phpできる
- テストメソッドを1つ呼び出すごとに再インスタンシエートしてるっぽい
- クラス冒頭に
use RefreshDatabase;
追加
自動でマイグレーションとトランザクション・ロールバックをしてくれる有能トレイト -
protected function setUp()
をオーバライドする-
parent::setUp()
を忘れず呼び出すこと- 「
DB
なんてクラスないよ」、とかいろいろエラー出る
- 「
- \DBとかEloquentとかでいい感じにデータ投入
- テストメソッドが呼び出されるたびに実行される
-
protected static function setUpBeforeClass()
でデータ投入しようとしてもうまくいかなかった- 仮にうまくいっても、テストメソッドを一つ実行した時点でDBがロールバックされてしまうだろう
- 環境を使いまわさず、毎回キレイな環境でテストしろってことですね。
テストは実施順に依存するべきではない
-
/** @test */
アノテーションをつけていい感じにテストを書く
仕様
-
テストメソッドが1回実行されるごとに
- テストケースクラスがインスタンシエートされ
setUp()
でデータが投入され- テストメソッドが実行され
- DBがロールバックされる
@dataProvider
を使って1つのテストメソッドを複数回実行する場合も同様。
一回一回上記のフローをたどる模様
つまづいたところ
-
DBはロールバックしても自動増分IDの採番はリセットされない
- ので、
setUp()
でのデータ投入でidを設定しないと、冪等なセットアップにならない* - 1から始まることを期待していると想定外の動きをするので注意
- ので、
- 自動増分IDの採番をリセットしたい場合は、
protected function tearDown()
をオーバライドして
\DB('table_name')->truncate();
する -
__construct()
使っちゃダメarray_merge()
にまつわるエラーが出る。PHPUnitの中で出てる