0

0

Laravel 测试中如何只在测试开始时刷新数据库并验证数据变更效果

霞舞

霞舞

发布时间:2026-01-09 13:28:02

|

922人浏览过

|

来源于php中文网

原创

Laravel 测试中如何只在测试开始时刷新数据库并验证数据变更效果

laravel 默认的 `refreshdatabase` 特性会在每个测试前后重置数据库,但实际开发中有时需要保留测试结束后的数据以便人工验证(如通过 phpmyadmin 查看结果)。本文介绍为何不应依赖手动查库,并提供符合 laravel 测试哲学的专业替代方案:用断言精准验证数据状态。

在 Laravel 测试中,RefreshDatabase 是一个非常实用的 trait,它通过事务回滚(或迁移重置)确保每个测试运行在干净、可预测的数据库状态下。但正如你所观察到的——它默认在测试开始前初始化数据库,并在测试结束后自动清理。这种设计并非缺陷,而是 Laravel 测试体系的核心原则:测试必须是自包含、可重复、无需外部干预的自动化过程

因此,“希望测试结束后保留数据以便人工检查”这一需求,本质上与单元/功能测试的目标相悖。phpMyAdmin 查看虽直观,却引入了人为误差、环境依赖和不可持续性——未来 CI 环境无图形界面,团队成员无法复现你的验证步骤,且一次误操作可能导致后续测试失败。

✅ 正确做法是:用断言代替人工检查
你不需要“看到”数据被删,而应声明性地断言数据已被按预期删除。例如,若 remove_data_command 应删除特定类型用户的邮箱字段,就直接查询数据库并比对结果:

public function testRemoveCertainData()
{
    // 准备多种用户类型(使用工厂或辅助方法)
    $users = [
        User::factory()->create(['email' => 'user1@example.com', 'type' => 'normal']),
        User::factory()->create(['email' => 'user2@example.com', 'type' => 'sensitive']),
        User::factory()->create(['email' => 'user3@example.com', 'type' => 'normal']),
        User::factory()->create(['email' => 'user4@example.com', 'type' => 'sensitive']),
    ];

    // 执行待测命令
    $this->artisan('remove_data_command')->assertSuccessful();

    // 断言:仅 'sensitive' 类型用户的 email 被置为 null
    $emails = User::orderBy('id')->pluck('email')->toArray();

    $this->assertEquals([
        'user1@example.com',  // normal → 保留
        null,                 // sensitive → 清空
        'user3@example.com',  // normal → 保留
        null,                 // sensitive → 清空
    ], $emails);
}

? 小贴士:

TemPolor
TemPolor

AI音乐生成器,一键创作免版税音乐

下载
  • 使用 orderBy('id') 或显式 ->get() + map() 确保结果顺序稳定,避免因数据库排序不确定性导致断言失败;
  • 若逻辑复杂(如软删除、多表联动),可结合 assertDatabaseMissing() 或 assertDatabaseHas() 进行细粒度校验;
  • 避免在测试中调用 dd()、dump() 或 exit() —— 它们会中断测试流程,破坏自动化契约;
  • 如确需调试,可用 --debug 参数运行测试,或临时启用 Log::info() 记录中间状态(但上线前务必移除)。

总结:Laravel 测试不是“演示脚本”,而是可执行的文档与质量契约。放弃依赖 phpMyAdmin 的手动验证,转而用清晰、可读、可维护的断言覆盖业务规则,才能真正实现测试的长期价值与工程可靠性。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

316

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

270

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

367

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

366

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

66

2025.08.05

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

73

2025.09.05

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号