您的位置:首页 > 其它

【Loadrunner】解决如何实践中动态链运用接库DLL 的方法

2014-02-21 17:15 519 查看
问题背景:XXapi开发语言为c++,通信机制采用socket通信机制,采用Loadrunner中的socket录制模式虽然可以录制,但存在以下缺点:
由于必须取得返回内容和buffer的大小,Loadrunner会耗费较多时间进行检查,默认为10s,而由于该API目前处于调优中,虽然请求方法和参数一样,但数据的返回有可能动态变化进行传输(动态代表着数据大小有可能不同),故程序稍微有改动后,脚本重复开发的工作量大,而如果直接调用代码函数,将大大提高脚本编写的效率,提高可读性,降低重复工作率。如下面的代码:
send buf0 159
"刉泙"
"\xf1\x12"
"USER"
"\x00"
"{\n"
" \"Account\" : \"csmarapi\","
"\x1b\x00"
"aExInfo"
"\x1a\x00"
"Cuser"
"\x16\x00"
"AGuid"
"\x14\x00\xf3\x15"
"34FC6BEC-F2BC-4e33-97D3-A35F1690A3DA4"
"\x00"
"1Mac3"
"\x00\xf3\x02"
"00-E0-6F-03-64-F9 "

"\x00"
"rPassworX"
"\x00"
"\v"
"\x86\x00"
"郥oken\"
: \"\"\n"
"}\n"

解决方法步骤:
1. 查看api源代码,查看是否支持__declspec(dllexport)导出规则,如#define
GTAAPI_API__declspec(dllexport)。
查看源代码中的方法,我们可以看到API中的Authentication方法中使用了RecordSet类的实例,但是C语言不能使用类的实例的方法,因此我们需要解决这个问题。
RecordSet rcdset;

Authentication("xxx", "xxx", rcdset, "user");

2. 请求开发在c++ SDK DLL中再新建一个DLL,将RecordSet类的实例封装在调用的方法内,
Loadrunner调用这个testStress.Dll来实现测试,如下面的代码:
ifdef STRESSTEST_EXPORTS
#define STRESSTEST_API __declspec(dllexport)
#else
#define STRESSTEST_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
int STRESSTEST_API Authentication_Stess(const char* pName, const char* pPassword);
int STRESSTEST_API CallFunction(const char* pParamInfo);
#ifdef __cplusplus
};
#endif
3. 在loadrunner中新建C
Vuser 脚本。
4. File—>Add Files to Script—>选择C++
DLL。
5. 使用lr_load_dll
("SDK_CPP.dll")导入Dll。
6.在Loadrunner实现调用:

int nret,nretuser;
lr_load_dll("StressTest.dll");
//连接服务器
lr_start_transaction("连接");
nret=OpenSession_Stress("192.168.xx.xx",8800,90, 0, "{FileName}"); if(nret==0)
{
lr_end_transaction("连接",
LR_PASS);
lr_output_message("连接成功,标识码:%d",nret);
lr_start_transaction("登陆");
nretuser =Authentication_Stess("xxx", "xxx");
if(nretuser==0)

{
lr_end_transaction("登陆",
LR_PASS);
lr_output_message("登陆成功,标识码:%d",nretuser);
}else
{
lr_end_transaction("登陆",
LR_FAIL);
lr_error_message("本次登录失败,标识码:%d",nretuser);
}
}
else
{
lr_end_transaction("连接",
LR_FAIL);
lr_error_message("本次连接失败,标识码:%d",nret);
}

lr_output_message("FileName=%s",lr_eval_string("{FileName}"));

lr_think_time(30);

备注:感谢亲爱的同事共享
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: