RisingLight数据库端到端测试框架深度解析
risinglight An educational OLAP database system. 项目地址: https://gitcode.com/gh_mirrors/ri/risinglight
引言
在数据库系统的开发过程中,端到端测试是确保系统功能正确性的关键环节。RisingLight作为一个新兴的数据库项目,采用了两种独特的测试框架来验证其SQL处理能力:SQLLogicTest和SQLPlannerTest。本文将深入解析这两种测试框架的设计原理和使用方法。
SQLLogicTest:SQL逻辑测试框架
基本概念
SQLLogicTest是RisingLight中用于验证SQL语句执行结果的核心测试框架。它通过执行特殊的.slt
测试脚本文件,并将实际执行结果与预期结果进行比对,来验证SQL语句的正确性。
测试文件结构
测试用例统一存放在tests/sql
目录下,每个.slt
文件包含多个测试用例。典型的测试文件结构如下:
- statement ok:声明一个期望执行成功的SQL语句
- query:声明一个查询语句及其预期结果
- ----:分隔符,用于分隔查询语句和预期结果
实际案例解析
以order_by.slt
为例:
statement ok
create table t(v1 int not null, v2 int not null)
statement ok
insert into t values(1, 1), (4, 2), (3, 3), (10, 12), (2, 5)
query I
select v1 from t order by v1 asc
----
1
2
3
4
10
这个测试文件包含三个测试用例:
- 表创建测试:验证CREATE TABLE语句能否成功执行
- 数据插入测试:验证INSERT语句能否成功执行
- 查询结果测试:验证SELECT语句的排序结果是否符合预期
其中query I
表示查询结果只包含整数类型的一列数据。
执行方式
运行make test
命令时,测试运行器会自动执行tests/sql
目录下的所有测试文件,确保每个SQL语句都能产生预期的结果。
SQLPlannerTest:查询计划回归测试
设计理念
SQLPlannerTest是RisingLight专门为查询优化器设计的回归测试框架。它通过比较查询计划(Explain)在不同版本间的变化,来验证优化器改进的效果。
测试文件格式
测试用例存储在tests/planner_test
目录中,采用YAML格式描述测试场景。每个YAML文件定义了一组需要测试的SQL查询。
工作流程
- 开发者编写YAML测试描述文件
- 运行
make apply_planner_test
命令 - 系统为每个YAML文件生成包含EXPLAIN结果的SQL文件
- 比较不同版本间EXPLAIN结果的差异
核心价值
与SQLLogicTest不同,SQLPlannerTest并不直接验证查询结果的正确性,而是专注于:
- 监控查询计划的变化
- 评估优化器改进的实际效果
- 防止优化器改动引入非预期的行为变更
两种测试框架的对比
| 特性 | SQLLogicTest | SQLPlannerTest | |------|-------------|----------------| | 测试目标 | SQL执行结果正确性 | 查询计划稳定性 | | 文件格式 | .slt特殊格式 | YAML格式 | | 验证方式 | 结果比对 | 计划比对 | | 执行命令 | make test | make apply_planner_test | | 关注重点 | 功能正确性 | 优化器行为 |
最佳实践建议
- 功能开发:新增SQL功能时,应在
tests/sql
中添加对应的.slt测试用例 - 优化器改进:修改优化器时,应通过SQLPlannerTest验证计划变化是否符合预期
- 测试组织:相关测试用例应按功能模块组织在不同文件中
- 结果验证:对于复杂查询,可同时使用两种测试框架进行验证
总结
RisingLight通过SQLLogicTest和SQLPlannerTest两种测试框架,构建了完整的端到端测试体系。前者确保SQL功能实现的正确性,后者保障优化器改进的可控性。这种双重验证机制为数据库系统的稳定演进提供了坚实基础。
对于数据库开发者而言,理解并善用这两种测试框架,能够显著提升开发效率和代码质量。建议在实际开发过程中,养成先写测试用例再实现功能的良好习惯。
risinglight An educational OLAP database system. 项目地址: https://gitcode.com/gh_mirrors/ri/risinglight
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考