20
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LumenのPHPUnitでテスト用のDBを使う

Last updated at Posted at 2016-04-07

Lumen 5.2のPHPUnitでのユニットテストでテスト専用のDBを使うやり方が公式だとよくわからなかったのですが、
このあたりにありました。

https://laracasts.com/discuss/channels/testing/how-to-specify-a-testing-database-in-laravel-5

.envに書いたりとか、configファイルを作ったりとか色々なやり方があるようですが、
自分の環境では最も簡単にできるシンプルなやり方がわかりました。

例えば、開発用にMySQLで"dbname_dev"という名前のDBを使っていて、
PHPunitでのユニットテスト専用に同じMySQLサーバー内の"dbname_test"というDBを使う時

同じMySQLサーバーなので、DB_DATABASEの名前のみをphpunit.xmlの最後らへんに設定します。

phpunit.xml
	...
	...
	<php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
+       <env name="DB_DATABASE" value="dbname_test"/>
	</php>
</phpunit>

phpunit.xmlの変更だけだとartisanで "APP_ENV=testing php artisan migrate"
コマンドを打ったとしてもdbname_testのDBには反映されないのですが、
その必要もありません。

tests/TestCase.php の setUp() と tearDown() で以下のようにArtisanを実行するとテストのたびに
データをリセットできます。
(Facadeを使っているのでboostrap/app.phpの $app->withFacades(); をコメントインしてください。)

tests/TestCase.php
<?php
+ use Illuminate\Support\Facades\Artisan;

class TestCase extends Laravel\Lumen\Testing\TestCase
{
    /**
     * Creates the application.
     *
     * @return \Laravel\Lumen\Application
     */
    public function createApplication()
    {
        return require __DIR__.'/../bootstrap/app.php';
    }

+    public function setUp()
+    {
+        parent::setUp();
+        Artisan::call('migrate');
+    }

+    public function tearDown()
+    {
+        Artisan::call('migrate:reset');
+        parent::tearDown();
+    }
}

テストが終わった後にデータが残っていて欲しい時は、setUp(),tearDown()の内容を適宜書き換えるなどすればいいと思います。

追記)@niisan-tokyo さんからコメントいただきました。
DBのリセットにはそれ用にtraitが用意されているのでそちらを使った方が良いです。


追記) 最近、Laravel5.3にてphpunit.xmlに同様の記述をしたところ、設定を読み込んでくれなくて困りました。
答えは簡単で

php artisan config:clear

としたら反映されました。Laravelではconfigをキャッシュしていたのでした(Laravel初心者なのでなかなか気づけませんでした)。

20
16
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?