はじめに
Illuminate\Database\Eloquent\Model
を利用している場合には、
リレーション (belongsTo``hasOne``hasMany
など)の対応がシンプルにできるため、
テスト用DBにてphpunitを実施する設定について記載しています
環境
laravel: v5.5.50
phpunit/phpunit: 5.7.27
テスト用DBの接続設定
//...
'connections' => [
// ...
// テスト用設定
'test' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => 'test',
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
],
// ...
※接続設定は環境に応じて適宜書き換えてください
DB_CONNECTION設定
以下phpunit.xml
を書き換え
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
// ...
<php>
// ...
<env name="DB_CONNECTION" value="test" force="true"/>
</php>
</phpunit>
DB_CONNECTION
が適用されない場合
configをキャッシュしていると、phpunit.xml
の設定が適用されないようです
bootstrap/cache/config.php
を削除することで適用されました
rm -f bootstrap/cache/config.php
RefreshDatabase設定
traitのRefreshDatabase
を利用すると、
テスト実行時にphp arsitan migrate:refresh
を実行してくれます
<?php
namespace Tests;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
class ExampleTest extends BaseTestCase
{
use RefreshDatabase;
// ... テストコード
}
ハマった内容
Illuminate\Console\Command
を継承したクラスの__construct
で、
DBの参照しているとBase table or view not found
が発生しました
さいごに
phpunit.xml
でAPP_ENV
を変更する設定もあるようですが、
複数の環境にてテストを実施する場合にはそちらを利用したほうがよさそうです
※設定することがあればそちらについても投稿します