【问题标题】:Unit testing SQL scripts单元测试 SQL 脚本
【发布时间】:2019-08-06 13:54:31
【问题描述】:

对于下面用.sql文件编写的脚本:

if not exists (select * from sys.tables where name='abc_form')
    CREATE TABLE abc_forms (
        x BIGINT IDENTITY, 
        y VARCHAR(60), 
        PRIMARY KEY (x)
    )

以上脚本的表名有错误。

对于 Java/C 等编程语言,编译器可帮助解析大部分名称解析

对于任何 SQL 脚本,应该如何进行单元测试?静态分析...

【问题讨论】:

  • 尝试去掉末尾的“]”
  • @justinmontalban 我对这个不好
  • 编写一些批处理脚本以通过 sql plus 命令行运行它,并将任何 ORA 错误通过管道输出到您可以手动或自动查看的输出。
  • @SamM 在 Sonar 中使用 XPATH 或 Java 添加规则以执行静态代码分析怎么样?避免手动代码(脚本)审查
  • @overexchange 我不熟悉这项技术。你的脚本都是纯 sql 还是 pl/sql?

标签: database unit-testing tsql sonarqube


【解决方案1】:

15 年前,我通过大量脚本编写了您要求的类似操作。但是我们有特殊的语句格式。

我们有三种不同类型的文件:

  • 一个 SQL 文件来设置完整数据库架构的最新版本
  • 一个文件,所有更改都适用于旧数据库架构(自定义格式,如版本;SQL)
  • 代码在数据库上使用的 SQL 语句的一个文件(自定义格式,如 statementnumber;statement)

要求每条语句都在一行,以便可以用 awk 提取!

1) 起初我通过执行 from 语句并将错误记录到文件中来设置最新版本的数据库。

2) 其次,我对所有更改都做了同样的操作,以拥有第二个架构

3) 我比较了两个数据库模式以发现任何差异

4)我在完整的最新架构中填写了一些虚拟测试值进行测试

5) 最后但并非最不重要的一点是,我使用测试数据针对最新模式执行了每个 SQL 语句,并再次记录了每个错误。

最后,整个事情每天晚上都在运行,没有一个早上没有新的错误,这是 20 位开发人员中的一位在版本控制中投入的。但它为我们在下一次安装新客户时节省了很多时间。

【讨论】:

    【解决方案2】:

    您也可以从您的代码中生成 SQL 脚本。

    代码优先避免了这类问题。在代码优先或数据库优先之间进行选择通常取决于您的主要关注点是数据还是应用程序。

    【讨论】:

    • 如何生成 SQL 脚本来解决这个问题?通过编写单元测试用例?
    猜你喜欢
    • 2010-11-23
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多