2023年12月16日发(作者:)

测试实践丛书

LoadRunner虚拟用户开发指南

陈绍英 金成姬 冯艳硕

Publishing House of Electronics Industry

北京·BEIJING

273

说明:

本文节选自《LoadRunner虚拟用户开发指南》。本书赠送陈绍英、金成姬两位老师共同开发的视频课程《LoadRunner性能测试快速入门》,您可以在阅读本书之前,先行学习此视频。 下载地址: /course/detail/507

本书互动网订购地址:/195440

本书卓越网订购地址:/dp/bkbk944864

本书豆瓣页面:/subject/3670408/

博文视点官方博客:/bvbook

博文视点读者信箱:reader@Runner虚拟用户开发指南

274

4.5.1 导出与封装C++类

使用动态链接库不但能导出全局函数,还能导出C++类以及类中的函数。但是导出的C++类及其中的函数仅适用于隐式加载DLL的调用方式,而不能直接用于LoadRunner的虚拟用户脚本中。想要用于显式加载或者虚拟用户脚本中,则须要进行一定的封装处理。

下面将介绍如何导出C++类、类中的方法以及如何把类或者类中的方法改造成LoadRunner可以调用的外部函数。

参照前面第4.2.1节的内容,新建一个空的“Win32 Dynamic-Link Library”项目,仍然把项目添加到当前工作空间中。项目创建完成后添加两个文件:头文件CppDll.h和程序文件。头文件CppDll.h中的代码如代码清单4-20所示,程序文件的内容如代码清单4-21所示。

接下来对程序内容进行分析。在头文件中,共声明了两个类SimpleTest与DrawTest。SimpleTest类包含两个方法:Add与SetDate;DrawTest类包含一个方法DrawCircle。

编译的时候,由于CppDll_API在源文件中已经定义成_declspec(dllexport),因此编译后DrawTest将被编译成一个导出类,SimpleTest将仅仅导出类中的一个方法Add。对于导出类DrawTest而言,它的public类型的方法将会全部被导出。

4-20 代码清单

LoadRunner虚拟用户开发指南

275

代码清单

4-21

编译工程CppDll,然后用Dumpbin命令查看的导出情况。可以看到,导出了类“??4DrawTest@@QAEAAV0@ABV0@@Z”、方法“?Add@SimpleTest@@QAEHHH

@Z”和类方法“?DrawCircle@DrawTest@@QAEXHHH@Z”,如图4-45所示。

图4-45 的导出信息

返回到前面的测试工程Win32DllApp,切换到ResourceView视图。打开对话框设计LoadRunner虚拟用户开发指南

276

界面,添加一个ID为IDC_BTN_DRAWCIRCLE的新按钮,并将其显示标题设定为“画圆”。接下来通过类向导来为按钮添加代码。在“画圆”按钮上右键点击

按钮打开类视图,切换到Message Maps标签,Object IDs选择IDC_BTN_DRAWCIRCLE,Message选择BN_CLICKED,然后点击右边的Add Function按钮。弹出添加函数对话框,如图4-46所示,单击“OK”按钮确认即可。

图4-46 通过类向导为“画圆”添加消息函数

按钮消息函数添加完成后,接下来连同加法按钮一同修改代码。“加法”按钮和“画圆”按钮对应的代码如代码清单4-22所示。

4-22 代码清单

编译Win32DllApp工程前,应该先把 与拷贝到其对应的工程目录下;然后设置其工程属性,在Link标签下添加对的引用。可以参照第4.3.1LoadRunner虚拟用户开发指南

277

节图4-26中的设置方法。

最后编译并运行Win32DllApp工程。在对话框窗口中点击“画圆”按钮,可以看到如图4-47所示的效果。

图4-47 “画圆”按钮执行效果

接下来探讨如何在LoadRunner脚本中使用。显然,无法直接供LoadRunner虚拟用户脚本使用,而这类问题在实际的虚拟用户开发中也非常常见。例如在实际工作中,开发人员经常会提供一些不太适合直接使用的动态链接库。解决这类问题的方式很简单,将这样的DLL在Visual C++重新封装即可。下面以为例来讲解如何封装导出内容以及在虚拟用户脚本中如何使用类中的内容。

首先修改一下CppDll.h中的内容,如代码清单4-23所示。修改后将会导出两个类中的全部函数。

代码清单

4-23

LoadRunner虚拟用户开发指南

278

然后编译工程CppDll。编译完成后在当前工作空间新建一个空的动态链接库工程CppLRDll,将工程CppDll编译后生成的 与拷贝到CppLRDll工程目录下。

接下来为工程CppLRDll添加一个C++源程序文件,打开后添加如代码清单4-24所示的代码。

4-24 代码清单

设置工程CppLRDll的属性,在Link标签下添加对的引用,可以参照第4.3.1节图4-26中的设置方法。设置完成后编译工程,编译成功后将会生成。

打开前面创建的虚拟用户脚本DllTest,然后将新生成的复制到脚本目录下。修改脚本Action部分内容如代码清单4-25所示。

代码清单4-25

如果这个时候编译脚本,将会看到下面的编译错误。这是因为并不包含Add与SetDate的实现,因为它们的实现封装在中。

Starting iteration 1.

Starting action Action.

Action.c(5): Error: C interpreter run time error: Action.c (5): Error --

File error : LoadLibrary() failed :

找不到指定的模块。

Action.c(5): Notify: CCI trace: Action.c(5): ci_load_dll(0x00b20584,

LoadRunner虚拟用户开发指南

279

0x00ef015e "").

Action.c(5): Notify: CCI trace: Compiled_code(0): Action().

Action.c(6): Error: C interpreter run time error: Action.c (6): Error --

Unresolved symbol : Add.

Action.c(6): Notify: CCI trace: Compiled_code(0): Action().

将工程CppDll编译生成的拷贝到DllTest脚本目录下。重新编译运行脚本,将会看到下面的正确运行结果。

Starting iteration 1.

Starting action Action.

Action.c(6):

Action.c(9): Today is 2008-4-16

Ending action Action.

Ending iteration 1.

通过这种方式,有效地解决了LoadRunner不能直接调用这类DLL的问题。读者可以自己在Win32DllApp工程中尝试显式加载,以调用其中的导出方法。

提示:对于自己开发的DLL,把DLL放到脚本的当前路径下之后,一定要通过File菜单下

把全部相关DLL文件添加到脚本中。这样在执行场景时Controller才会把DLL同步发送到远程主机上,否则远程主机上将会找不到动态链接库。

LoadRunner虚拟用户开发指南