为什么新版文档中,数据库测试章节,使用 RefreshDatabase 重置数据库?

在前些日子的文档中

在使用laravel进行数据库测试的时候,在原本的文档中有两种重置数据库的方式:

使用迁移 use DatabaseMigrations;
使用事务 use DatabaseTransactions;

在今天的文档中

无论是官方文档

还是laravel-china翻译的文档

文档中提到的重置数据库的方式都是推荐使用 use RefreshDatabase;

实际测试

使用迁移重置数据库的时候,会清除掉数据库中原本的数据。在一些关于数据库相关的操作中,比如添加文章,那么添加后的文章id一定是固定的(因为是基于空数据库嘛)。但是使用迁移重置数据库的过程中速度比较慢。在我的测试中我的添加用户方法要接近5s

使用事务重置数据库的过程中,会遇到事务导致的一些问题:

比如我添加文章的过程中,使用了事务,但是添加成功之后,我忘记commit数据了。那么实际上我程序实现的功能是“假装”把数据添加进数据库了,实际上执行完这步操作之后,数据库并没有文章数据。

但是因为使用事务进行测试的时候,因为laravel为我们提供的事务系统。所以我们在测试中检查添加的数据的时候,会检查到正确的数据(实际上程序是错误的)。

除了以上情况,在实际使用过程中,使用事务回滚数据的方法进行测试的话,实际上速度要更快一些。同样是我的添加用户的方法,使用事务回滚进行测试的话,只需要接近1s的时间。

提问

这次文档的修改是因为官方有什么顾虑吗?使用事务进行测试的话,会不会有什么坑?求分享。官方会移除使用事务回滚数据库的方法吗?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2
sanders

看了一下是一年前的帖子,我这两天也遇到相同的问题, RefreshDatabase 使用过程中会回滚上一个用例,但自增ID发生变动了,导致如果做接口功能测试没有返回新建数据的ID则结果无法预期。

4年前 评论
Epona

正常来说测试数据库是和其他数据库分开的。

4年前 评论
white_keroro (楼主) 4年前
sanders 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!