👌

LaravelのRefreshDatabase についてのメモ

2025/02/27に公開

RefreshDatabase の基本的な挙動

ソースコード:github

細かいソースの解説は省略して基本的な挙動は下記

  1. 初回のテスト実行時:migrate:fresh を実行
  2. 各テスト開始前:transactionの開始
  3. 各テスト終了後:roleback

migrate:freshは最初に実行される。
特徴としてはファイル毎に初回のテスト実行時migrate:freshを実行するので、DatabaseTransactions等より実行時間が長くなる。

イレギュラーケース

通常あまりないと思うけどイレギュラーが発生しうる実行内容

非同期処理

これは言わずもがなで、キューなどで非同期で処理する場合は
処理の終了を待つ対応を入れないと整合性が取れない。

途中でコミットする

public function test_something()
{
    $user = User::factory()->create();
    
    DB::commit();
    
    $this->assertDatabaseHas('users', ['id' => $user->id]);
}

テストが終わってデータが残っているということが起こり得る。

また暗黙的にコミットするステートメントも同様。
どういうステートメントが該当するかはmysqlだと下記などを参照。

https://dev.mysql.com/doc/refman/8.0/ja/implicit-commit.html

SQLiteのインメモリは挙動が異なる

  • 通常のデータベース:初回だけ migrate:fresh → あとはトランザクション
  • SQLite のインメモリ:毎回破棄され毎回マイグレーション実行

これはそもそも的な話ではある。
ただ、結果毎回リセットされることに依存したテストをかいてしまうとあれ?ってなる。

株式会社ソニックムーブ

Discussion