2015-06-16 39 views
0

运行我们的验收测试套件时,我们希望对定义的数据库状态执行每一次测试。如果其中一个测试会写入数据库(比如创建用户或其他东西),它当然不会影响以后的测试。快速复制大型MySQL数据库进行测试

我们已经考虑过几个选择来实现这个目标,但是在每个单独的测试之前复制整个数据库似乎并不是最好的解决方案(考虑可能的性能问题)。

还有一个想法是使用MySQL事务,但是我们的一些测试会导致很多HTTP请求,因此会产生不同的PHP进程,并且在完成完整测试后,它们会过早丢失事务以进行干净回滚。

是否有更好的方法来保证每个验收测试的定义数据库状态?我们希望保持简单,比解决方案如aufsbtrfs在系统级解决它。

+2

关闭mysql,物理复制db文件,重启mysql。稍后,冲洗,重复。 –

+0

技术上不是最有吸引力的解决方案,因为我们必须在每个测试用例中的每种测试方法之后执行此操作,但也许这是必要的!?感谢您的输入! – Johannes

回答

0

您可以使用PhpUnit来解决这个问题。

它用于PHP的自动化测试。不是唯一的图书馆,而是最广泛的图书馆之一。

您也可以在数据库测试中使用它(https://phpunit.de/manual/current/en/database.html)。基本上,它可以让你完成你正在寻找的东西。最初导入整个数据库,然后在每个测试套件中加载所需的数据,然后恢复到以前的状态。例如,您可以暂时保存表A的当前状态,并在完成套件的所有测试后,将其恢复。而不是重新加载整个数据库。

顺便说一句,拥有一个最小的数据库只有测试所需的信息也会有很大的帮助。在这种情况下,您不必处理大的性能问题,您可以在每个测试套件之后简单地恢复它。

+0

我明白你的观点,我们实际上已经在使用PHPUnit进行单元测试。对于验收测试,灯具和最小数据库似乎没有那么有用。我们宁愿对(几乎)真实的数据采取行动,只需在测试时永久写入数据库来编辑它们即可。可复制性是我们在这里的关键需求...... – Johannes

+0

然后,如果您不能使用最小数据库(尽管您应该能够重现表中所有可能的情况),那么请查看我写的关于将数据库部分恢复到以前状态的内容。 根据情况恢复一个或两个表可能是可行的。显然,如果你有一个巨大的桌子,你必须等待。我现在看不到另一个解决方案。 –

+0

如何最好地恢复MySQL中以前的DB状态? – Johannes