代码之家  ›  专栏  ›  技术社区  ›  Amber

如何在表中查找相对于初始SQL fixture的更改?

  •  8
  • Amber  · 技术社区  · 14 年前

    我有许多测试是针对一个MySQL数据库运行的,该数据库预先加载了一组SQL文件中的模式和示例数据。其中一些测试在运行期间也会在数据库中创建新数据。

    通常,测试负责在自己完成之后进行清理(因此不会污染其他测试的数据库环境)。然而,这些测试中的一些似乎没有完全做到这一点,因此留下了不应该留下的额外/修改的记录。

    由于正在测试的代码集很复杂,所以在整个测试中运行一个事务是不可行的,所以我不能让MySQL回滚所有内容(涉及多个游标和多个复制的DB服务器,以及其他因素)。

    我想有一种更容易识别这些污染数据库的测试的方法,但是因为它 允许测试写入数据库(只要随后删除内容),我不能只查看对数据库的所有更改-我只需要 有效的 更改,删除取消修改。

    一种想法是,如果有一种简单的方法可以将一个表的内容与另一个表的内容进行比较,那么我可以在运行每个测试后进行比较,将用fixture初始化的表的内容与测试后的表的内容进行比较。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Amber    14 年前

    到目前为止,我通过其他渠道得到了一些不同的建议:

    • CHECKSUM TABLE -除了它只适用于myisam表(我们使用innodb),这几乎完全符合我的需要。

    • SHOW TABLE STATUS -这提供了 Data_length 这可能是一个简单的比较。如果我找不到更好的,这就足够了。

        2
  •  1
  •   Jeff Day    14 年前

    在测试之前,您可以复制所有表(即创建表tmptabale select*from tablea),然后在测试之后针对这些表进行联接,以查看使用该语句的新行。

    SELECT a.*
    FROM tableA a
    LEFT JOIN tmpTableA as tmp on tmp.id=a.id
    WHERE tmp.id IS NULL
    

    您还可以在测试之前、测试之后对表进行转储,然后对两个转储进行diff。