在春节过年回家之前,现场又出问题,并发情况下游标报错。一封邮件让我不得不加班研究如何来模拟实际生产环境。大致需求是根据抄表段编号和电费年月来查询该抄表段下的用户的缴费情况,一个抄表段有几百到两千的用户。需要并发的查询不同抄表段下用户的缴费情况,并依次打印该抄表段下每个用户的缴费情况。

  对于这样的问题,开始我想挺好解决的,只要在脚本中加个循环控制语句好了,但实际测试才知道,loadrunner在向服务器提交数据的时候有一个ID是没有规律的,顿时闷了一下,之前的想法这样绝望了。经过仔细考虑,打印发票是每台电脑直连一台打印机的,也是说不能通过一个脚本来模拟,需要使脚本有分布式的感念,脚本需要控制在每台机器上运行。这样每个脚本是相对独立的。这样我想到了QTP,使用QTP来编写脚本,用loadrunner来控制脚本执行,这样可以满足现场需求了。

  附:QTP脚本如下:

SystemUtil.CloseProcessByName "iexplore.exe"
SystemUtil.Run "iexplore.exe","http://172.19.201.188:7001/web/"
set ChildObjects = CreateObject("Scripting.Dictionary")
    With ChildObjects
         .Add "Browser", Browser("CreationTime:=0")
         .Add "Page", .Item("Browser").Page("index:=0")
         .Add "Username", .item("Page").WebEdit("name:=username")
         .Add "Password", .item("Page").WebEdit("name:=password")
         .Add "Submit", .item("Page").Image("index:=0")
         .Add "Frame", .Item("Page").Frame("name:=barFrame")
         .Add "LinkMenu", .Item("Frame").Link("text:=电费收缴及营销账务管理")
         .Add "Linkitem", .Item("Frame").Link("text:=客户缴费管理","index:=0")
         .Add "TreeMenuFrame",.Item("Page").Frame("name:=TreeMenuFrame")
         .Add "WebTable", .Item("TreeMenuFrame").WebTable("text:=我的桌面支持.*","index:=0")
         .Add "PageFrame",.Item("Page").Frame("name:=PageFrame","index:=1")
         .Add "mrSectNo",.Item("PageFrame").WebEdit("name:=mrSectNo")
         .Add "rcvblYm",.Item("PageFrame").WebEdit("name:=rcvblYm")
         .Add "WebButton",.Item("PageFrame").WebButton("name:=查询")
    End With

ChildObjects.item("Username").Set "YYY"
ChildObjects.item("Password").Set "1"
ChildObjects.item("Submit").click
ChildObjects.item("LinkMenu").click
ChildObjects.item("Linkitem").click
ChildObjects.item("WebTable").ChildItem(1,2,"Image",192).click
ChildObjects.item("mrSectNo").Set "0000006511"   
ChildObjects.item("rcvblYm").Set "201211"   
ChildObjects.item("WebButton").click

Services.StartTransaction "start"
With Browser("CreationTime:=0").Page("index:=0")
    For N= 1 To .Frame("name:=PageFrame","index:=1").WebEdit("name:=tatolRecord").GetROProperty("value")
        .Frame("name:=PageFrame","index:=1").WebCheckBox("index:="&N).Set "ON"
        .Frame("name:=PageFrame","index:=1").WebButton("name:=打印发票").click
         Set Wsh=CreateObject("WScript.Shell")
         Wsh.SendKeys "^+{F4}"
        .Frame("name:=PageFrame","index:=1").WebCheckBox("index:="&N).Set "OFF"
    Next
End With
Services.EndTransaction "start"

  注意:在loadrunner中运行QTP脚本,需要在QTP脚本中设置事务,如:Services.StartTransaction "start"与Services.EndTransaction "start"

  在loadrunner中调用QTP脚本步骤如下:

  1、在每台机器上安装loadrunner、QTP工具。

  2、每台机器上的QTP,勾选Tools--Options--Run的"Alow other Mercury products to run tests and components"设置。

  3、每台终端一定要开启loadrunner的LR Agent Process及QTP的TOOS-Remote Agent代理服务。

  4、启动loadrunner后,在LR中运行时选择QTP脚本,为QTP脚本存放目录下文件扩展名为.usr的文件。注:loadrunner中运行QTP脚本时,只能有一个GUI Vuser

  5、添加不同的组,每个组的脚本分别由远程机器来执行。

  完成以上步骤及场景设置后,可以在loadrunner控制台运行场景了,这样可以看到每个终端都会调用QTP脚本,来并发执行自动化测试,这样也达到了我们并发并循环测试的一个目的。