如何对遗留存储过程中的SQL CASE语句逻辑执行单元测试
你的现有测试思路是正确的,针对CASE分支逐个验证的方式可以精准定位逻辑问题,排查效率更高。你可以根据测试目标选择测试方案:
测试方案选择
- 仅验证CASE逻辑正确性:单独拆分CASE逻辑做分支测试即可,不需要运行整个存储过程,测试执行速度快,问题定位清晰。
- 验证存储过程端到端功能:直接测试最终插入到
[dbo].[utb_ITP]的完整输出,覆盖关联查询、字段映射、INSERT逻辑在内的所有流程。
现有测试方案优化建议
- 覆盖所有分支和边界场景
你当前的CASE逻辑共有3个分支,需要全部覆盖才能保证逻辑正确,需要构造的测试场景包括:
- 分支1:
[Reporting Countries] = 'Multiple Countries' - 分支2:
patindex('%-$',[Reporting Countries]) > 1,需要覆盖常规场景(如United Kingdom-)和边界场景(如A-、-B) - 分支3:else分支,覆盖普通国家名称、不满足分支2条件的带横杠的值
使用Mock临时表替代正式源表
不要依赖正式环境的[SourceTable]数据做测试,避免正式数据变动导致测试结果不稳定,你可以手动构造测试数据存入临时表,再执行逻辑验证。注意修正原代码的语法错误
你贴出的CASE逻辑存在两处语法问题:patindex('%-$',[sme].[Reporting Countries)缺少右括号,pat index中间多了空格,实际运行前需要先修正。
优化后的测试代码示例
-- 构造模拟测试数据源,覆盖所有场景 insert into #MockSource ([Reporting Countries]) values ('Multiple Countries'), -- 分支1场景 ('United Kingdom-'), -- 分支2常规场景 ('A-'), -- 分支2边界场景(patindex返回2,刚好满足>1的条件) ('-B'), -- else分支边界场景(patindex返回1,不满足分支2条件) ('China') -- else分支常规场景 -- 构造预期结果表 insert into #Expected (SVC_COUNTRY) values ('United Kingdom-Multiple Countries'), ('United Kingdom'), ('A'), ('-B'), ('China') -- 执行CASE逻辑获取实际结果 insert into #Actual (SVC_COUNTRY) select case when [sme].[Reporting Countries] = 'Multiple Countries' then 'United Kingdom-Multiple Countries' when patindex('%-$',[sme].[Reporting Countries]) > 1 then left([sme].[Reporting Countries], (patindex('%-%', [sme].[Reporting Countries]) - 1 )) else [sme].[Reporting Countries] end as [SVC_COUNTRY] from #MockSource as [sme] -- 执行表断言验证结果一致性 exec AssertEqualsTable '#Expected', '#Actual'
端到端测试方案
如果需要验证整个存储过程的完整功能,你可以直接构造符合要求的源表数据,调用存储过程执行后,查询目标表[dbo].[utb_ITP]的结果和预期值做对比即可,不需要单独拆分CASE逻辑测试。
内容的提问来源于stack exchange,提问作者mickeysox
相关产品推荐
相关产品推荐

