3

我正在一个有很多单元测试的网站上工作,每个测试都需要数据库处于某种“默认”状态。没错,我在每次测试时都在破坏数据库,并使用 SQL 脚本加载默认状态。而且速度很慢。因此,我认为如果我可以保存该默认状态并在每次测试开始时将数据库恢复到该状态,将会很有用。这可能吗 ?如果没有,我为什么要加快进程?知道我删除了整个数据库并重新创建它。如果我只删除行不会提高性能?

4

2 回答 2

3

您可以在所有测试之前将数据库设置为默认状态,然后将每个测试包装在事务中。测试完成后,您只需回滚事务。

当您希望同时运行测试时,这种方法特别适用,因为它们不依赖于任何共享状态。

但是,有些用例不适合。例如,当测试场景中涉及多个进程访问数据库时,这是集成测试中的常见情况。

这种情况的真实示例:测试运行程序(进程#1)在数据库中设置数据,并且在后台运行的 phantomjs 向应用服务器(进程#2)发出请求。您不能同时测试运行程序和应用程序服务器共享单个数据库事务。

于 2012-07-24T09:16:23.930 回答
1
  1. 您可以将现有表隐藏在临时表后面:

    CREATE TEMPORARY TABLE foo
    PRIMARY KEY (a),
    UNIQUE  KEY (b),
    FOREIGN KEY (c) REFERENCES bar (c)
    SELECT a, b, c FROM foo
    

    一旦连接断开,临时表将被丢弃(因此只留下原始的、未受影响的表)。

  2. 使用依赖注入来模拟数据库、连接到测试数据库或执行任何必要的初始化(例如创建上述临时表)。

于 2012-07-24T09:15:35.670 回答