您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

调用最终用户测试

SQLScript 中最终用户测试框架的入口点是内置过程 SYS.SQLSCRIPT_RUN_TESTS_ON_ORIGINAL_DATA。 备注如过程名称所示,将对系统中的现有数据运行测试。在写入在系统中更改或删除对象或数据的测试时,您需要格外注意,因为其他人可能会受到这些更改的影响。测试本身也可能受到在同一系统上并行运行的其他测试的影响。

缺省情况下,用户没有内置过程 SYS.SQLSCRIPT_RUN_TESTS_ON_ORIGINAL_DATA 的 EXECUTE 特权。您需要获得授予此权限(例如,由 SYSTEM 用户授予)。

要在 SQLScript 测试框架中调用最终用户测试,必须执行以下 CALL 语句。

CALL SYS.SQLSCRIPT_RUN_TESTS_ON_ORIGINAL_DATA('', ?, ?, ?)

SYS.SQLSCRIPT_RUN_TESTS_ON_ORIGINAL_DATA 的第一个参数指定要执行的测试计划,必须以 JSON 格式提供。测试计划指定应运行哪些测试和哪些配置。它还包含有关测试框架要执行的测试库的信息。 备注通配符可用于指定 JSON 字符串中的值('*' 表示多个通配符,'?'仅针对一个通配符)。

CALL SYS.SQLSCRIPT_RUN_TESTS_ON_ORIGINAL_DATA('{"schema":"MY_SCHEMA","library":"*"}', ?, ?, ?)

CALL SYS.SQLSCRIPT_RUN_TESTS_ON_ORIGINAL_DATA('{"schema":"MY_SCHEMA","library":"LIB*TEST"}', ?, ?, ?)

CALL SYS.SQLSCRIPT_RUN_TESTS_ON_ORIGINAL_DATA('[{"schema":"MY_SCHEMA","library":"SOME_PREFIX_*"},{"schema":"OTHER_SCHEMA","library":"*_SOME_SUFFIX"}]', ?, ?, ?)

对 SYS.SQLSCRIPT_RUN_TESTS_ON_ORIGINAL_DATA 的第一次调用将在模式 MY_SCHEMA 中运行语言类型为 SQLSCRIPT TEST 的所有库的所有测试(分别在其所有配置中)。第二次调用会执行相同的操作,但会将过滤器应用于要执行的库。在此,测试框架将只执行名称以 'LIB' 开头且以 'TEST' 结尾的 SQLSCRIPT TEST 库。对于第三个调用,还将执行模式 OTHER_SCHEMA 中语言类型为 SQLSCRIPT TEST 的库,但其名称必须以 '_SOME_SUFFIX' 结尾。

以下描述了可在测试计划的 JSON 字符串中提供的内容的完整定义。

 ::=  || 

::= '[' [',' ] ']'

::= '{' ["schema":"' '",] "library":"' '"' [', "classifications":' ] [', "exclude-classifications":' ] [', "run":' ] '}'

::= '[' [',' ] ']'

::= '{' [','

::= [ '"tests":[' ']' || '"configurations":[' ']' || '"exclude-tests":[' ']' || '"exclude-configurations":[' ']' ]

::= '"' '"' [', "' '"']

::= letter_or_digit_or_asterisk+

备注 始终区分大小写。 示例: 示例代码[{ "schema":"MY_SCHEMA", "library":"*"},{ "library": "MY_LIB", "run": [{ "exclude-tests": ["A", "B"], "configurations": ["config1", "config3"] }, { "tests": ["A", "B"], "exclude-configurations": ["config2"] }]},{ "schema": "MY_SCHEMA", "library": "*", "run": [{ "tests": ["*TEST*KERNEL*"], "exclude-tests": ["DISABLED_*"], "exclude-configurations": ["*SCALE_OUT*"] }, { "configurations": ["*SINGLE_NODE*", "*SCALE_OUT*"], "exclude-configurations": ["*STRESS_TEST*"] }]}]

行为

  • 语法或语义无效会导致错误。

  • 未知属性产生警告。

  • 属性 library 是必需的,但其他属性有缺省值:如果未指定“模式”,将使用当前会话模式。如果未指定“运行”,则将选择所有配置和测试。这与 "run" 相同:[{ "tests": [ "*" ], "configurations": [ "*" ] }]。

  • 如果未指定“模式”,将使用当前会话模式。

  • 如果未指定“运行”,则将选择所有配置和测试。这与 "run" 相同:[{ "tests": [ "*" ], "configurations": [ "*" ] }]。

  • 当“测试”和“排除测试”完全匹配相同的值时,将抛出错误。这同样适用于“配置”和“排除配置”。

  • 当同时给出“排除测试”和“测试”时,“排除测试”将始终具有更高的优先级。这同样适用于“exclude-configurations”和“configurations”。

  • 如果库或配置不包含任何测试(在应用过滤器后),则不会执行此库或配置的设置或拆卸。

  • 如果输入与任何测试都不匹配,则将生成空的测试计划,并且不会抛出错误。此外,不会向输出表添加任何条目。

    备注 中的每个条目都将导致根据内部 条目的值将单独的测试和配置清单添加到测试计划中。这样,测试框架可能会重复执行同一库的一些测试和配置。

    分类和排除分类

    可以在多个级别指定分类,并且还需要在多个级别执行基于分类的过滤。

    对于排除分类,这意味着以下内容:

  • 如果库成员的分类指示符(通过 pragma 指定的分类)与 exclude-specification 中的模式匹配,则此成员及其包含的所有内容将不会执行。例如,如果 SetUpLibrary 与排除分类匹配,则不会执行此库中的任何内容。对于 config,这意味着不会在此 config 中执行测试。对于测试,仅表示不执行此测试。

  • 如果分类说明符与 exclude-specification 不匹配,则执行库、配置或测试。

    对于分类,这意味着以下内容:

  • 如果库成员的分类说明符与此成员及其包含的所有内容的规范中的模式匹配,则将执行该分类指示符,除非排除规范匹配。

  • 如果分类说明符与规范不匹配,将只执行与规范匹配的包含的成员。

  • 如果测试不匹配,则不会执行这些测试。

    考虑以下示例: 示例代码CREATE LIBRARY LIB_TEST LANGUAGE SQLSCRIPT TEST AS BEGIN@TestClassification('clas0') @TestSetUpLibrary() PUBLIC PROCEDURE SETUPLIB AS BEGIN END; @TestClassification('clas1') @TestSetUpConfig('A') PUBLIC PROCEDURE SETUPCONFIGA AS BEGIN END;@TestSetUpConfig('B')PUBLIC PROCEDURE SETUPCONFIGB AS BEGIN END;@TestClassification('clas2')PUBLIC PROCEDURE TESTA AS BEGIN END;PUBLIC PROCEDURE TESTB AS BEGIN END;END

    如果包括分类 'clas0',则将执行所有操作。如果包括分类 'clas1',则将执行配置 'A' 中的所有内容。如果包括分类 'clas2',则仅执行 'TESTA',但在两个配置('A' 和 'B' 中)。

    如果包括分类 'clas0' 并排除 'clas1',将仅执行配置 'B'(通过两个测试)。如果包括分类 'clas0' 并排除 'clas2',则仅执行 'TESTB',但在两个配置中 - 'A' 和 'B'。如果包括分类 'clas1' 并排除 'clas2',则仅执行配置 'A' 中的 'TESTB'。

    如果包括分类 'clas2' 并排除 'clas0',则不会执行任何操作。如果包括分类 'clas2' 并排除 'clas1',则仅执行 'TESTA' 且仅在配置 'B' 中执行。如果包括分类 'clas1' 并排除 'clas0',则不会执行任何操作。

    输出

    SYS.SQLSCRIPT_RUN_TESTS_ON_ORIGINAL_DATA 的三个输出参数具有以下表结构。

    结果

    列名称类型描述SCHEMA_NAMENVARCHAR(256)模式名称LIBRARY_NAMENVARCHAR(256)库名称CONFIGURATION_NAMENVARCHAR(256)配置名称TEST_NAMENVARCHAR(256)测试名称TEST_EXECUTION_IDBIGINT在详细信息输出表中查找的唯一标识符TEST_EXECUTION_TIMEBIGINT持续时间(微秒)TEST_EXECUTION_MEMORY_SIZEBIGINT测试执行期间使用的内存大小(请参阅M_ACTIVE_PROCEDURES)TEST_EXECUTION_RESULT_STATEVARCHAR(16)测试结果通过 | 失败 | 错误 | 已跳过 | 已取消TEST_COMMENTSNVARCHAR(5000)为测试库中的相应成员定义的用户定义注释 

    明细

    列名称类型描述TEST_EXECUTION_IDBIGINT特定测试运行的标识符RESULT_DETAIL_IDBIGINT调用堆栈输出表中查找的唯一标识符RESULT_DETAILNCLOB长文本描述测试运行期间失败/发生的错误 

    调用堆栈

    列名称类型描述RESULT_DETAIL_IDBIGINT特定调用堆栈的标识符FRAME_LEVEL整数调用堆栈框架的级别DATABASE_NAMENVARCHAR(256)数据库名称SCHEMA_NAMENVARCHAR(256)模式名称OBJECT_NAMENVARCHAR(256)对象名称MEMBER_NAMENVARCHAR(256)库成员名称LINE整数SQL 行号柱状图整数SQL 列值职位整数SQL 位置值 