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