用于测试环境的MySQL。有没有办法冻结数据库?
我有一个网站,在我将开发代码投入生产之前,我需要做一些单元测试 我正在考虑编写一些单元测试,但不是使用一个实际的MySQL数据库将虚假的数据库数据发送回单元测试 但是,我希望测试MySQL数据库保持相对静态。也就是说,在页面加载完成后,我希望MySQL数据库撤消任何修改数据的查询,例如用于测试环境的MySQL。有没有办法冻结数据库?,mysql,database,unit-testing,testing,Mysql,Database,Unit Testing,Testing,我有一个网站,在我将开发代码投入生产之前,我需要做一些单元测试 我正在考虑编写一些单元测试,但不是使用一个实际的MySQL数据库将虚假的数据库数据发送回单元测试 但是,我希望测试MySQL数据库保持相对静态。也就是说,在页面加载完成后,我希望MySQL数据库撤消任何修改数据的查询,例如插入,更新,等等。这样,数据库将重置为其旧数据,并为下一次测试做好准备 有没有一个简单的方法来实现这个想法?还是我应该采取另一种方法 测试严重依赖MySQL查询的网站时,有哪些常见的行业实践 通过将数据库转储到文
插入
,更新
,等等。这样,数据库将重置为其旧数据,并为下一次测试做好准备
- 有没有一个简单的方法来实现这个想法?还是我应该采取另一种方法
- 测试严重依赖MySQL查询的网站时,有哪些常见的行业实践
mysqldump yourDB > yourDB.sql
然后运行测试并还原到快照:
mysql < yourDB.sql
mysql
正如@Barmar提到的,您可以在每次测试运行后重新加载数据。这是可行的,但取决于数据的大小,运行mysqldump和恢复转储文件可能需要太长时间
您可以努力为测试创建尽可能小的数据集,以减少时间
您还可以努力组织单元测试,以尽量减少恢复数据所需的次数。我的意思是对您的测试进行分组,这样即使在对数据进行了更改之后,他们也可以继续测试数据库,直到他们确实需要恢复数据,然后进行恢复,并继续进行下一组测试。通过仔细排序测试,您不必在每次测试后都进行恢复
还有一些其他策略:
- 使用物理备份而不是mysqldump备份。使用创建备份,然后恢复,关闭mysqld,
通过datadir备份文件,rsync
文件,然后启动mysqld。不幸的是,这需要关闭并重新启动mysqldchown-R mysql:mysql
- 使用。如果使用一个特殊选项对数据库进行物理备份以使表空间可传输,那么可以使用两个ALTER TABLE命令并逐个表替换每个文件表。请参阅文档。不幸的是,我不知道有任何社区工具可以对模式中的所有表执行此操作,您必须自己编写一个脚本
- 使用我从未在单元测试环境中尝试过的方法,但我认为这是可能的。它实际上是为了帮助在复制副本上初始化缓冲池。其想法是,任何DML(如插入、更新、删除)都将成为禁止操作。这需要使用Percona服务器。它可能无法满足您的测试需要,因为您的测试应该编写的任何更改都不会产生任何更改
- 这可能是你最好的选择。在开始测试之前,加载测试数据,并在此时拍摄文件系统快照。然后在每次测试运行之后,将文件系统恢复到快照。这要求您在每次恢复时关闭mysqld。但是,无论数据库大小如何,执行快照和恢复都非常简单和快速。我见过这种方法用于快速恢复多TB数据库
UPDATE
和INSERT
查询,并在测试结束时撤销它们。但我希望有一个更简单的解决方案。这在通用的方式下确实很难做到。例如,如果UPDATE
处于复杂的连接中,则很难确定更新了哪些行。如果您有DELETE
查询,则需要保存旧内容,以便恢复它们。您的测试框架可能会比应用程序更复杂,您需要对测试进行单元测试。也许我可以为每个更新
、插入
和删除
?然后计算事务数,并在测试结束时将其回滚?谢谢您的回答!