new_sql_logic_test_framework
背景
基本上所有健壮的数据库系统都需要在以下范围内进行测试。
- 合理的单元测试覆盖率。
- 大量的查 询逻辑测试。(主要讨论)
- 分布式系统相关的行为测试。
- 性能测试 https://benchmark.databend.com/clickbench/release/hits.html
目前,我们的测试框架基于以下设计。
我们主要采用 bendsql 二进制客户端来测试查询逻辑,并在驱动兼容性部分覆盖了一些基本测试。
然而,当前的逻辑测试存在一些不足,需要改进。
- 将二进制输出与结果文件进行比较无法扩展到其他协议。例如,
http_handler
有 json 输出格式,我们应该有指定的结果来覆盖这种情况。 - 目前,我们测试的 sql 文件同时覆盖多个语句,结果文件无法显示每个语句的结果。
- 目前,我们没有为 sql 逻辑测试提供错误处理。
- 我们无法扩展带有排序、重试和其他逻辑的 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