我正在开发一个有很多单元测试的网站,每个网站都需要数据库处于某种“默认”状态。知道我正在使用每个测试销毁数据库并使用SQL脚本加载默认状态。而且速度很慢。所以我认为如果我可以保存默认状态并在每次测试开始时将数据库恢复到它,那将会很有用。 这可能吗 ?如果没有,我为什么要加快这个过程呢?知道我删除整个数据库并重新创建它。如果我只删除行不会提高性能吗?
答案 0 :(得分:3)
您可以在所有测试之前将数据库设置为默认状态,然后将每个测试包装在事务中。测试完成后,您只需回滚事务。
当您希望同时运行测试时,此方法尤其适合,因为它们不依赖于任何共享状态。
但是有些用例不合适。例如,当有多个进程访问测试场景中涉及的数据库时,这是集成测试中的常见情况。
此类情况的真实示例:测试运行器(进程#1)在数据库中设置数据,在后台运行的phantomjs向app服务器发出请求(进程#2)。您不能同时测试运行器和应用服务器共享单个数据库事务。
答案 1 :(得分:0)
你可以把你现任的桌子隐藏在临时桌子后面:
CREATE TEMPORARY TABLE foo
PRIMARY KEY (a),
UNIQUE KEY (b),
FOREIGN KEY (c) REFERENCES bar (c)
SELECT a, b, c FROM foo
一旦连接断开,临时表将被丢弃(因此只留下原始的,未受影响的表)。
使用dependency-injection模拟数据库,连接到测试数据库,或以其他方式执行任何必要的初始化(例如创建上述临时表)。