简介
Laravel 内置了一整套用来安全、高效地测试与数据库相关功能的机制。将数据库重置 trait、模型工厂、Seeder 与专用断言组合起来,可以让测试更加健壮、不易出错。 首先建议使用RefreshDatabase。它在大部分场景下都能兼顾测试独立性与执行速度,比完全重建数据库要快得多。
每个测试执行后重置数据库
为了避免上一次测试的数据影响下一次测试,可以使用 Laravel 提供的数据库重置 trait。RefreshDatabase 会判断数据库结构是否为最新版本。如果是最新的,就使用事务运行测试;否则会先执行迁移。
如果不使用事务方式,希望每次都完全重置,可以使用以下 trait。
| Trait | 行为 | 使用场景 |
|---|---|---|
RefreshDatabase | 结构最新时用事务,仅在必要时执行迁移 | 通常首选 |
DatabaseMigrations | 每个测试都执行一次迁移 | 需要每次都走完整的迁移生命周期 |
DatabaseTruncation | 通过 TRUNCATE 表来初始化 | 不适合用事务的环境下需要彻底清空数据 |
模型工厂
在测试前准备数据时,使用模型工厂可以简洁地生成 Eloquent 模型。 工厂的定义、state 和关联关系细节请参考 Eloquent 工厂。执行 Seeder
如果需要在测试中填充数据,可以使用seed()。不带参数时会运行 DatabaseSeeder,带参数时可以运行指定的 Seeder(或数组)。
RefreshDatabase 的测试都自动执行 seed,可以在基类测试上添加 #[Seed] 属性。
#[Seeder(...)]。