尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

如何保证SQL语义正确?Open Distro for Elasticsearch SQL 对比测试框架与 Doctest 文档自动化实践

如何保证SQL语义正确?Open Distro for Elasticsearch SQL 对比测试框架与 Doctest 文档自动化实践 如何保证SQL语义正确Open Distro for Elasticsearch SQL 对比测试框架与 Doctest 文档自动化实践【免费下载链接】sql Open Distro SQL Plugin项目地址: https://gitcode.com/gh_mirrors/sq/sqlOpen Distro for Elasticsearch 的 SQL 插件Open Distro SQL如何让查询结果说得准、信得过答案藏在它的两大测试体系中用多个参考数据库交叉验证结果的对比测试框架以及让文档示例自己跑起来的Doctest 文档自动化。本文带你快速看懂这两套机制的设计思路与落地方式。为什么手写断言不够SQL 语义测试的三大难题SQL 的搜索空间几乎是无限的只靠人工编写的单元测试和集成测试很容易看起来很多、其实不放心。项目在 docs/dev/Testing.md 中总结了三个真实痛点测试覆盖看似庞大的用例集仍会漏掉重要场景例如 FROM 子句中的表别名、GROUP BY 字段别名等断言正确性不少断言写得过于宽松只检查结果集非空而即使写严格了也依赖开发者对 SQL 语义的理解——LEFT JOIN 配合 WHERE、SUBSTRING 等行为曾出现与预期语义不符的问题⏰持续回归需要一个可以定期自动运行的测试基准持续改进实现。因此团队没有继续加码手写断言而是引入了一套以参考实现为准的**对比测试Comparison Test**方案。对比测试框架用多个数据库交叉验证 SQL 结果框架组件一览对比测试的组件设计刻意保持轻量测试数据采用 Kibana 官方自带的 flights 与 ecommerce 样例索引由 CI 工作流定期触发测试运行器内嵌 Elasticsearch 和其他参考数据库。测试执行流程同一份数据、同一批 SQL测试运行器通过JDBC 驱动分别连接被测数据库和参考数据库默认是 SQLite 与 H2 内存库用同一份测试数据、同一批 SQL 查询语句执行后再做比对。这样做还有一个额外收益JDBC 驱动本身的正确性也顺带被覆盖了。结果比对规则与报告生成两份结果集怎么算一致报告流程遵循 5 条明确规则Schema 的名称、类型及其顺序必须一致数据行只关心每行内容忽略行顺序任一参考数据库结果能匹配即判定成功所有参考数据库都抛异常则判定为错误其余混合情况不匹配且异常并存判定为失败。最终生成一份自定义 JSON 格式的测试报告方便后续可视化。核心实现集中在 integ-test 模块中测试入口CorrectnessIT.java比对逻辑ComparisonTest.java报告模型integ-test/src/test/java/com/amazon/opendistroforelasticsearch/sql/correctness/report/一条命令即可运行可用-Dqueries指定查询集、-DesHost指向外部集群./gradlew :integ-test:comparisonTest需要说明对比测试无法保证 100% 正确它依赖参考实现的可靠性——但相比读完规范再手写断言它要可信得多。Doctest 文档自动化让文档示例自己跑起来什么是 DoctestDoctest 的思想很简单把文档里的代码示例当作测试来执行校验其输出与文档记录是否一致。它的主要价值不是全面测试代码而是反向校验——代码是基准文档不能过期。这样文档中的 SQL 示例永远不会和用户实际运行结果对不上。两种示例解析器SQL-CLI 与 bashPython 版 doctest 的入口是 doctest/test_docs.py它借助 zc.customdoctests 自定义了控制台解析器支持文档中两类示例️SQL-CLI 示例复用项目自带的 SQL 命令行工具 sql-cli 执行SELECT语句输出格式化表格bash 示例通过子进程运行curl命令访问 HTTP 接口并对 JSON 响应做美化输出。文档按 docs/category.json 分类注册测试数据如doctest/test_data/accounts.json通过 bulk API 自动灌入测试结束后自动删除索引互不污染。./gradlew doctest它也被集成进主构建流程执行./gradlew build时同样会运行 doctest。新一代 Java Doctest 框架在新架构下文档自动化进一步升级为 Java 集成测试驱动基类 DocTest.java 通过DocTestConfig声明文档模板与测试数据开发者用Section标注方法即可把描述 SQL 请求 实际响应自动生成为.rst文档。以 BasicQueryIT.java 为例测试方法中post(SELECT firstname, lastname FROM accounts)会真正发送到内嵌 Elasticsearch 集群执行再把真实响应写入文档模板dql/basics.rst——文档与代码从此不可能各说各话。快速上手两条命令体验全部测试场景命令说明文档示例自动化./gradlew doctest需确保本地 9200 端口没有已运行的 ES 实例SQL 语义对比测试./gradlew :integ-test:comparisonTest默认使用工作区内嵌 Elasticsearch SQLite/H2更多设计细节可参考 docs/dev/Doctest.md 与 docs/dev/Testing.md。小结✅对比测试框架用 SQLite、H2 等参考数据库执行同一批 SQL从主观断言升级为客观交叉验证持续守护 SQL 语义的正确性✅Doctest 文档自动化文档示例即测试用例./gradlew doctest一条命令即可保证文档示例永远与代码行为一致✅ 两套机制均深度集成 Gradle 构建流程让正确性成为可以定期自动回归的工程能力。对于正在开发 SQL 引擎或查询接口的团队这套对比测试 可执行文档的实践非常值得借鉴少写主观断言多让事实说话。【免费下载链接】sql Open Distro SQL Plugin项目地址: https://gitcode.com/gh_mirrors/sq/sql创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表