在LR下也可以直接調(diào)用動(dòng)態(tài)鏈接庫文件,針對(duì)一些使用LR腳本編寫比較煩瑣的方法可以考慮此方法(比如各種加解密算法的實(shí)現(xiàn),數(shù)據(jù)庫的操作等),并能夠使測試腳本簡單明了。鑒于此,本人初次嘗試了如何制作DLL文件并在LR中使用。
1、dll文件的制作
在Visual C++6.0開發(fā)環(huán)境下,打開File-New-Project選項(xiàng),可以選擇Win32 Dynamic-Link Library來創(chuàng)建一個(gè)名為dllfortest的空的dll工程(這只是方法之一)。
在該項(xiàng)目中新建一個(gè)dllfortest.h和dllfortest.cpp文件,文件的內(nèi)容如下:
//dllfortest.h
extern "C" _declspec(dllexport) int Max(int a, int b, int c);
extern "C" _declspec(dllexport) int Min(int a, int b, int c);
//dllfortest.cpp 包含一個(gè)計(jì)算三個(gè)整數(shù)中最大值和最小值的方法
#include"dllfortest.h"
int Max(int a, int b, int c)
{
int Res;
Res = (a>b? a:b)>c? (a>b? a:b):c;
return Res;
}
int Min(int a, int b, int c)
{
int Res;
Res = (a>b? b:a)>c? c:(a>b? b:a);
return Res;
}
該動(dòng)態(tài)鏈接庫編譯成功后,打開dllfortest工程目錄下的debug目錄下,可以看到生成了一個(gè)dllfortest.dll文件,這就是我們想要的文件。
2、dll文件在LR中的調(diào)用
打開LR VU Generator,選擇C Vuser協(xié)議(或其他支持C的協(xié)議),進(jìn)入編輯界面。Action部分如下所示:
Action()
{
lr_load_dll("dllfortest.dll");
lr_message("Max Result is %d",Max(100,200,67));
lr_message("Min Result is %d",Min(55,97,63));
return 0;
}
將dllfortest.dll文件復(fù)制到腳本所在的目錄(如果不復(fù)制的話,lr_load_dll的參數(shù)應(yīng)該寫成dll文件的絕對(duì)路徑),如果編譯沒有報(bào)錯(cuò)的話,就可以直接運(yùn)行了。
運(yùn)行結(jié)果如下:
Virtual User scrīpt started
Starting action vuser_init.
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Max Result is 200
Min Result is 55
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.
如果在腳本中用到了DLL文件中并不存在的方法名時(shí),編譯也能通過,但是運(yùn)行時(shí)LR會(huì)報(bào)錯(cuò),提示不存在該方法
比如我們在腳本中添加一句:
lr_message("Min Result is %d",Sum(55,97,63)); //Sum方法并不存在
運(yùn)行時(shí)錯(cuò)誤信息如下:
Action.c(7): Error: C interpreter run time error: Action.c (7): Error -- Unresolved symbol : Sum.
Action.c(7): Notify: CCI trace: Compiled_code(0): Action()
.
這個(gè)例子并沒有體現(xiàn)出DLL文件調(diào)用的優(yōu)點(diǎn),因?yàn)檎{(diào)用的方法在LR中用C直接就可以完成,但涉及到LR中完不成的任務(wù)時(shí),或許dll文件的作用就體現(xiàn)出來了
example:
LoadRunner提供了功能強(qiáng)大的API集合,足夠應(yīng)付大多數(shù)性能測試的需求。但在某些情況下,這些API仍然有覆蓋不到的地方。例如,我們有一個(gè)WEB應(yīng)用,該應(yīng)用有一個(gè)頁面輸入用戶的信息,為了安全起見,用戶輸入的信息在提交之前都要先進(jìn)行加密處理,加密處理通過本地的COM組件實(shí)現(xiàn)。
對(duì)這個(gè)要求而言,LoadRunner的現(xiàn)有API不能提供直接支持,因?yàn)長oadRunner在錄制腳本時(shí)只錄制數(shù)據(jù)交互,因此,COM的加密處理過程是不能錄制下來的。在LoadRunner的腳本中,可能只有類似以下的語句描述了這個(gè)過程:
…………
web_url("userinfo",
"URL=http://testweb/userinfo.aspx",
"TargetFrame=",
"Resource=0",
"Referer=",
LAST);
web_submit_form("login ",
"Snapshot=t4.inf",
ITEMDATA,
"Name=username", "Value=4e92Sh6d394g", ENDITEM,
"Name=password", "Value=932A2hf34U18", ENDITEM,
LAST);
…………
從腳本可以看到,輸入的數(shù)據(jù)是加密后的數(shù)據(jù),但LR沒有錄制到加密過程。
假設(shè)加密函數(shù)所在的DLL名為security.dll,用于加密的函數(shù)名為encode,則一種可能的對(duì)腳本的修改方法如下代碼所示。
…………
char *encode_username, *encode_password, *orgin_username, *orgin_password;
char* uservalue, passvalue;
int ret;
……
web_url("userinfo",
"URL=http://testweb/userinfo.aspx",
"TargetFrame=",
"Resource=0",
"Referer=",
LAST);
orgin_username = lr_eval_string(“{ username }”); //獲取參數(shù)的值
orgin_password = lr_eval_string(“{ password }”);
ret = lr_load_dll(“security.dll”); //加載DLL庫
encode(origin_username, encode_username); //調(diào)用encode函數(shù)
encode(origin_password, encode_password);
sprintf(uservalue, “Value=%s”, encode_username);
sprintf(passvalue, “value=%s”, encode_password);
web_submit_form("login ",
"Snapshot=t4.inf",
ITEMDATA,
"Name=username", uservalue, ENDITEM,
"Name=password", passvalue, ENDITEM,
LAST);
注意:有些腳本錄制需要相應(yīng)的patch的支持,如錄制DotNet編寫的應(yīng)用程序你需要把lr78安裝盤\ Patches\Trap_for_.net_patch文件夾中trpfnc32.32dll拷貝到loadrunner\bin路徑下,才能正常工作。
聯(lián)系客服