即使像下面这样运行一个简单的测试:
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 个测试,那将花费非常长的时间。
任何解决方案?
对我来说,花费大量时间的事情是在每次测试之前运行迁移,而
migrate:rollback
在每次由DatabaseMigrations
trait 完成的测试之后运行迁移。这是我在我的项目中解决它的方法:
DatabaseMigrations
特征的使用。./artisan migrate:fresh --seed --env=dusk
。我在调用运行测试的 bash 文件中执行此操作。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);
$this->artisan('db:seed');
现在测试运行得更快。
解决你的问题可能取决于很多事情(你的开发环境设置、你的数据库或其他一些问题)。
就我而言,每次测试都需要花费大量时间进行迁移。当你使用 Laravel Dusk 时,你正在使用
DatabaseMigrations
特性,它一遍又一遍地运行迁移,所以如果你能改进这部分,你可能会有很大的收获。您谈到了 100 次测试。所以假设应用迁移需要 10 秒,你可以减少到 4 秒,总共你将获得 600 秒。
你可以阅读更多关于我如何让我的 Laravel Dusk 测试比最初快 3 倍 - https://laradevtips.com/2018/07/23/make-laravel-dusk-tests-3-times -更快/-我不知道它是否能解决您的问题,但就我而言(今天测试),收益确实令人印象深刻。
从 Laravel 9 开始,可以用
DatabaseMigrations
替换较慢的 DatabaseTruncation
特性。这需要安装 doctrine/dbal
包才能使用,但具有更快的优点:
DatabaseMigrations 特性将在每次测试之前运行您的数据库迁移。但是,为每个测试删除和重新创建数据库表通常比截断表慢......
DatabaseTruncation 特性将在第一次测试时迁移您的数据库,以确保您的数据库表已正确创建。然而,在随后的测试中,数据库的表将被简单地截断——与重新运行所有数据库迁移相比提供了速度提升:
不幸的是,我无法测试
DatabaseTruncation
到底有多快,因为我目前无法从 Laravel 8 进行更新。