验收测试 - 基础 - 自动恢复测试数据 ¶
作者:KK
发表日期:2016.7.28
测试过程中可能会产生一些数据,比如
测试添加一个用户,这样数据库里就会多一个用户了,平均每天运行约5次添加用户的测试的话,则100天后数据库就会多出500个用户了。。。其它数据也是这样滚雪球一样累加
测试抽奖,于是大奖可能被抽到了,下次再测试就没有了大奖可抽
测试禁用功能,数据status被标记为禁用后,下次再测试禁用就会update影响行数为0了
测试删除指定数据,下次再测试又找不到这条数据删除了
所以大家迟早都会慢慢地遇到这些需要重复测试的数据支持功能
我以前不会弄的时候真的好笨,添加的用户在after方法里执行删除,抽过的奖也重新标记为未抽奖。。。
这样就写了好多数据恢复代码,真是累觉不爱!想想感觉自己也有点强大,整个项目下来N多测试,就这些数据撤回的代码居然都全给写下了测试代码,把一个个测试场景的数据恢复了
发现有捷径 ¶
怪我以前没不够认真看Db模块的教程啊,原来它可以支持快速恢复数据!
还记得在phpmyadmin
导出的.sql
文件,以及mysqldump
命令导出的文件吗?里面其实就是一句句SQL语句是吧,导入时,就是执行了这些语句,然后就往数据库里重新建立了整个数据库
其实Codeception的原理也是一样,实现步骤是这样的:
我们先导出一个
.sql
文件,然后放在tests/_data目录下命名为dump.sql
,在测试项目的根目录的
codeception.y2ml
配置Db
模块里面除了配置dsn、username、password这些选项满足连接数据库以外,还有一个叫
dump
的配置选项,它要求提供一个测试项目的相对文件路径,这个文件就是我上面讲的数据库导出文件,一般后缀我们都命名为.sql新建空的数据库,比如dsn里配置的数据库名称叫
shop
的话,那你就要在数据库服务器上先准备一个空的shop数据库在需要测试的测试类型配置文件中开启Db模块,比如要在单元测试中使用自动恢复数据功能,就要在
unit.suite.y2ml
里开启Db模块了,记得build一下
然后每次运行测试的时(不论是单元测试还是验收测试),Codeception都会将这个dump.sql作为数据库镜像导入到dsn所指的数据库中,于是测试代码就可以基于全新的数据进行测试了
运行完测试后你可以发觉shop数据库已经不是一个空数据库,而是有表有数据的,正好就是dump.sql里的东西
下次再测试时,它又重新导入一次,就算shop已经有了数据,Codeception也会先清空这些数据,再将dump.sql导入
注意点:dump.sql里的建表语句必须有IF NOT EXISTS
判断,就以phpmyadmin导出的数据库文件为准,这是直接可以用来做dump.sql的,如果没有的话会导致第二次运行时无法覆盖已有数据,具体细节感兴趣的话请看Codeception源码