如何用Oracle单元测试框架测试Cerner CCL查询数据?
测试CCL查询结果集的可行方案
一、基于cclunit-framework扩展实现结果集测试
虽然该框架侧重子程序/函数的断言,但可以通过简单封装扩展出结果集测试能力:
- 将目标CCL查询封装为返回临时表的子程序
把要测试的查询逻辑放到一个子程序里,执行后将结果写入临时表,再用框架的断言工具校验临时表内容。示例:-- 待测试的查询封装子程序 subroutine get_admitted_patients() declare temp table #admitted_results ( patient_id int, name varchar(50), admit_date dtime ) enddeclare insert into #admitted_results select patient_id, name, admit_date from patient where admission_status = 'ADMITTED' endsubroutine -- 测试用例 run get_admitted_patients(); -- 断言结果行数 assert_equal(query("select count(*) from #admitted_results"), 3, "入院患者记录数应为3条"); -- 断言特定字段值 assert_equal(query("select name from #admitted_results where patient_id = 1001"), "John Doe", "ID1001的患者姓名应为John Doe"); - 自定义结果集对比函数
如果框架没有现成的全量结果集断言,可以自己编写CCL函数,接收实际结果表和预期结果表,逐行逐字段对比后返回匹配状态,再在测试用例中调用该函数完成断言。
二、SQL通用的查询测试方案(无CCL框架依赖时)
如果cclunit-framework无法满足需求,SQL领域通用的测试思路如下:
- 全量结果对比法
提前准备好预期结果数据集(可以是提前插入的测试表,或者通过逻辑明确的查询生成),用数据库的差集运算对比实际与预期结果:-- 实际查询结果存入临时表 create table #actual_results as select patient_id, name, admit_date from patient where admission_status = 'ADMITTED'; -- 对比实际与预期结果,两个差集查询均为空则完全匹配 select * from #actual_results minus select * from #expected_results; select * from #expected_results minus select * from #actual_results; - 核心指标断言
无需全量对比时,重点校验关键业务指标:- 结果集总行数是否符合预期
- 字段聚合值(如
sum(amount)、max(age))是否正确 - 特定过滤条件下的单条记录字段值是否匹配
- 借助通用SQL测试工具
针对Oracle环境,可以使用UTPLSQL这类原生测试框架,通过编写PL/SQL测试用例来执行CCL查询(CCL可编译为Oracle可执行对象)、获取结果并完成断言;也可以用Java结合JDBC,通过代码逻辑执行查询、解析结果集并做断言。
内容的提问来源于stack exchange,提问作者Cdn_Dev
相关产品推荐
相关产品推荐

