验收测试 - 基础 - 自动恢复测试数据

  • 作者:KK

  • 发表日期:2016.7.28


测试过程中可能会产生一些数据,比如

  • 测试添加一个用户,这样数据库里就会多一个用户了,平均每天运行约5次添加用户的测试的话,则100天后数据库就会多出500个用户了。。。其它数据也是这样滚雪球一样累加

  • 测试抽奖,于是大奖可能被抽到了,下次再测试就没有了大奖可抽

  • 测试禁用功能,数据status被标记为禁用后,下次再测试禁用就会update影响行数为0了

  • 测试删除指定数据,下次再测试又找不到这条数据删除了


所以大家迟早都会慢慢地遇到这些需要重复测试的数据支持功能

我以前不会弄的时候真的好笨,添加的用户在after方法里执行删除,抽过的奖也重新标记为未抽奖。。。

这样就写了好多数据恢复代码,真是累觉不爱!想想感觉自己也有点强大,整个项目下来N多测试,就这些数据撤回的代码居然都全给写下了测试代码,把一个个测试场景的数据恢复了


发现有捷径

怪我以前没不够认真看Db模块的教程啊,原来它可以支持快速恢复数据!

还记得在phpmyadmin导出的.sql文件,以及mysqldump命令导出的文件吗?里面其实就是一句句SQL语句是吧,导入时,就是执行了这些语句,然后就往数据库里重新建立了整个数据库

其实Codeception的原理也是一样,实现步骤是这样的:

  1. 我们先导出一个.sql文件,然后放在tests/_data目录下命名为dump.sql

  2. 在测试项目的根目录的codeception.y2ml配置Db模块

    里面除了配置dsn、username、password这些选项满足连接数据库以外,还有一个叫dump的配置选项,它要求提供一个测试项目的相对文件路径,这个文件就是我上面讲的数据库导出文件,一般后缀我们都命名为.sql

  3. 新建空的数据库,比如dsn里配置的数据库名称叫shop的话,那你就要在数据库服务器上先准备一个空的shop数据库

  4. 在需要测试的测试类型配置文件中开启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源码