Laravel怎样在单元测试中禁用事务回滚_Laravel测试中关闭自动事务方法【测试】
Lara vel 单元测试中,数据库操作老是被自动回滚,这事儿其实挺常见的。根本原因呢,就是框架默认给每个测试方法都套了个事务,跑完就回滚,搞得你根本没法验证数据到底写没写进去。那怎么关掉这个自动回滚呢?下面这几种方法,应该能解决你的问题。 先说几个核心判断:如果你需要验证INSERT、UPDATE
Lara vel 单元测试中,数据库操作老是被自动回滚,这事儿其实挺常见的。根本原因呢,就是框架默认给每个测试方法都套了个事务,跑完就回滚,搞得你根本没法验证数据到底写没写进去。那怎么关掉这个自动回滚呢?下面这几种方法,应该能解决你的问题。

先说几个核心判断:如果你需要验证INSERT、UPDATE或者外键约束的实际效果,那事务回滚就必须关掉。具体怎么关,取决于你想控制的范围。
一、在测试类中设置 $usesTransactions = false
这是最直接的方法,直接关闭当前测试类里所有测试方法的事务包装,让数据库变更真实持久化。你只需要在测试类最顶部声明 protected $usesTransactions = false; 这就够了。当然,前提是测试类得继承自 Tests\TestCase 或其子类。这样一来,该类下所有 test* 方法运行的时候,都不会被事务包裹。
二、重写 setUp() 方法并手动禁用数据库事务
这种方法更精细,不会影响其他测试类的行为。你可以在测试类里重写 setUp() 方法,调用 $this->disableDatabaseTransactions();。需要注意的是,如果当前测试类已经用了 use DatabaseTransactions; trait,那得先把它注释掉或者移除,不然会有冲突。
三、使用 DatabaseMigrations 替代 DatabaseTransactions
如果你需要观察多次写入的累积状态,比如测试一个操作后数据递增了多少,那更推荐用 use RefreshDatabase;(Lara vel 8+ 推荐)或者 use DatabaseMigrations;(旧版本兼容)。这个方法会在每个测试前执行 migrate:fresh,但之后不回滚,数据会一直保留到测试结束。当然,别忘了确保测试数据库独立于开发/生产环境,避免污染。
四、在特定测试方法中临时关闭事务
如果只有个别测试需要绕过事务机制,那直接在方法内部操作就行。在测试方法开头调用 \DB::disableQueryLog();,然后手动关闭事务监听器:\Illuminate\Foundation\Testing\DatabaseTransactions::disable();。不过,操作完之后,如果你想恢复事务行为,需要在 tearDown() 里显式调用 enable 方法——但说实话,不太推荐这种混用,容易留坑。
五、修改 phpunit.xml 中的环境变量强制覆盖
如果你在CI环境里跑测试,需要统一控制,那这种方法最适合。在 phpunit.xml 的
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。
Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,













