Laravel黄昏测试运行非常缓慢

2o7dmzc5  于 2023-03-09  发布在  其他
关注(0)|答案(3)|浏览(148)

即使在运行如下所示的单个简单测试时:

public function test_simple()
{
    $user = factory(User::class)->create();

    $this->browse(function ($browser) use($user){
        $browser->visit('/login')
                ->type('email', $user->email)
                ->type('password', 'secret')
                ->press('Login')
                ->assertPathIs('/home');
    });

}

Laravel Dusk跑得非常慢,仅在这个测试中就有14-16秒的速度。
我怎样才能加快速度呢?因为如果我要运行100个测试,那将需要非常长的时间。
任何解决方案?

ddhy6vgd

ddhy6vgd1#

对我来说,花费大量时间的事情是在每次测试之前运行迁移,在每次测试之后运行migrate:rollback。下面是我在项目中解决这个问题的方法:
1.从测试用例中删除DatabaseMigrations特征的使用。
1.在开始测试之前调用./artisan migrate:fresh --seed --env=dusk。我在运行测试时调用的bash文件中执行此操作。
1.在setUp方法的DuskTestCase基类中调用一个命令来删除表中的所有数据。下面是我对MySQL所做的操作(在Artisan命令中):
$command = 'mysql -u test_database -Nse "show tables" test_database | while read table; do mysql -u test_database -e "SET FOREIGN_KEY_CHECKS = 0; delete from $table" test_database; done;'; $result = exec($command);
1.执行上述命令后,运行$this->artisan('db:seed');
现在测试运行速度快多了。

nukf8bse

nukf8bse2#

问题的解决可能取决于很多因素(开发环境设置、数据库或其他一些问题)。
在我的例子中,每次测试都是迁移花费了很多时间。当你使用Laravel Dusk时,你使用的是DatabaseMigrations trait,它会一遍又一遍地运行迁移,所以如果你能改进这一部分,那可能会是你的一大收获。你谈到了100个测试。所以假设应用迁移需要10秒,你可以减少到4秒,总共你会获得600秒。
您可以阅读更多关于我如何使我的Laravel Dusk测试比最初快3倍-https://laradevtips.com/2018/07/23/make-laravel-dusk-tests-3-times-faster/-我不知道它是否能解决您的问题,但在我的情况下(今天测试),增益确实令人印象深刻。

bq3bfh9z

bq3bfh9z3#

从Laravel 9开始,可以用DatabaseTruncation替换较慢的DatabaseMigrations trait。这需要安装doctrine/dbal包来使用,但有更快的优点:
DatabaseMigrations特征将在每个测试之前运行数据库迁移。但是,为每个测试删除并重新创建数据库表通常比截断表要慢...
DatabaseTruncation特性会在第一次测试时迁移您的数据库,以确保您的数据库表已正确创建。然而,在后续测试中,数据库的表将被截断-提供比重新运行所有数据库迁移更快的速度:
不幸的是,我无法测试DatabaseTruncation的速度有多快,因为我目前无法从Laravel 8更新。

相关问题