完整的数据库模式转换 - 如何测试重写的查询?

时间:2011-07-21 14:23:26

标签: sql database-migration database-testing

我们的数据库设计很差(我们继承了它)。我已经将模式重新设计为可用且可维护的东西。删除了相当多的表和列,许多列已移动,大多数表和列已重命名。某些数据类型也已更改。

我已经从我们的webapps中提取了所有查询,并且我们已经开始重写它们。我们认为,我们的DBA能够将旧数据迁移到新模式。为了确保我们需要通过将旧结果与新结果进行比较来测试每个查询。

我们如何测试这样的批量迁移?我需要能够指定参数,并将旧表/列映射到新表/列。有数百个查询,这是一项艰巨的任务。我自己可以写点东西,但我已经对我的时间有很多要求,所以最好使用现有的工具。

谢谢!

3 个答案:

答案 0 :(得分:1)

我必须这样做......而且这很简单,因为我重写了整个应用程序;)

许多查询听起来像基本操作,例如选择,插入,更新都没有在函数中抽象出来 - 也许这有助于在调整之前清理混乱。

现在进行测试:

你需要一个测试脚本 a)运行所有查询 b)存储所有选择的输出以进行比较

  1. 备份您的测试db @ state 0,清除常规查询日志

  2. 使用所有删除,选择和更新

  3. 来播放您的应用程序
  4. 复制粘贴该日志,取每一个选择并在其前面加上“Create table temptable_xyz”(当然还有SELECT到temptable_xyz ..取决于可用的语法)

  5. 在两个数据库上运行,测试db @ state 0并在迁移脚本后测试db @ state 0

  6. 比较

  7. 如果你能确保使用每个应用程序中的每个功能,就应该这样做。

    GL - 没有什么能比现有的东西更好;)

答案 1 :(得分:0)

有时简单的解决方案可以胜任。

如果它只是SELECT,您可以将新旧查询放在文本文件中,使用脚本运行它们并对输出进行差异化。

cd newqueries
for queryfile in *; do
    psql -f $queryfile migrateddb > /tmp/newresult
    psql -f ../oldqueries/$queryfile olddb > /tmp/oldresult

    if ! diff /tmp/oldresult /tmp/newresult; then
        echo "Difference in $queryfile"
        exit 1
    fi
done

或者您可以编写基于单元测试的结果比较

答案 2 :(得分:0)

这将是我的方法:

  1. 恢复包含数据的测试数据库,运行所有已知查询。
  2. 恢复另一个测试数据库,运行所有新查询。
  3. 创建一个连接每个数据库表的sql脚本并比较结果。这可以在information_schema或其他系统表(取决于供应商)之外完成。

    插入临时表 select(从db1..name中选择count(1))      ,(从db2..name中选择count(1))      ,(从t1.col1 = t2.col1和t1.colx = t2.colx中的db1.name t1 join db2.name t2中选择count(1))      ,tablename

  4. 然后,您可以运行查询中包含表名的查询。它会给你从哪里开始看。