Laravel中的测试-每个文件仅运行一次数据库迁移,而不是每个单独的测试

问题描述

在我的Laravel应用程序中,我有大量的MysqL表和大量的PHPunit测试要运行。我使用sqlite在内存中运行测试,并有一系列Seeder文件将数据添加到测试数据库中。

对于每项测试,Laravel都会创建一个新的数据库,运行迁移并添加数据,将其乘以测试数量会花费很多时间。

我想指定对于某些测试文件,RefreshDatabase和DatabaseMigrations每个文件只需要运行一次,而不是每个测试一次。

Laravel中有该功能吗?

解决方法

如果您不想为某些测试刷新迁移,请使用以下设置方法将它们放入Test类:

protected function setUp(): void
{
    RefreshDatabaseState::$migrated = true; 

    parent::setUp();
}

RefreshDatabaseState::$migrated = true;将向Laravel声明已发生迁移,无需再次播放

,

您可以尝试以下操作:

use Illuminate\Foundation\Testing\DatabaseTransactions;

class YourTest extends TestCase
{
    use DatabaseTransactions;

    protected function setUp(): void
    {
        parent::setUp();

        $this->artisan('migrate');
    }

    /** @test */
    public function itDoesTheThing()
    {
        // code
    }
}

这里我们使用DatabaseTransactions特性,因此我们在测试中进行的所有操作都将包裹在事务中并在每次测试后回滚,然后在setUp方法中为每个测试迁移数据库,但是它只会在第一次测试时执行,因为数据库将在第一次测试后迁移。

另一种选择是使用一个属性,该属性确定您是否已经迁移/播种了数据库,如下所示:

class YourTest extends TestCase
{
    use DatabaseTransactions;

    protected static $initialized = false;

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

        if (!self::$initialized) {
            // migrate and seed the database for each test only once

            self::$initialized = true;
        }
    }
}