商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Laravel怎样在单元测试中禁用事务回滚_Laravel测试中关闭自动事务方法【测试】

Laravel怎样在单元测试中禁用事务回滚_Laravel测试中关闭自动事务方法【测试】

  发布于2026-07-19 阅读(0)

扫一扫,手机访问

Lara vel 单元测试中,数据库操作老是被自动回滚,这事儿其实挺常见的。根本原因呢,就是框架默认给每个测试方法都套了个事务,跑完就回滚,搞得你根本没法验证数据到底写没写进去。那怎么关掉这个自动回滚呢?下面这几种方法,应该能解决你的问题。

Lara vel怎样在单元测试中禁用事务回滚_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 的 节点里加上 ,然后在 TestCase 里读取这个变量并动态设置:if (getenv('DB_DISABLE_TRANSACTIONS')) { $this->usesTransactions = false; }。注意拼写别出错,环境变量配置能被正确加载就行。

本文转载于:https://www.php.cn/faq/2313299.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注