Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于测试环境的MySQL。有没有办法冻结数据库?_Mysql_Database_Unit Testing_Testing - Fatal编程技术网

用于测试环境的MySQL。有没有办法冻结数据库?

用于测试环境的MySQL。有没有办法冻结数据库?,mysql,database,unit-testing,testing,Mysql,Database,Unit Testing,Testing,我有一个网站,在我将开发代码投入生产之前,我需要做一些单元测试 我正在考虑编写一些单元测试,但不是使用一个实际的MySQL数据库将虚假的数据库数据发送回单元测试 但是,我希望测试MySQL数据库保持相对静态。也就是说,在页面加载完成后,我希望MySQL数据库撤消任何修改数据的查询,例如插入,更新,等等。这样,数据库将重置为其旧数据,并为下一次测试做好准备 有没有一个简单的方法来实现这个想法?还是我应该采取另一种方法 测试严重依赖MySQL查询的网站时,有哪些常见的行业实践 通过将数据库转储到文

我有一个网站,在我将开发代码投入生产之前,我需要做一些单元测试

我正在考虑编写一些单元测试,但不是使用一个实际的MySQL数据库将虚假的数据库数据发送回单元测试

但是,我希望测试MySQL数据库保持相对静态。也就是说,在页面加载完成后,我希望MySQL数据库撤消任何修改数据的查询,例如
插入
更新
,等等。这样,数据库将重置为其旧数据,并为下一次测试做好准备

  • 有没有一个简单的方法来实现这个想法?还是我应该采取另一种方法
  • 测试严重依赖MySQL查询的网站时,有哪些常见的行业实践

通过将数据库转储到文件来创建快照

mysqldump yourDB > yourDB.sql
然后运行测试并还原到快照:

mysql < yourDB.sql
mysql
正如@Barmar提到的,您可以在每次测试运行后重新加载数据。这是可行的,但取决于数据的大小,运行mysqldump和恢复转储文件可能需要太长时间

您可以努力为测试创建尽可能小的数据集,以减少时间

您还可以努力组织单元测试,以尽量减少恢复数据所需的次数。我的意思是对您的测试进行分组,这样即使在对数据进行了更改之后,他们也可以继续测试数据库,直到他们确实需要恢复数据,然后进行恢复,并继续进行下一组测试。通过仔细排序测试,您不必在每次测试后都进行恢复

还有一些其他策略:

  • 使用物理备份而不是mysqldump备份。使用创建备份,然后恢复,关闭mysqld,
    rsync
    通过datadir备份文件,
    chown-R mysql:mysql
    文件,然后启动mysqld。不幸的是,这需要关闭并重新启动mysqld

  • 使用。如果使用一个特殊选项对数据库进行物理备份以使表空间可传输,那么可以使用两个ALTER TABLE命令并逐个表替换每个文件表。请参阅文档。不幸的是,我不知道有任何社区工具可以对模式中的所有表执行此操作,您必须自己编写一个脚本

  • 使用我从未在单元测试环境中尝试过的方法,但我认为这是可能的。它实际上是为了帮助在复制副本上初始化缓冲池。其想法是,任何DML(如插入、更新、删除)都将成为禁止操作。这需要使用Percona服务器。它可能无法满足您的测试需要,因为您的测试应该编写的任何更改都不会产生任何更改

  • 这可能是你最好的选择。在开始测试之前,加载测试数据,并在此时拍摄文件系统快照。然后在每次测试运行之后,将文件系统恢复到快照。这要求您在每次恢复时关闭mysqld。但是,无论数据库大小如何,执行快照和恢复都非常简单和快速。我见过这种方法用于快速恢复多TB数据库


我希望在每次测试之间重置数据库。我还希望以一种非处理器密集型的方式,即不转储和恢复。我想如果必须的话,我可以创建一个类来跟踪
UPDATE
INSERT
查询,并在测试结束时撤销它们。但我希望有一个更简单的解决方案。这在通用的方式下确实很难做到。例如,如果
UPDATE
处于复杂的连接中,则很难确定更新了哪些行。如果您有
DELETE
查询,则需要保存旧内容,以便恢复它们。您的测试框架可能会比应用程序更复杂,您需要对测试进行单元测试。也许我可以为每个
更新
插入
删除
?然后计算事务数,并在测试结束时将其回滚?谢谢您的回答!