我的测试手记,记录每天测试生活学习中的点点滴滴!积累软件测试经验!

测试c++中DLL性能

上一篇 / 下一篇  2009-05-20 09:47:49

场景介绍       
!\WhF*FdC160173        最近在做类似于QQ的通信工具的性能测试时发现了一些问题,现总结出来与大家分享一下。希望大家在使用LoadRunner时不仅仅停在只是录制/播放角本,而全面提升角本的编程技术,解决复杂场景。
0\qL D ^0}XW160173        本次测试中碰到的问题是这样的,在消息的传送过程中遇到了DEC加密的过程,LoadRunner录制到的全是加密的消息,比如我录制了某一个用户的登陆,发送消息,退出,但由于是加密的,只能单个用户使用,但如果我想并发多少个用户就存在很多问题,最直接的一个问题就是用户名是加密的,密码是加密的,当然你可以说让程序那里注掉加密的代码进行明码的测试,当然也是一种办法。但程序组提出了要使用更真实的方法来模拟,这时就必需使用下面介绍的方法。51Testing软件测试网3[w(Ylfwvzj-w%_\,|l
        一开始是直接把API移植到LoadRunner中来,不过由于加密算法异常复杂,有几层循环,而角本是解释执行的,进行一次加密运算可能需要好几分钟,当然在角本里可以把角本本身运行的时间去掉,但这样做显然没有直接调用DLL来的效率高。由于程序组比较忙,所以无法提供DLL给测试,所以测试完成了 DLL的编写,并在LoadRunner中调用成功,高效的完成了用户信息加密,参数关联,成功的完成了测试。51Testing软件测试网8w0B`b7|(P-]-y
动态链接库的编写
0s;x7M3z]6a+`0K160173  在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择Win32 Dynamic-Link Library建立一个空的DLL工程。
J6[Y9~!VnjA160173  1. Win32 Dynamic-Link Library方式创建Non-MFC DLL动态链接库
B#]|:@.TO{ |16017351Testing软件测试网p:E$l bf*V)Z.sm/Y9Z
  每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对DllMain ()函数按照下面的格式书写。
!?+Go;@/@0g8z.Q YtQMx160173 
:yhE!S JJ%|160173BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)51Testing软件测试网-{?]7wq;} |
{51Testing软件测试网%y1~Iv%{b0{bv6O
switch( ul_reason_for_call )51Testing软件测试网 uU/e)y;Wa7m`]X
{51Testing软件测试网0z&j_4X;du-I#L9](F#i
case DLL_PROCESS_ATTACH:
mC EX2w~8aN,s160173    break;51Testing软件测试网\r[_C2x%C
case DLL_THREAD_ATTACH:
B.R%R x&cO160173    break;51Testing软件测试网i{r$[N
case DLL_THREAD_DETACH:
:Q!U t+C-L/qXmo160173    break;
(wo*@/E vL'_$xP160173case DLL_PROCESS_DETACH:51Testing软件测试网np L ?/y |J*L(G;@,o
    break;51Testing软件测试网R6cD"K3SX9mD9r
default:51Testing软件测试网5k#W] u(iA}1~A
    break;
z;Y&V1bjwL\160173}51Testing软件测试网+Z.g^7g)n*p\5H
return TRUE;
$e-bI0M N@"|7}160173}
+k9nF V|bj x160173  51Testing软件测试网gMxK2f}
        参数中,hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符); ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入口函数,并说明动态链接库被调用的原因,它所有的可能值为:DLL_PROCESS_ATTACH: 进程被调用、DLL_THREAD_ATTACH: 线程被调用、DLL_PROCESS_DETACH: 进程被停止、DLL_THREAD_DETACH: 线程被停止;lpReserved为保留参数。到此为止,DLL的入口函数已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数或变量了。
\%CE"{3~0Zudf160173
Z6S#MbxP160173  我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。
]5c$t X:vBje16017351Testing软件测试网R Jv&U4]G
  1)使用导出函数关键字_declspec(dllexport)创建MyDll.dll,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码:
Tua%UqM)BT[Y8t160173 51Testing软件测试网"V^t"sx]*n$d$~
//MyDLL.h51Testing软件测试网1l(aCCs
extern "C" _declspec(dllexport) int desinit(int mode);
9^:O'c0x3A0^160173extern "C" _declspec(dllexport) void desdone(void);
Q6[.`,VtO160173extern "C" _declspec(dllexport) void des_setkey(char *subkey, char *key);
&tU&}p-{Y!K160173extern "C" _declspec(dllexport) void endes(char *block, char *subkey);51Testing软件测试网 \y1e7U+`d
extern "C" _declspec(dllexport) void dedes(char *block, char *subkey);
R,@ EN @160173//MyDll.cpp
8@S']h4j j$]R1QV160173#include"MyDll.h"51Testing软件测试网 h,Us2J"LF
//这里我用了比较大小的函数代替了我要实现的函数51Testing软件测试网T|7c+? M+HQQpPIz
int desinit(int a, int b)
`%b~`L0Y]160173{51Testing软件测试网.Q6Z L;w`3Bf&WQ[ n
if(a>=b)return a;
ix#eZ7_D160173else
9`+CI"F5xOW7U160173return b;51Testing软件测试网$X/|a:o`s
}51Testing软件测试网:w;cFF P4Y1]
int desdone(int a, int b)
K _ Wr J160173{
!u4?g'y7\9j }160173if(a>=b)return b;
flQe4d&y"Q!y"U160173else51Testing软件测试网3z{?P C"JH$~
return a;51Testing软件测试网.b,s!p i \(J _&{L+W
}
M5hm(G&RJX'O(K160173该动态链接库编译成功后,打开MyDll工程中的debug目录,可以看到MyDll.dll、MyDll.lib两个文件。LIB文件中包含DLL文件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的"映像文件",与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要用到它。读者可能已经注意到在MyDll.h中有关键字"extern C",它可以使其他编程语言访问你编写的DLL中的函数。
PsEc hT160173LoadRunner调用动态链接库
)OBfS2~fK%C160173        上面完成动态链接库开发后,下面就介绍动态链接库如何被LoadRunner进行调用,其实也是很简单的。在LoadRunner中的DLL调用有局部调用与全局调用,下面介绍局部调用。
:ln@o)y160173首先把你编译的DLL放在角本路径下面,这里是MyDll.dll,MyDll.lib.然后在Action中使用
je&{-?4`lZE/i+x160173lr_load_dll("MYDll.dll"),此函数可以把DLL加载进来,让你调用DLL里面的函数,而DLL中的运算是编译级的,所以效率极高,代码样例如下:51Testing软件测试网 EaNAg0\ @ uh I
#include "lrs.h"51Testing软件测试网5D8^r h/\9W/iP
Action()51Testing软件测试网3u~rh#K/Z
{
W;XdWF{7Ps\160173        //51Testing软件测试网.O\0u5?Xu{2N4[0o u
        int nRet = 6;
?:N,bt,E'Y160173        char srckey[129];51Testing软件测试网8\D+u"]-E`
        memset(srckey, 'a', 128);51Testing软件测试网[t"M4\s|5Q
        lr_message(lr_eval_string(srckey));
Y4B[:[1c})X/l9m160173        lr_load_dll("MyDLL.dll");
JK p:gt)uSr160173        nRet = desinit(5,8);51Testing软件测试网4kwL7i zh
        lr_message("比较的结果为%d",nRet);51Testing软件测试网5n;nbS6iK;w2u A*V
    return 0;51Testing软件测试网:U2Y%y^;^\,A$LM
}
7mU3UHQn?9E160173运行结果
:{Z~B'A,sq160173        比较的结果为8
R'Am}g,b`I nfS160173
H x'y5|T3F;yu@160173        全局的动态链接库的调用则需要修改mdrv.dat,路径在LoadRunner的安装目录下面(LoadRunner/dat directory);在里面修改如例:51Testing软件测试网%uH/Y7s.R;O#o^
        [WinSock]
9fL,B?(Q160173ExtPriorityType=protocol51Testing软件测试网6k[ed#E3d:HZ
WINNT_EXT_LIBS=wsrun32.dll
as)N b)F y vH160173WIN95_EXT_LIBS=wsrun32.dll51Testing软件测试网!Qm c;qr.F;ji
LINUX_EXT_LIBS=liblrs.so51Testing软件测试网ux8k'H$^
SOLARIS_EXT_LIBS=liblrs.so51Testing软件测试网0i o3|G d"k3]'j
HPUX_EXT_LIBS=liblrs.sl
0x4gP [ QXOH160173AIX_EXT_LIBS=liblrs.so
/RV y&fI_o4@8^160173LibCfgFunc=winsock_exten_conf51Testing软件测试网 pcci'J?;m?S'Ml
UtilityExt=lrun_api51Testing软件测试网.Y M3yE b0m:I m
ExtMessageQueue=0
,h]+dVO!p)y160173ExtCmdLineOverwrite=-WinInet No
b?"H.cW:T160173ExtCmdLineConc=-UsingWinInet No51Testing软件测试网N,h-_@g8{x?MR
WINNT_DLLS=user_dll1.dll, user_dll2.dll, ...51Testing软件测试网{*K[8v] U\
//最后一行是加载你需要的DLL51Testing软件测试网3W}.dW%t9O/`gZ
        这样你就可以在LR中随意的调用程序员写的API函数,进行一些复杂的数据加密,准备的一些操作,进行复杂的测试。同时如果你觉的有大量高复杂的运算也可以放在DLL中进行封装,以提高效率


TAG:

kagrrahang's Net Home 引用 删除 kagrrahang   /   2009-05-20 10:28:46
此文章从rphf66119空间粘贴过来的!在此感谢rphf66119
 

评分:0

我来说两句

日历

« 2024-05-01  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 11780
  • 日志数: 22
  • 文件数: 1
  • 建立时间: 2008-01-09
  • 更新时间: 2011-10-22

RSS订阅

Open Toolbar