测试流程
VQuery 使用 rstest 框架进行测试。所有命令需在根目录执行。
测试机制
- Unit:工具函数、编译器逻辑与内存查询引擎。
- examples:SQL 生成与内存数据查询流程。
- dialects:共用一套 DSL,快照校验 MySQL 和 DuckDB 的 SQL 生成结果,不连接数据库。
常用命令
运行所有测试
更新快照
确认 SQL 变化符合预期后更新快照,并审阅生成的差异:
覆盖率报告
方言 SQL 快照
方言测试只有一套共享用例和一份快照:
tests/dialects/queries.json:以supermarket为查询表,保存真实 CSV 的完整 20 字段逻辑 schema 和共享 DSL 用例。source指向仓库已有的tests/unit/assets/supermarket.csv;该文件与本次提供的 CSV 内容一致,测试无需访问用户的 Downloads 目录。每条用例用唯一且稳定的name标识,可附description解释业务场景。tests/dialects/compile.test.ts:每条 DSL 分别调用 MySQL、DuckDB 的compileQuery,将两种方言的{ sql, parameters }一起核对快照。tests/dialects/__snapshots__/compile.test.ts.snap:按用例保存两种方言的 SQL 和参数;通过快照差异审阅编译逻辑变化。
测试纳入现有的 test、test:update、test:coverage,无需专用配置、数据库服务、CLI 或连接凭据。新增方言时复用同一套 DSL,增加对应编译结果即可。
CSV 中 id、sales、amount、discount、profit 使用 number,order_date、delivery_date 使用 date,其余列使用 string。日期样例按 SQL DATE 格式表示为 YYYY-MM-DD。用例涵盖销售利润、商品层级、省市地域、客户贡献、折扣亏损与配送分析,使用真实字段和业务值;不在业务用例中改写 schema 或虚构源字段。
测试将 schema 字段与 CSV 表头逐一比较,并逐条检查 SELECT、WHERE、HAVING 的源字段;GROUP BY、ORDER BY 可以引用真实字段或 SELECT 输出别名。聚合查询中的维度必须参与分组,聚合结果别名不能作为分组键。别名是输出名称,不视为新的源字段。
只运行方言快照测试:
覆盖率沿用包现有的四项 100% 门槛,非法 DSL 的拒绝分支由 Unit 测试覆盖,不维护另一套方言覆盖率配置。
功能与组合覆盖
源码覆盖率 100% 不等于所有 DSL 组合都被验证。嵌套层数、条件数量和参数值没有有限的穷举集合;用例库持续积累实际场景和历史回归,不以数量代替覆盖范围。
共享 JSON 用例库持续扩充,测试同时检查以下明确的组合要求,删除必要用例会失败。功能与操作符清单通过 DSL 类型约束;现有 typecheck 同时检查源码和测试,新增功能时需要同步补充清单与用例。
另包含商品名称 MIN/MAX 的 HAVING、下单日与配送日分组、多日期多字段分组、销售与利润跨字段统计、未投影 HAVING、别名冲突、2/4/8 层嵌套等回归场景。这些场景不代表任意组合均已穷尽。
追加场景时,直接在 queries.json 的 queries 数组中增加基于这份 schema 的完整 DSL,用 description 说明触发条件或历史问题,再运行 test:update 并审阅两种方言的 SQL 差异。不要复制方言专属用例或加入随机生成步骤。无 schema、特殊标识符、JS Date、Infinity 等编译器边界由 Unit 测试维护。