即使在运行如下所示的单个简单测试时:
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个测试,那将需要非常长的时间。
任何解决方案?
3条答案
按热度按时间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');
现在测试运行速度快多了。
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/-我不知道它是否能解决您的问题,但在我的情况下(今天测试),增益确实令人印象深刻。
bq3bfh9z3#
从Laravel 9开始,可以用
DatabaseTruncation
替换较慢的DatabaseMigrations
trait。这需要安装doctrine/dbal
包来使用,但有更快的优点:DatabaseMigrations特征将在每个测试之前运行数据库迁移。但是,为每个测试删除并重新创建数据库表通常比截断表要慢...
DatabaseTruncation特性会在第一次测试时迁移您的数据库,以确保您的数据库表已正确创建。然而,在后续测试中,数据库的表将被截断-提供比重新运行所有数据库迁移更快的速度:
不幸的是,我无法测试
DatabaseTruncation
的速度有多快,因为我目前无法从Laravel 8更新。