vierge-noire/cakephp-test-migrator

CakePHP 测试套件 Light 的迁移助手

v2.5 2021-09-19 22:25 UTC

README

在运行测试之前运行迁移的工具

迁移助手

适用于 CakePHP 3.x

composer require --dev vierge-noire/cakephp-test-migrator "^1.0"

适用于 CakePHP 4.x

composer require --dev vierge-noire/cakephp-test-migrator "^2.0"

适用于 CakePHP 4.3+

迁移助手已集成到迁移插件中(请参阅文档)。本软件包将不再维护。

介绍

CakePHP 固定数据在并行于默认数据库的方式下处理测试数据库模式。一方面,你将为你默认数据库编写迁移。另一方面,你可以在固定数据中硬编码描述模式结构,或者模拟默认数据库。后者更简单,但它迫使你拥有两个数据库。在 CI 工具中,你将不得不在默认数据库上运行迁移,并模拟默认数据库。那么,为什么不在测试数据库上直接运行迁移呢?

使用 CakePHP 测试迁移助手,默认和测试数据库的模式处理方式完全相同。你可能不需要默认数据库。在测试套件之间不会删除表,这加快了测试速度。迁移是整个测试过程的一部分:它们会间接地被测试。

设置

该软件包提供了一种在测试之前运行你的迁移的工具。为了这样做,你可以在你的tests/bootstrap.php中放置以下内容

\CakephpTestMigrator\Migrator::migrate();

此命令将确保你的迁移运行良好,并保持测试数据库的更新。由于表被截断但从未被删除,因此迁移仅在需要时运行,即只有当开发人员创建了新的迁移时。

Migrator方法具有以下优势

  • 它通过避免在每个测试用例类之间创建和删除表来提高测试套件的运行速度,
  • 它简化了测试的维护,因为常规数据库和测试数据库以相同的方式管理,
  • 它间接测试了你的迁移。

你可以将true作为第二个参数传递以在控制台上获得详细输出。

选项

你可以传递一个布尔值作为选项,它将被用作verbose

\CakephpTestMigrator\Migrator::migrate([], true);
// is the same as
\CakephpTestMigrator\Migrator::migrate([], ['verbose' => true]);

多个迁移设置

你可以在 Migrator 实例化时直接传递各种迁移

\CakephpTestMigrator\Migrator::migrate([
    ['connection' => 'test', 'source' => 'TestFolder'],       
    ['plugin' => 'FooPlugin', 'connection' => 'FooConnection'],      
    ['source' => 'BarFolder'],
    ...
 ], ['verbose' => true]);

你也可以在你的数据源配置中直接传递各种迁移,在migrations键下

// In config/app.php
'test' => [
    'className' => Connection::class,
    'driver' => Mysql::class,
    'persistent' => false,
    'timezone' => 'UTC',
    'flags' => [],
    'cacheMetadata' => true,
    'quoteIdentifiers' => false,
    'log' => false,
    'migrations' => [
        ['plugin' => 'FooPlugin'],      
        ['source' => 'BarFolder'],
    ],
],

如果你希望使用默认迁移设置,可以将migrations简单地设置为true

迁移状态

可以通过以下方式获得连接的迁移状态信息

$migrator = Migrator::migrate();
$connectionsWithModifiedStatus = $migrator->getConnectionsWithModifiedStatus();

方法getConnectionsWithModifiedStatus返回在运行迁移之前具有向下迁移的连接列表。

数据截断

使用truncate选项在迁移完成后截断(或不清除)。如果你需要在测试套件的引导程序中执行其他任务,这很有用

$migrator = Migrator::migrate([], ['truncate' => false]);
// do something with the migrated database (bake fixtures, etc)
$migrator->truncate();

如果我切换分支会发生什么?

如果您曾经切换到包含不存在升级迁移的分支,那么您已经移动到了过去的某个状态的分支。 Migrator 会自动删除所需表,并重新运行迁移。因此,切换分支不需要您进行任何干预。

如果我不用迁移怎么办?

Migrator::dump() 将帮助您从一个或多个 sql 文件中导入任何模式。例如,运行

Migrator::dump('test', 'path/to/file.sql')

或使用多个文件

Migrator::dump('test', [
    'path1/to/file1.sql',
    'path2/to/file2.sql',
])

或以详细输出

Migrator::dump('test', 'path/to/file.sql', true)

第一个参数是连接名称,第二个参数是要转储的文件,第三个是详细程度(布尔值)。

然而,此方法在重新创建模式之前会删除模式,与基于迁移的解决方案相比,这会显著降低性能。

故障排除

在您安装或更新插件后,可能需要立即删除并重新创建您的测试数据库。如果问题仍然存在,请随意提交问题。

作者

  • Juan Pablo Ramirez
  • Nicolas Masson

支持

如有专业帮助需求,请联系 vierge.noire.info@gmail.com

喜欢我们的工作? ko-fi

许可证

CakephpTestMigrator 插件在 MIT 许可证 下提供。

版权所有 2020 Juan Pablo Ramirez 和 Nicolas Masson

在 MIT 许可证下授权。文件的重新分发必须保留上述版权声明。