LoginSignup
1
0

DatabaseTransactions と RefreshDatabaseの違いと使い方

Posted at

Laravelフレームワークでは、テストの手助けをするためにいくつかの便利な機能が提供されています。その中でも、特にデータベースとのやり取りをテストする場面でよく使われるのが DatabaseTransactionsRefreshDatabase トレイトです。

これらのトレイトの目的と使い方、そして違いについて解説します。

RefreshDatabase

RefreshDatabase トレイトは、テストケースが実行される前にデータベースをマイグレーションし直します。つまり、テストケースごとに全てのテーブルが初期状態に戻ります。

use Illuminate\\Foundation\\Testing\\RefreshDatabase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

		public function setUp()
    {
        parent::setUp();
    }

    public function testDatabase1()
    {
        // データベース操作のテストコード
    }

		public function testDatabase2()
    {
        // データベース操作のテストコード
    }
}

動作フロー

利点と制限

  • 状態: 各テストでデータベースがリセットされるため、状態の管理が非常に容易。
  • 速度: マイグレーションとシーディングが必要な場合は、DatabaseTransactionsよりも遅くなる可能性がある。

DatabaseTransactions

DatabaseTransactions トレイトを使用すると、テストケース内で行われるデータベースの操作はトランザクション内で行われます。このトランザクションはテストケースの実行が終了するとロールバックされます。

use Illuminate\\Foundation\\Testing\\DatabaseTransactions;

class ExampleTest extends TestCase
{
    use DatabaseTransactions;

		public function setUp()
    {
        parent::setUp();
    }

    public function testDatabase1()
    {
        // データベース操作のテストコード
    }

		public function testDatabase2()
    {
        // データベース操作のテストコード
    }
}

動作フロー

利点と制限

  • 速度: トランザクションは比較的高速であり、テーブルを再構築する必要がない。
  • 状態: 各テストが独立してトランザクション内で動作するため、テストの間に状態が漏れ出る心配が少ない。

どちらを使うべきか?

RefreshDatabase

  • データベースのスキーマ自体をテストしたい場合
  • 一時テーブル(Temporary Table)を使う場合

DatabaseTransactions

  • 大量のテーブルが存在する場合
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0