テスト時に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の中で出てる