a-h-abid/laravel-refresh-module-database

一个用于任何 Laravel 模块包单元测试的刷新数据库特质。

v1.0.4 2023-01-20 04:38 UTC

This package is auto-updated.

Last update: 2024-09-20 07:56:38 UTC


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 的刷新数据库特质,在初始化时,它会删除所有表,然后一次性迁移迁移文件。这里唯一的区别是我们可以在测试类中只选择迁移特定的模块。另外,一旦模块被迁移,它将不会在该测试会话中重新迁移/刷新。

其他用法选项

  1. 如果您还需要运行位于 project-root/database/migrations 目录中的迁移文件,请添加以下方法并将它设置为 true
protected function shouldMigrateRootFiles()
{
    return true;
}
  1. 如果您需要迁移所有文件,请在您的 phpunit.xml 文件中将此环境变量设置为 true
  <env name="TDD_MIGRATE_ALL_FILES" value="true" />

待办事项

  • 改进文档。
  • 实现 TDD。

许可

本项目受 MIT 许可证的条款约束。