我有一个网站,在将开发代码投入生产之前,我需要进行一些单元测试。
我正在考虑编写一些单元测试,而不是使用实际的MySQL数据库将假数据库数据发送回单元测试。
但是,我希望测试MySQL数据库保持相对静态。也就是说,在页面加载完成后,我希望MySQL数据库撤消任何修改数据的查询,例如INSERT
,UPDATE
等。这样数据库就会重置为旧数据并为下一次测试做好准备。
答案 0 :(得分:1)
通过将数据库转储到文件来创建快照。
mysqldump yourDB > yourDB.sql
然后运行测试并恢复到快照:
mysql < yourDB.sql
答案 1 :(得分:1)
正如@Barmar所提到的,您可以在每次测试运行后重新加载数据。这可行,但根据数据的大小,运行mysqldump并恢复转储文件可能需要很长时间。
您可以努力为测试创建尽可能小的数据集,以减少时间。
您还可以努力组织单元测试,以最大限度地减少还原数据所需的次数。我的意思是对你的测试进行分组,这样他们即使在对数据进行了更改之后也可以继续测试数据库,直到他们真正需要要还原的数据,然后再进行恢复,然后转到下一组测试。通过仔细订购测试,您不必在每次测试后都恢复。
还有一些其他策略:
使用物理备份而不是mysqldump备份。使用Percona XtraBackup创建备份,然后恢复,关闭mysqld,rsync
数据库上的备份文件,chown -R mysql:mysql
文件,然后启动mysqld。不幸的是,这需要关闭并重新启动mysqld。
使用InnoDB transportable tablespaces。如果使用特殊选项对数据库进行物理备份以使表空间可传输,则可以使用几个ALTER TABLE命令并按表替换每个文件表。请参阅文档。遗憾的是,我不知道有任何社区工具可以为模式中的所有表执行此操作,您必须编写一个脚本来自行完成此操作。
使用Percona feature for "fake changes."我从未尝试过这个用于单元测试环境,但我认为这是可能的。它真的意味着帮助在副本上填充缓冲池。这个想法是任何像INSERT,UPDATE,DELETE这样的DML都将变成无操作。这需要使用Percona Server。并且它可能无法满足您的测试需求,因为当然,您的测试所做的任何更改应该来进行更改。
LVM snapshots.这可能是您的最佳选择。在开始测试之前,加载测试数据,并在此时获取文件系统快照。然后在每次测试运行后,将文件系统还原为快照。这需要您每次还原时关闭mysqld。但无论数据库的大小如何,执行快照和恢复都非常简单快捷。我已经看到这种方法用于快速恢复数TB的数据库。
答案 2 :(得分:-1)
您可以手动处理事务,但这取决于您的特定用途。但是想法是使用事务,然后回滚其中完成的所有更改(包括所有更新和插入),而不是提交。