最快方式是直接使用 :memory: 内存数据库,需确保 database 配置为 ':memory:'、db_connection 设为 sqlite、禁用迁移重置、改用 query builder 批量插入、关闭日志与调试中间件。

直接用 :memory: 就是最快的方式,Laravel 11 的 SQLite 内存数据库本身没有“慢”的问题——真正拖慢测试速度的,往往是测试写法、框架配置或数据准备方式。
确保使用真正的内存数据库连接
检查 config/database.php 中的 sqlite 连接是否明确指向 :memory::
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DATABASE_URL'),
'database' => ':memory:', // 必须是这个,不是文件路径
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
同时确认 phpunit.xml 或 .env.testing 中已设为:
<env name="DB_CONNECTION" value="sqlite"></env>
注意:不要用 ''(空字符串)代替 :memory:,Laravel 11 对空字符串的处理不如显式 :memory: 稳定,且可能意外触发临时文件行为。
禁用迁移重置,改用内存库天然隔离性
Laravel 默认的 DatabaseMigrations 或 RefreshDatabase trait 每次测试都会执行 migrate/rollback,即使在内存库中也有多余开销。既然 :memory: 本身每次连接就是全新、空白、自动销毁的,完全可以跳过迁移:
- 移除测试类中的
RefreshDatabase或DatabaseMigrationstrait - 改用自定义 setup 方法,在每个测试开始时一次性建表+预置基础数据
- 例如在
setUp()中运行Artisan::call('migrate')仅一次(配合static $migrated = false静态标记),避免重复建表
减少 Eloquent 开销,优先用 Query Builder
测试数据准备阶段(如 factory()->create())若大量使用 Eloquent 模型,会触发事件监听、属性转换、关系加载等额外逻辑,显著拉长初始化时间:
- 对纯数据填充场景,改用
DB::table('users')->insert([...]) - 避免
factory(User::class)->count(100)->create(),改用批量插入:DB::table('users')->insert($data) - 禁用模型事件(尤其在
TestCase的setUp()中):User::unsetEventDispatcher()
关闭日志与调试中间件
测试环境下默认启用的查询日志、事件日志、Debugbar 等,会在每次数据库操作时累积内存和 I/O:
- 在
phpunit.xml中确保关闭日志:<env name="DB_LOG_QUERIES" value="false"></env> - 检查
config/app.php的debug是否为false(测试环境应始终关闭) - 卸载或禁用
barryvdh/laravel-debugbar(它在测试中无意义且严重拖慢)











