👌
LaravelのRefreshDatabase についてのメモ
RefreshDatabase の基本的な挙動
ソースコード:github
細かいソースの解説は省略して基本的な挙動は下記
- 初回のテスト実行時:migrate:fresh を実行
- 各テスト開始前:transactionの開始
- 各テスト終了後:roleback
migrate:freshは最初に実行される。
特徴としてはファイル毎に初回のテスト実行時migrate:freshを実行するので、DatabaseTransactions等より実行時間が長くなる。
イレギュラーケース
通常あまりないと思うけどイレギュラーが発生しうる実行内容
非同期処理
これは言わずもがなで、キューなどで非同期で処理する場合は
処理の終了を待つ対応を入れないと整合性が取れない。
途中でコミットする
public function test_something()
{
$user = User::factory()->create();
DB::commit();
$this->assertDatabaseHas('users', ['id' => $user->id]);
}
テストが終わってデータが残っているということが起こり得る。
また暗黙的にコミットするステートメントも同様。
どういうステートメントが該当するかはmysqlだと下記などを参照。
SQLiteのインメモリは挙動が異なる
- 通常のデータベース:初回だけ migrate:fresh → あとはトランザクション
- SQLite のインメモリ:毎回破棄され毎回マイグレーション実行
これはそもそも的な話ではある。
ただ、結果毎回リセットされることに依存したテストをかいてしまうとあれ?ってなる。
Discussion