🛠️
PHPUnitにおけるRefreshDatabaseとDatabaseTransactionsの違い
RefreshDatabase
とDatabaseTransactions
の違い
🛠️ PHPUnit における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