|
Qtp很强大,强大在它的定制性上,许多控件的属性,都可以灵活地进行运行时动态定义取值。 对鄙人来说,比较感兴趣它的check point,特别是里面的数据库测试点部分。
案例:如果我们需要测试某一条选定的记录,那check point中的constant部分就可以实现了,这一点比较简单,不过实际测试过程中我们会遇到许多复杂的情况,比如Qtp附带的flight程序中页面显示的单条购票的总价Total值是否计算正确?
分析测试需求,我们发现首先需要了解flight的数据库结构,我们能够在flights表中找到航班单价,能够在orders表中找到定票数量和航班的等级属性class(定义一等,商务,经济舱),数据库中没有保存total值,这时候我们就不能直接光用Database check point对数据库进行数据比较了,经过考虑,有2种思路可以实现测试需求。
1.正向测试:使用Qtp录制一段插入记录的动作,然后修改脚本,参数化航班信息(random使数据更真实),在一个循环中不断插入记录,同时取下显示界面上的total值,再设置Database check point进行total值和从表中取出值计算后结果的比较。
2.反向测试:利用原有已经存在表中的数据进行测试,录制利用记录号打开记录的动作,修改脚本,利用一个循环遍历所有存在记录,同时取下显示界面上的total值,再设置Database check point进行total值和从表中取出值计算后结果的比较。
实行时的难点在于:
1.Database check point的预期值和实际值都是动态变化的,需要参数化
2.界面上的total取值中含有价格符号以及小数精度。eg:(¥3.00)
3.反向中的循环次数会有意外(如果记录中存在删除的记录,则就会有记录号不连续的情况)
最终考虑选取正向测试方案,参数化插入记录属性。
在循环中取到total的text,使用Environment("total")= trim(CSng(mid(var,2)))来处理该值
var是getroproperty的输出,mid去除¥符号,CSng转换成单精度数,trim去除多余的0(3.80会成3.8;2.00会成2)
再设置一个环境变量(保存动态 select 命令)
Environment("select")="select a.Ticket_Price*b.Tickets_Ordered*choose(b.class, 3, 2, 1) from Flights a, Orders b where a.Flight_Number=b.Flight_Number and b.Order_Number="&tordnum
tordnum是从界面上取出的插入的order number,choose函数替换输出class,整句sql语句计算得出该条记录正确的总价。
在循环插入的循环体最后插入Database check point,预期值参数化成Environment,选择total,然后再去资源选项resources中修改这个check point的source部分,将其也参数化成Environment,选择select,这样整个check point就会动态地进行循环判断。
最终得到我们的测试报告,从result中查看结果! |
|