复杂查询优化的分层测试
查询测试需要覆盖语义与运行环境。单元层检查表达式和边界值,集成层连接真实模式,端到端层确认报表对用户可用。
保存反例
为空集合、重复关联、权限不足和超时准备固定样本。优化后优先运行这些反例,防止正常数据掩盖兼容性问题。
单元层验证查询语义
单元测试适合检查不依赖数据库执行器的部分:条件组合、日期边界、参数类型、指标公式和结果映射。为每个表达式准备最小数据样本,明确空值、零值、重复记录和非法参数的预期。若查询由自然语言、配置或用户输入生成,先将它转换为受控的中间结构,再校验允许字段、操作符和最大范围,不能直接拼接 SQL。
单元层还应覆盖业务口径的边缘情况。例如“本月”跨时区时采用哪个边界,退款是否抵扣销售额,关联不到维表的数据如何处理。这些规则不写进测试,后续优化很容易把正确但少见的行为改掉。测试名称应说明业务含义,而不只描述某个函数,以便数据和产品人员也能参与复核。
集成层使用接近真实的模式
集成测试连接与生产接近的数据库版本、表结构、索引和权限模型。数据量不必完全相同,但要包含有代表性的基数和分布,否则执行计划、排序和关联成本没有参考价值。检查查询不仅返回正确结果,也不会扫描异常多的行、创建不必要的临时表或因锁等待超出预算。
权限测试在集成层尤为重要。同一查询使用不同身份时,应只返回被授权的行和列;无权条件不能通过参数变化绕过。缓存、分页和导出接口也要在这里验证,因为它们可能在查询正确后改变结果范围。对于会更新汇总表或物化视图的作业,测试重复执行与失败重试,避免产生重复或部分数据。
端到端检查用户是否能理解结果
端到端测试从用户选择筛选条件开始,经过查询、图表或表格展示,到下载、共享或保存报表结束。确认界面显示了时间范围、口径、数据更新时间和权限限制;发生超时或无数据时,用户知道是稍后重试、调整条件还是申请权限,而不是看到空白页面。
优化上线时,将新旧查询先在只读报表或影子任务中对照,记录结果差异、耗时与资源使用。差异需要先解释再放量,不能因为新查询更快就默认正确。保留旧查询开关和回退步骤,观察期内监控错误、慢查询、用户反馈和数据异常。
分层测试的目的不是让查询永远不变,而是让每次变化都有证据。把反例、数据快照、口径说明和执行记录保存下来,下一次重构或数据增长时才能知道哪些行为必须保留,哪些性能问题确实值得优化。