Laravel Dusk 测试运行非常慢

问题描述 投票:0回答:3

即使像下面这样运行一个简单的测试:

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 个测试,那将花费非常长的时间。

任何解决方案?

laravel testing laravel-5 laravel-5.6 laravel-dusk
3个回答
4
投票

对我来说,花费大量时间的事情是在每次测试之前运行迁移,而

migrate:rollback
在每次由
DatabaseMigrations
trait 完成的测试之后运行迁移。这是我在我的项目中解决它的方法:

  1. 从您的测试用例中删除
    DatabaseMigrations
    特征的使用。
  2. 在开始测试之前调用
    ./artisan migrate:fresh --seed --env=dusk
    。我在调用运行测试的 bash 文件中执行此操作。
  3. 在您的基
    DuskTestCase
    类中,setUp 方法调用一个命令来删除表中的所有数据。这是我为 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');

现在测试运行得更快。


3
投票

解决你的问题可能取决于很多事情(你的开发环境设置、你的数据库或其他一些问题)。

就我而言,每次测试都需要花费大量时间进行迁移。当你使用 Laravel Dusk 时,你正在使用

DatabaseMigrations
特性,它一遍又一遍地运行迁移,所以如果你能改进这部分,你可能会有很大的收获。您谈到了 100 次测试。所以假设应用迁移需要 10 秒,你可以减少到 4 秒,总共你将获得 600 秒。

你可以阅读更多关于我如何让我的 Laravel Dusk 测试比最初快 3 倍 - https://laradevtips.com/2018/07/23/make-laravel-dusk-tests-3-times -更快/-我不知道它是否能解决您的问题,但就我而言(今天测试),收益确实令人印象深刻。


0
投票

Laravel 9 开始,可以用

DatabaseMigrations
替换较慢的
DatabaseTruncation
特性。这需要安装
doctrine/dbal
包才能使用,但具有更快的优点:

DatabaseMigrations 特性将在每次测试之前运行您的数据库迁移。但是,为每个测试删除和重新创建数据库表通常比截断表慢......

DatabaseTruncation 特性将在第一次测试时迁移您的数据库,以确保您的数据库表已正确创建。然而,在随后的测试中,数据库的表将被简单地截断——与重新运行所有数据库迁移相比提供了速度提升:

不幸的是,我无法测试

DatabaseTruncation
到底有多快,因为我目前无法从 Laravel 8 进行更新。

© www.soinside.com 2019 - 2024. All rights reserved.