ampeco/fast-sqlite-refresh-database

替代每个测试的迁移

1.0.6 2024-02-19 13:52 UTC

This package is auto-updated.

Last update: 2024-09-19 15:30:46 UTC


README

替代默认的laravel行为,为每个测试刷新sqlite数据库。

此外,也是压缩迁移的替代方案,因为即使在每个测试中仍然需要导入压缩的迁移。

在此实现中,启动测试时不使用事务,通过删除sqlite文件并从干净的模板重新创建它来刷新数据库!

说明

  1. 安装包
composer require --dev ampeco/fast-sqlite-refresh-database
  1. 确保您不是使用内存数据库,而是使用基于sqlite文件的数据库进行测试设置
  2. 在您的测试中,不要使用 use RefreshDatabase; 而是使用 use FastSqliteRefreshDatabase;
  3. 运行您的测试

性能

我们在一个包含86个测试的内部功能测试套件中进行了测试。使用 LazyRefreshDatabase 我们得到了

ParaTest v6.9.1 upon PHPUnit 9.6.7 by Sebastian Bergmann and contributors.

................................................................. 65 / 86 ( 75%)
.....................                                             86 / 86 (100%)

Time: 01:09.101, Memory: 39.12 MB

然后我们切换到 FastSqliteRefreshDatabase 并得到了

ParaTest v6.9.1 upon PHPUnit 9.6.7 by Sebastian Bergmann and contributors.

................................................................. 65 / 86 ( 75%)
.....................                                             86 / 86 (100%)

Time: 00:06.894, Memory: 39.12 MB

额外的速度提升

预热数据库

如果您在CI中运行大量测试,例如。在运行测试之前,您可以调用 php artisan fast-sqlite-refresh-database:preheat。这将创建一个干净的sqlite数据库文件,可以复制到每个测试中。这将进一步加快您的测试速度!

要告诉您的测试使用预热的数据库,您可以在运行测试之前设置环境变量 FAST_SQLITE_REFRESH_DATABASE_PREHEATEDtrue

FAST_SQLITE_REFRESH_DATABASE_PREHEATED=true php vendor/bin/paratest

以下是使用预热的数据库进行相同测试的示例

ParaTest v6.9.1 upon PHPUnit 9.6.7 by Sebastian Bergmann and contributors.

................................................................. 65 / 86 ( 75%)
.....................                                             86 / 86 (100%)

Time: 00:05.916, Memory: 39.12 MB

内存盘

运行大量测试可能会创建大量的I/O,为此,您可以使用内存盘来存储sqlite数据库文件。

在macOS上,您可以使用APFS或HFS+内存盘。根据我们的测试,HFS+似乎比APFS快3-4%。

# APFS
diskutil apfs create $(hdiutil attach -nomount ram://1048576) ramdisk && touch /Volumes/ramdisk/.metadata_never_index &&  touch /Volumes/ramdisk/.fseventsd/no_log
#HFS+
diskutil erasevolume HFS+ ramdisk $(hdiutil attach -nomount ram://1048576) && touch /Volumes/ramdisk/.metadata_never_index &&  touch /Volumes/ramdisk/.fseventsd/no_log

卸载内存盘

diskutil eject /Volumes/ramdisk

在Linux上,您可以使用 tmpfs