我经常进行单元测试(主要是PHP/Mysql),但用于创建数据库的SQL脚本运行速度太慢,因此我浪费了很多时间。我无法总是模拟数据库(旧代码,处理过于复杂),那么我该怎么办呢?直接复制Mysql文件中的数据吗?以其他方式加载我的数据库?
加载大量数据很快,只有CREATE TABLES的速度较慢。
加载大量数据很快,只有CREATE TABLES的速度较慢。
阅读另一个问题给我答案:将我的测试数据库移动到内存中。在Debian / Ubuntu(我的情况下),我只需将我的测试DB目录移动到/ dev / shm,创建一个链接来将旧目录链接到新目录,重新启动mysql服务器,tada!
一个需要运行140秒的套件现在只需要10秒钟就能运行。如此显而易见!该项目在测试期间经常使用数据库。 另一个项目使用磁盘上的数据库运行18/20秒,并不会因为使用内存中的数据库而更快,但它有比另一个项目更多的单元测试,并且需要创建的集成测试表更少。
您可以使用MySQL的MEMORY引擎。
它比innoDB快得多,虽然不支持所有功能(例如外键),但对于测试非常有用。
假设您有一个脚本来从头开始设置您的数据库(例如在初始化测试时运行),您只需将InnoDB的引擎定义替换为MEMORY即可。
您甚至可以将引擎设置为测试套件的参数,以便每次保存/提交时都可以运行快速的MEMORY版本,在发布之前使用更长但更稳健的InnoDB版本。
与此处的其他建议相比:
您可以使用初始化(测试)数据库。这样,您只需要:
这样做时,您需要维护一个数据库迁移脚本,以便在模式更改时更新测试数据库,但是您可能已经在使用当前方法进行此操作了,并且在推出软件的新版本时无论如何都需要执行此操作。
像这样做仍然会相当慢,但比为每个测试运行所有DDL脚本要快得多。如果可能,请编写单元测试,而不是集成测试,但是考虑到系统的状态(遗留),您已经说过这很困难。
我曾经遇到过类似的情况。我创建了一个仅用于测试的玩具数据库。 这个数据库只有很少的记录。
我会: