|
日前测试一个电子表单,用户通过ie内嵌插件,展示表单,表单内容包括模版和数据,插件是delphi开发的插件,生成的ocx控件放在windows目录下,ie打开链接的页面后,通过点击展现按钮,向服务器端请求数据,返回一个模版和数据的xml格式的文件,通过插件ocx分离出的exe可执行文件,读取该xml进行ie内的模版展示。其中返回该xml文件后,和服务器端以及数据库就停止了任何的交互过程。用户希望得到从点击展现到展现完成的时间。针对这个开始做性能测试,动了不少脑筋。虽然展现过程只和客户端的配置有关,但是如果返回的xml数据以及该插件在执行过程中,对客户端的cpu等考验很大,是不能接受的。lr使用web等协议我都没有实现,后面我会说到原因。后来由于测试使用的ie页是静态页面,中间包含了插件向javascript的接口函数,因此就动了使用javascript-vuser的念头。使用javascript-vuser的宿主除了windows环境外,还有lr的环境,初步的脚本如下:
function Action()
{ //" TO DO: Place your business process/action code here
var sArr=[];
var i=0;
sArr[i++]="<html><head><title>测试页</title></head>";
sArr[i++]="<script language='Javascript'>";
sArr[i++]="function loadForm()";
sArr[i++]="{";
sArr[i++]="var fa = document.getElementById('File');";//File为下面的object的id名
sArr[i++]="fa.init(); ";
sArr[i++]="fa.SetServerUrl('http://127.0.0.1:7001');";
sArr[i++]="var fn='test';";
sArr[i++]="fa.Roles='all';";
sArr[i++]="fa.LoadFromFile(fn);";
sArr[i++]="}";
sArr[i++]="</script>";
sArr[i++]="<body onLoad=\"loadForm();\" bgcolor=#eeeeee language=javascript>";
//sArr[i++]="<body bgcolor=#eeeeee language=javascript>";
sArr[i++]="<input type='button' onclick='loadForm();' value='装入表单'>";
sArr[i++]="<object classid='clsid:-----'>
---------
</object></body></html>";
var myIE=new ActiveXObject("InternetExplorer.Application"); //启动创建ie对象的应用程序
//var WshShell=new ActiveXObject("WScript.Shell");
var lr = new ActiveXObject("LoadRunner.LrApi"); //同样,lr的对象。
myIE.Visible = false; //窗口不可见
myIE.Navigate("about:blank"); //空白页打开
// myIE.Navigate("www.google.cn");
var oDoc=myIE.document; //ie的document属性
oDoc.open();
lr.rendezvous("2");
lr.start_transaction("5");
try
{ oDoc.write(sArr.join("\n"));
}
catch(e)
{ // oDoc.write(e);
}
finally
{ oDoc.close();
myIE.Quit();
// lr.sleep(2000);
lr.end_transaction("5", lr.AUTO);
myIE=null;
} return(lr.PASS);
}
到这里,有些问题仍然存在疑惑,希望得到大家的指点。
1 该脚本中通过Navigate打开ie,执行的过程是多线程的,计算时间上不够准确,很多时候,lr在执行完onload前就已经退出transaction了。这个还需要改进。如何判断onload执行完毕还没有头绪。
2 通过Navigate打开ie获取document对象,好像只能在myIE.Navigate("about:blank")时才能打开,如果是myIE.Navigate("www.google.cn")等其它页时则提示javasript内部错误,可能的错误原因,是不能创建该document对象。如果能够获取后者的document对象就好了。
3 可以考虑加入javascript模拟鼠标点击按钮“装入表单”,不过在1,2解决后再考虑3就比较合适。
4 使用web等协议没有实现的原因,是因为点击展现以后,系统只开启了该exe的进程,提示正在装载,而表单并不展现,后面的客户端的过程lr是不能录制的,如果用手工编写脚本的话,通过java实现了取得xml的过程,到了读取数据的时候,需要和delphi的控件打交道。通过咨询开发人员,这里delphi不是生成dll文件的,只能生成exe内置于ocx中,目前我知道能够通过本地调用dll,但整个展示的过程不光是调用一个delphi的函数,有很多都需要参与。一个delhpi函数生成一个dll,如果多个函数,而且相互有参数的关联,很难实现。因此dll这个方法被搁置了。 |
|