MichaelJennings/refresh-database

一个用于加速Laravel数据库测试的包,只运行一次迁移

v2.1.0 2022-10-20 14:23 UTC

This package is auto-updated.

Last update: 2024-09-10 14:54:07 UTC


README

在Laravel中运行数据库测试时,最大的开销之一是运行所有的迁移,应用越大,所需时间越长。

此包通过将迁移一次性运行到sqlite文件中,然后在每个测试之前加载数据库结构(而不是运行迁移)来加速测试。

目前,此包仅与phpunit和sqlite兼容。

版本兼容性

安装

要安装包,请运行

composer require michaeljennings/refresh-database --dev

或将 michaeljennings/refresh-database 添加到你的 composer.json 文件中的 require-dev 部分。

...
"require-dev": {
  "michaeljennings/refresh-database": "^2.0"
},
...

然后运行 composer update 来安装包。

使用

首先,我们需要告诉phpunit从包的 bootstrap.php 文件引导。

<phpunit bootstrap="./vendor/michaeljennings/refresh-database/src/bootstrap.php">
  <testsuites>
    <testsuite name="Standard Test Suite">
      <directory>tests</directory>
    </testsuite>
  </testsuites>
</phpunit>

默认情况下,引导程序将在与你的vendor目录相同级别的地方查找名为 .refresh-database.yml 的配置文件。

所以你的项目可能看起来像这样

tests/
vendor/
.refresh-database.yml

.refresh-database.yml 中,你可以定义我们应该从中加载迁移的目录和存储数据库转储的目录。

一个简单的配置文件看起来如下

migrations:
  - database/migrations
  - vendor/other/package/database/migrations

output: tests

当你运行测试时,我们将在输出目录中创建一个 .database 目录。所有的迁移将运行到一个sqlite数据库中,然后对数据库结构进行转储。

配置好之后,你只需在测试或测试用例中使用 MichaelJennings\RefreshDatabase\RefreshDatabase 特性。

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use MichaelJennings\RefreshDatabase\RefreshDatabase;

class TestCase extends BaseTestCase
{
    use RefreshDatabase;
}

多个连接

一些系统需要你在多个数据库中运行迁移,例如多租户系统。

要迁移到多个数据库连接,你可以在你的 .refresh-database.yml 文件中设置 connections 属性。

以下是一个包含两个数据库连接(shared 和 tenant)的配置文件。

connections:
  shared:
    migrations:
      - database/migrations
      - vendor/other/package/database/migrations
  tenant:
    migrations:
      - database/migrations/tenant

output: tests

连接键必须是你的Laravel应用中数据库连接的名称。

对于上面的配置文件,你将需要设置两个数据库连接:一个叫做 shared,另一个叫做 tenant。

return [
  ...
  'connections' => [
    'shared' => [
      'driver' => 'sqlite',
        'database' => ':memory:',
        'prefix' => '',
      ],
      'tenant' => [
        'driver' => 'sqlite',
        'database' => ':memory:',
        'prefix' => '',
      ],
  ]
  ...
]

服务提供者

在你的应用中,你可能有一些依赖于服务提供者注册的迁移,因为这个包创建了它自己的应用实例,所以你需要告诉它要注册哪些服务提供者。

要注册你的服务提供者,你可以在你的 .refresh-database.yml 文件中设置 providers 属性。

以下是一个示例配置文件,其中我们加载了一个实用服务提供者。

migrations:
  - database/migrations
  - vendor/other/package/database/migrations

providers:
  - Database\UtilityServiceProvider

output: tests

环境

偶尔你可能想要在某些环境中禁用数据库转储。

要禁用数据库转储,你可以设置一个 DUMP_DATABASE 环境变量并将其设置为 false。

<phpunit bootstrap="./vendor/michaeljennings/refresh-database/src/bootstrap.php">
  <testsuites>
    <testsuite name="Standard Test Suite">
      <directory>tests</directory>
    </testsuite>
  </testsuites>
  <php>
    <env name="DUMP_DATABASE" value="false"></env>
  </php>
</phpunit>

迁移缓存

默认情况下,此包将缓存迁移的内容,以便只在需要时重建数据库。

如果你想要在每次运行测试时重建数据库,请在你的 .refresh-database.yml 文件中将 cache_migrations 属性设置为 false。

migrations:
  - database/migrations
  - vendor/other/package/database/migrations

output: tests
cache_migrations: false

如果您已设置多个数据库连接,您只需指定一次 cache_migrations 属性。

connections:
  shared:
    migrations:
      - database/migrations
      - vendor/other/package/database/migrations
  tenant:
    migrations:
      - database/migrations/tenant

output: tests
cache_migrations: false

如果您发现包没有按照预期重建数据库,请从您的输出目录中删除 .database 目录。