2018-10-29に更新

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

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

(2018年追記:Laravel5.6時点では.env.testingを作成すればそちらが優先的に使用される)

マニュアルを見ると自動的に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はバックアップしておいた方が良い。


だら@Crieit開発者

Crieitの開発者です。 主にLAMPで開発しているWebエンジニアです(在宅)。大体10年程。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel5, CakePHP3, JavaScript, RoR 趣味:Elixir, Phoenix, Node, Nuxt, Express, Vue等色々

Crieitはαバージョンで開発中です。進捗は公式Twitterアカウントをフォローして確認してください。 興味がある方は是非記事の投稿もお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
関連記事

コメント