🛠️
PHPUnitにおけるRefreshDatabaseとDatabaseTransactionsの違い
🛠️ PHPUnit におけるRefreshDatabaseとDatabaseTransactionsの違い
PHPUnit でデータベースを利用するテストを実施する際に、RefreshDatabase と DatabaseTransactions という 2 つのトレイトを使用できます。それぞれの特徴を理解し、適切に使い分けることが重要です!
🔄 RefreshDatabase とは?
RefreshDatabase は、テストごとにデータベースをリフレッシュ(再生成)する トレイトです。
✅ 特徴
- 🧹 データベースを完全リセット して、クリーンな状態でテストできる!
- 🔄 マイグレーションを実行 して、最新のスキーマを適用!
- 🚫 トランザクションは使用しない ので、テストが分離される!
- 🛡️ データの汚染を防ぎ、安定したテストが可能!
📌 使用例
use Illuminate\\Foundation\\Testing\\RefreshDatabase;
use Tests\\TestCase;
use App\\Models\\User;
class ExampleTest extends TestCase
{
use RefreshDatabase;
public function test_database_refreshes_correctly()
{
User::factory()->create(['name' => 'Makino']);
$this->assertDatabaseHas('users', ['name' => 'Makino']);
}
}
🔁 DatabaseTransactions とは?
DatabaseTransactions は、テスト実行時にトランザクションを開始し、テスト終了後にロールバックする トレイトです。
✅ 特徴
- 🔄 テストがトランザクション内で実行 される!
- 💥 テスト終了後にロールバック されるので、データが残らない!
- ⚙️ マイグレーションは実行しない!
- ⚡ データベースのリセットが不要なので高速!
- ⚠️ 外部キー制約の影響を受けやすいので注意!
📌 使用例
use Illuminate\\Foundation\\Testing\\DatabaseTransactions;
use Tests\\TestCase;
use App\\Models\\User;
class ExampleTest extends TestCase
{
use DatabaseTransactions;
public function test_transaction_rolls_back()
{
User::factory()->create(['name' => 'Makino']);
$this->assertDatabaseHas('users', ['name' => 'Makino']);
}
}
🔍 RefreshDatabase と DatabaseTransactions の違い
| 🏷️ 項目 | 🔄 RefreshDatabase | 🔁 DatabaseTransactions |
|---|---|---|
| 💾 データリセット方法 | マイグレーションを再実行 | トランザクションでロールバック |
| ⏳ テスト速度 | やや遅い(マイグレーション実行のため) | 高速(ロールバックのみ) |
| 🗑️ 影響範囲 | 全テーブルをリセット | テスト内のデータ操作のみ |
| ⚠️ 外部キー制約の影響 | なし | 制約があると問題が出る可能性あり |
🤔 どちらを使うべき?
- 🏗️ データベーススキーマの変更が頻繁にある場合 →
RefreshDatabaseがオススメ! - ⚡ 外部キー制約がなく、テストを高速化したい場合 →
DatabaseTransactionsが便利! - 📂 SQLite などのファイルベース DB を使用する場合 →
RefreshDatabaseが安定! - 🛡️ 本番環境に近い DB で外部キー制約を考慮する場合 →
RefreshDatabaseを選ぼう!
✨ まとめ
| 🎯 選択基準 | 🏆 適したトレイト |
|---|---|
| 📌 テストごとにデータを完全リセットしたい | RefreshDatabase |
| ⚡ 高速にテストを実行したい | DatabaseTransactions |
| 🛡️ 外部キー制約の影響を受けたくない | RefreshDatabase |
| 🔄 シンプルなテストでトランザクションを活用 | DatabaseTransactions |
どちらも便利なトレイトですが、状況に応じて適切に使い分けることが大切です!🛠️ 特に、本番環境と同じデータベースを使う場合は RefreshDatabase を使うと、より実際の動作に近いテストが可能になります 💡
これで RefreshDatabase と DatabaseTransactions の違いがバッチリ理解できますね!🔥
Discussion