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の開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, React, Flutter, Vue.js, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント