テストのためにデータベースをもう一つ用意するのがおっくうだったので、
sqliteを使ってみました。
sqliteで使うファイルを作成
touch database/laravel_db.sqlite
sqliteの設定を変更
config/database.php
'connections' => [
'testing_sqlite' => [
'driver' => 'sqlite',
'url' => env('DATABASE_URL'),
'database' => env('DB_DATABASE', database_path('laravel_db.sqlite')), //作成したファイルのパスに変更
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
phpunit.xmlの設定
phpunit.xml
<server name="APP_ENV" value="testing"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<server name="DB_CONNECTION" value="testing_sqlite"/> // database.phpで設定しているデータベース名に変更
<server name="DB_DATABASE" value="./database/laravel_db.sqlite"/> //作成したファイルのパスに変更
テスト実行
./vendor/bin/phpunit
めちゃめちゃ楽です。
補足
sqliteはインメモリを使っているのでデータが必要なテストをする場合、その都度データを投入する必要があります。データを事前に準備したいときは、テストクラスに以下のような処理を書いておくといいです。
テスト前にデータを用意
参照
https://qiita.com/pomechan0505/items/288b3a7f4622e170d7fe
テスト実行時、テストクラスで最初に実行されるテストの前に一度だけphp artisan migrate:fresh —seedが実行される
class hogehogeTest extends TestCase
{
private static $isSetUp = false;
protected function setUp():void
{
parent::setUp();
if(self::$isSetUp === false) {
$this->artisan('migrate:fresh --seed'); // php artisan migrate:fresh --seedコマンド実行
self::$isSetUp = true;
}
}
}
参考記事