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

时间:2010-09-17 18:28:47

标签: mysql database testing fixtures

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

通常,测试负责自行清理(因此不会污染数据库环境以进行其他测试)。但是,似乎有些测试没有完全这样做,因而留下了他们不应该做的额外/修改记录。

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

我希望有一种方法可以更轻松地识别这些污染数据库的测试,但因为 允许测试写入数据库(只要它们之后删除了东西) ),我不能只看到数据库的所有更改 - 我只需要有效的更改,删除了取消修改。

我有一个想法是,如果有一种简单的方法来比较一个表的内容与另一个表的内容,我可以在运行每个测试之后这样做,将使用fixture初始化的表的内容与表的内容进行比较经过测试。

2 个答案:

答案 0 :(得分:1)

到目前为止,我已经通过其他渠道获得了一些建议:

  • CHECKSUM TABLE - 这对我的需求几乎是完美的,除了它只适用于MyISAM表(我们使用InnoDB)。

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

答案 1 :(得分:1)

在测试之前,您可以复制所有表(即CREATE TABLE tmpTableA SELECT * FROM tableA),然后在测试之后加入它们以查看使用该语句的新行

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

您也可以在测试之前转储表,然后在测试之后,然后在两个转储上执行diff。