a-h-abid / laravel-refresh-module-database
一个用于任何 Laravel 模块包单元测试的刷新数据库特质。
v1.0.4
2023-01-20 04:38 UTC
Requires
- laravel/framework: >=6.0
README
Laravel 数据库特质,可用于单元测试模块包,如 nwidart/laravel-modules, pingpong/modules, caffeinated/modules 等。
解决的问题
TLDR; 通过仅迁移所需模块来加速单元测试。
详细说明
我在一个大的 Laravel 项目中使用流行的 nwidart/laravel-modules
包进行代码模块化。大约有 20 个模块,每个模块大约有 10-15 个迁移文件。当我运行 php artisan migrate:fresh
命令时,仅完成所有迁移就需要 15-20 秒。现在你可以理解,当我需要单元测试一小部分内容时,我必须等待 15-20 秒才能完成迁移,然后单元测试只需要 100-200ms。
因此,我开发了这样一个刷新数据库特质,我可以选择仅迁移特定的模块。这可以使小单元测试的速度提高 90%。
要求
- Laravel 6.0 或更高版本
- 数据库:我只测试了 MySQL。我认为 Postgres 或 SQLite 应该也能正常工作。
注意:这不能用于内存数据库。
安装
使用 composer 安装
composer require a-h-abid/laravel-refresh-module-database
用法
将特质导入您的测试代码。最好在您的基测试类中导入它。
class ExampleTest extends TestCase { use \AHAbid\LaravelRefreshModuleDatabase\RefreshModuleDatabase; }
接下来,在您的测试类中添加以下代码以运行模块迁移。以下示例适用于 nwidart/laravel-modules
包。如果您使用其他包或其他机制,请根据需要更改代码。
protected function runModuleMigration($moduleName) { $this->artisan('module:migrate ' . $moduleName); }
最后,在您的测试类中添加以下代码,指示要迁移的模块。
protected function modulesToMigrate() { return ['ModuleA', 'ModuleB']; }
现在,运行您的 phpunit 并查看结果。 :)
工作原理
类似于 Laravel 的刷新数据库特质,在初始化时,它会删除所有表,然后一次性迁移迁移文件。这里唯一的区别是我们可以在测试类中只选择迁移特定的模块。另外,一旦模块被迁移,它将不会在该测试会话中重新迁移/刷新。
其他用法选项
- 如果您还需要运行位于
project-root/database/migrations
目录中的迁移文件,请添加以下方法并将它设置为true
。
protected function shouldMigrateRootFiles() { return true; }
- 如果您需要迁移所有文件,请在您的
phpunit.xml
文件中将此环境变量设置为true
。
<env name="TDD_MIGRATE_ALL_FILES" value="true" />
待办事项
- 改进文档。
- 实现 TDD。
许可
本项目受 MIT 许可证的条款约束。