MichaelJennings / refresh-database
一个用于加速Laravel数据库测试的包,只运行一次迁移
Requires
- php: ^7.2 || ^8.0
- illuminate/support: >=7.0
- orchestra/testbench: ^7.0.0
- symfony/process: >=5.0
- symfony/yaml: >=5.0
Requires (Dev)
- mockery/mockery: ^1.2
- php-coveralls/php-coveralls: ^2.1
- phpunit/phpunit: >5.0
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 目录。