🛠️

PHPUnitにおけるRefreshDatabaseとDatabaseTransactionsの違い

2025/02/24に公開

🛠️ PHPUnit におけるRefreshDatabaseDatabaseTransactionsの違い

PHPUnit でデータベースを利用するテストを実施する際に、RefreshDatabaseDatabaseTransactions という 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']);
    }
}


🔍 RefreshDatabaseDatabaseTransactions の違い

🏷️ 項目 🔄 RefreshDatabase 🔁 DatabaseTransactions
💾 データリセット方法 マイグレーションを再実行 トランザクションでロールバック
⏳ テスト速度 やや遅い(マイグレーション実行のため) 高速(ロールバックのみ)
🗑️ 影響範囲 全テーブルをリセット テスト内のデータ操作のみ
⚠️ 外部キー制約の影響 なし 制約があると問題が出る可能性あり

🤔 どちらを使うべき?

  • 🏗️ データベーススキーマの変更が頻繁にある場合RefreshDatabase がオススメ!
  • 外部キー制約がなく、テストを高速化したい場合DatabaseTransactions が便利!
  • 📂 SQLite などのファイルベース DB を使用する場合RefreshDatabase が安定!
  • 🛡️ 本番環境に近い DB で外部キー制約を考慮する場合RefreshDatabase を選ぼう!

まとめ

🎯 選択基準 🏆 適したトレイト
📌 テストごとにデータを完全リセットしたい RefreshDatabase
高速にテストを実行したい DatabaseTransactions
🛡️ 外部キー制約の影響を受けたくない RefreshDatabase
🔄 シンプルなテストでトランザクションを活用 DatabaseTransactions

どちらも便利なトレイトですが、状況に応じて適切に使い分けることが大切です!🛠️ 特に、本番環境と同じデータベースを使う場合は RefreshDatabase を使うと、より実際の動作に近いテストが可能になります 💡

これで RefreshDatabaseDatabaseTransactions の違いがバッチリ理解できますね!🔥

Discussion