Laravel DB自動テスト おぼえがき

LaravelPHPSQL勉強メモ

テスト時に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の場合

  1. rootでmysqlに入る
  2. CREATE DATABASE app_test;
  3. USE app_test;
  4. アプリケーションでDBを使うユーザ(ここではdefault)にいろいろ権限付与
    GRANT SELECT,CREATE,DELETE,ALTER,INSERT,UPDATE,DELETE,DROP ON *.* TO "default"@"%";

テスト書く

  1. php artisan make:test --unit HogeTest
  2. <proj_root>/tests/Unit/HogeTest.phpできる

    • テストメソッドを1つ呼び出すごとに再インスタンシエートしてるっぽい
  3. クラス冒頭に use RefreshDatabase; 追加
    自動でマイグレーションとトランザクション・ロールバックをしてくれる有能トレイト
  4. protected function setUp()をオーバライドする

    • parent::setUp()を忘れず呼び出すこと

      • DBなんてクラスないよ」、とかいろいろエラー出る
    • \DBとかEloquentとかでいい感じにデータ投入
    • テストメソッドが呼び出されるたびに実行される
    • protected static function setUpBeforeClass()
      でデータ投入しようとしてもうまくいかなかった

      • 仮にうまくいっても、テストメソッドを一つ実行した時点でDBがロールバックされてしまうだろう
      • 環境を使いまわさず、毎回キレイな環境でテストしろってことですね。
        テストは実施順に依存するべきではない
  5. /** @test */ アノテーションをつけていい感じにテストを書く

仕様

  • テストメソッドが1回実行されるごとに

    1. テストケースクラスがインスタンシエートされ
    2. setUp()でデータが投入され
    3. テストメソッドが実行され
    4. DBがロールバックされる
  • @dataProviderを使って1つのテストメソッドを複数回実行する場合も同様。
    一回一回上記のフローをたどる模様

つまづいたところ

  • DBはロールバックしても自動増分IDの採番はリセットされない

    • ので、setUp()でのデータ投入でidを設定しないと、冪等なセットアップにならない*
    • 1から始まることを期待していると想定外の動きをするので注意
  • 自動増分IDの採番をリセットしたい場合は、protected function tearDown()をオーバライドして
    \DB('table_name')->truncate();する
  • __construct() 使っちゃダメ

    • array_merge()にまつわるエラーが出る。PHPUnitの中で出てる