ampeco / fast-sqlite-refresh-database
替代每个测试的迁移
1.0.6
2024-02-19 13:52 UTC
Requires
- php: ^8.0
- laravel/framework: ^8.0|^9.0|^10.0
README
替代默认的laravel行为,为每个测试刷新sqlite数据库。
此外,也是压缩迁移的替代方案,因为即使在每个测试中仍然需要导入压缩的迁移。
在此实现中,启动测试时不使用事务,通过删除sqlite文件并从干净的模板重新创建它来刷新数据库!
说明
- 安装包
composer require --dev ampeco/fast-sqlite-refresh-database
- 确保您不是使用内存数据库,而是使用基于sqlite文件的数据库进行测试设置
- 在您的测试中,不要使用
use RefreshDatabase;
而是使用use FastSqliteRefreshDatabase;
- 运行您的测试
性能
我们在一个包含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_PREHEATED
为 true
。
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