読者です 読者をやめる 読者になる 読者になる
一人もくもく会 α verでサービス開始しました。

Laravel5でテスト時にtesting設定を使う方法

Laravel5.0での話。 現在の5.2では改善されているのかもしれない。

マニュアルを見ると自動的にtesting環境に切り替えると書いてあるが、 何も変わっている様子が見られないしそもそも設定方法が書かれていない。 仕方がないので色々調べてやってみた。 正しいのかも分からないがとりあえず動く方法。

テスト用DB接続を作成

SQLiteが使える環境だったのでSQLiteを使用した。 storageフォルダにtesting.sqliteファイルを作成。

config/database.phpのconnectionsに接続設定を追加。

'sqlite_testing' => [
    'driver'   => 'sqlite',
    'database' => storage_path().'/testing.sqlite',
    'prefix'   => '',
],

接続設定を動的に切り替えるため、defaultの設定も書き換える。

'default' => env('DB_DEFAULT', 'mysql'),

.env.testingを作成

切り替えるための設定ファイルを作成。 このファイルを作成してもテスト時に自動的に切り替わったりはしない。 異なるところは下記あたり。

APP_ENV=testing
APP_DEBUG=true

DB_DEFAULT=sqlite_testing

切り替え設定を追加

bootstrap/app.phpのreturn前に下記を追加。

$environment = $app->detectEnvironment(function()
{
    return env('APP_ENV', 'production');
});
if ($environment == 'testing') {
    $app->loadEnvironmentFrom('.env.testing');
}

テスト用のseedingを作成

DatabaseSeederのrunメソッドに、テスト用の分岐処理を追加。

public function run()
{
    Model::unguard();
    $this->call('AdminTableSeeder');
    if (app()->environment() == 'testing') {
        $this->call('TestProductTableSeeder');
    }
}

テスト用のDB初期化処理を追加

tests/TestCase.phpにsetUpメソッドを追加。

public function setUp() {
    parent::setUp();
    Artisan::call('migrate:refresh');
    Artisan::call('db:seed');
}

あとは

vendor/bin/phpunit

正しく動くまでは DBはバックアップしておいた方が良い。