【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);
备注:感谢亲爱的同事共享
由于必须取得返回内容和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);
备注:感谢亲爱的同事共享
相关文章推荐
- oracle单行函数
- lua函数递归
- HDOJ 4081 Qin Shi Huang's National Road System
- Hadoop源码分析之数据节点的握手,注册,上报数据块和心跳
- 将白色背景图片变透明
- Officescan 常用的端口
- Justep X5深度体验及点评(转载)
- android 增量更新之 服务端 附带java 调用示例
- XMLHttpRequest 及其open()的用法
- MFC picture控件中显示图片
- 抉择让一个人成长
- 安装和使用memcached
- cocos2d-x 入门——hello world 解析
- Oracle00-918:未明确定义列的错误
- java 面试 复习 II
- 2014-2-21
- MVC设计模式含义和优点
- hdu 1596
- get_called_class — 后期静态绑定("Late Static Binding")类的名称
- Java中ArrayList类详解