跳到主要内容

new_sql_logic_test_framework

背景

基本上所有健壮的数据库系统都需要在以下范围内进行测试。

  1. 合理的单元测试覆盖率。
  2. 大量的查询逻辑测试。(主要讨论
  3. 分布式系统相关的行为测试。
  4. 性能测试 https://benchmark.databend.com/clickbench/release/hits.html

目前,我们的测试框架基于以下设计。

我们主要采用 bendsql 二进制客户端来测试查询逻辑,并在驱动兼容性部分覆盖了一些基本测试。

然而,当前的逻辑测试存在一些不足,需要改进。

  1. 将二进制输出与结果文件进行比较无法扩展到其他协议。例如,http_handler 有 json 输出格式,我们应该有指定的结果来覆盖这种情况。
  2. 目前,我们测试的 sql 文件同时覆盖多个语句,结果文件无法显示每个语句的结果。
  3. 目前,我们没有为 sql 逻辑测试提供错误处理。
  4. 我们无法扩展带有排序、重试和其他逻辑的 sql 逻辑语句。

详细设计

测试输入是 sql 逻辑测试的扩展版本 https://www.sqlite.org/sqllogictest/

该文件以称为测试脚本的领域特定语言表示,并支持不生成输出的 sql 语句或有意产生错误的语句。

语句规范可以分为以下字段

statement ok:sql 语句正确,预期输出成功。

例如:以下 sql 将成功且无输出

statement ok
create database if not exists db1;

statement error <error regex>:sql 语句输出预期错误。

例如:以下 sql 将因错误消息 table db1.tbl1 does not exist 而失败

statement error table db1.tbl1 does not exist
create table db1.tbl1 (id int);

query <desired_query_schema_type> <options> <labels>:sql 语句输出预期成功,并带有期望的结果。

desired_query_schema_type 表示查询结果的模式类型。文档在 https://github.com/gregrahn/sqllogictest/blob/master/about.wiki#test-script-format

  • I 表示整数
  • F 表示浮点数
  • R 表示十进制
  • T 表示文本或变体(json、时间戳等)。
  • B 表示布尔值

options 是查询的选项列表,如排序、重试等。 label 允许查询首先匹配给定的套件标签结果,从而解决结果兼容性问题

例如:以下 sql 将成功并输出表格

query III
select number, number + 1, number + 999 from numbers(10);
----
0 1 999
1 2 1000
2 3 1001
3 4 1002
4 5 1003
5 6 1004
6 7 1005
7 8 1006
8 9 1007
9 10 1008

以下 sql 配置首先匹配 mysql 标签,然后是默认标签

query III label(mysql)
select number, number + 1, number + 999 from numbers(10);
----
0 1 999
1 2 1000
2 3 1001
3 4 1002
4 5 1003
5 6 1004
6 7 1005
7 8 1006
8 9 1007
9 10 1008.0

---- mysql
0 1 999
1 2 1000
2 3 1001
3 4 1002
4 5 1003
5 6 1004
6 7 1005
7 8 1006
8 9 1007
9 10 1008
开始使用 Databend Cloud
低成本
快速分析
多种数据源
弹性扩展
注册