悟透LoadRunner - 调用外部DLL的点点滴滴

简介:

引言

当我们使用VuGen时,  允许我们调用外部的DLL定义的函数。通过调用外部DLL中的函数,可以减少我们的脚本在整个运行期间内存消耗。同时,还有一个好处是可以对一些复杂的算 法进行复用,比如一个包括MD5加密、CRC32验证、文件压缩/解压、Base64编码的DLL将是多么振奋人心啊。
    
    调用外部DLL的方法有两种:
  1. (单个脚本中)在脚本中是使用 lr_load_dll 函数。
  2. (全局设置,所有脚本)通过修改 mdrv.dat 文件实现。

对DLL的要求

       VuGen只能识别标准C编译的DLL, 所以使用VC6创建的函数必须在函数开头加上extern "C",它告诉编译器对这个函数按照标准C的方式进行编译。而如果你想调用C#编译出来DLL,那就只能望而却步啦。如何想查看DLL中是否有符合要求的导出函数,可以使用微软的SDK里自带的Dependency Walker工具。如图:
    
       

DLL的创建

    启动VC6,新建一个Win32 Dynamic-Link Library的工程,取名:LRDllTest
    在这里,我们创建一个简单的求和函数Sum,并什么为导出函数,关键代码如下:
    
    #define  LRDLLTEST_API __declspec(dllexport)
    extern   " C "  LRDLLTEST_API  int  Sum( int  a ,  int  b);
    // a + b
    LRDLLTEST_API  int  Sum( int  a ,  int  b)
    {
        
return  a  +  b;
    }

    编译,生成DLL:LRDllTest.dll

lr_load_dll方法

    有了符合要求的DLL,调用lr_load_dll函数显得非常的简单。lr_load_dll的函数原型是:
     lr_load_dll(library_name);
    所以,只需要调用该函数,传入需要引用的DLL路径,如果DLL放在脚本目录里,可直接写相对路径。这里,我推荐把该函数放在vuser_init这个Action里,一方面是由于vuser_init只会执行一次,如果我们放在中间的那个默认的Action中的话,DLL可能会被装载多次,这是没有必要的。另一方面,装载DLL也需要一定的性能开销,所以作为初始环境设置将它放在vuser_init中更加合理。
    调用lr_load_dll装载DLL后,就可以任意使用该DLL中的导出函数,而不需要再去做任何声明了。嗯,用起来的确很简单,VuGen中代码如下:
    
    vuser_init()
    {
        lr_load_dll(
" LRDllTest.dll " );
    
    return   0 ;
    }
    Action()
    {
        
int  a  =  Sum( 1 , 2 );
        lr_output_message(
" a = %d " ,a);
        
return   0 ;
    }

Load Generators调用远程机器进行加压时调用lr_load_dll的方法

    有人会遇到这种情况,使用lr_load_dll加载DLL的脚本在本机是可以顺利执行的,但是在Controller中通过负载生成器(Load Generators)调用远程机器执行脚本时,脚本会无法顺利执行,错误信息:
    Error: CCI security error:You are running under secure mode and the function ci_load_dll is not allowed in this mode.
    错误信息让人百思不得其解,不过能够猜到,肯定是远程机器无法调用加载的DLL所致。
    众里寻他千百度,暮然回首,解决办法其实是如此的简单:
    菜单“ File-Add file to script ”,把要引用的DLL加进来,一切搞定! 注意,Agent的Enable Firewall Agent选项不要勾上。

mdrv.dat方法

    这个办法比较毒,通过修改mdrv.dat文件,无需调用lr_load_dll即可使用该DLL任何导出函数。具体实施方法如下:
  1. 将LRDllTest.dll拷贝到LoadRunner安装路径的Bin目录下。
  2. 修改mdrv.dat文件(安装路径的dat目录下),因为选择的是默认的Web协议,所以找到[lrun_api]节点,在后面加上一句:
          WINNT_DLLS=LRDllTest.dll

    OK,再试试不使用lr_load_dll函数,直接调用LRDllTest.dll中的Sum函数吧!

    了解详细的内容请参考LR的帮助:HP LoadRunner Virtual User Generator User's Guide > Appendixes >Calling External Functions > Loading a DLL—Globally



本文转自CoderZh博客园博客,原文链接:http://www.cnblogs.com/coderzh/archive/2008/04/02/1135118.html,如需转载请自行联系原作者

目录
相关文章
|
测试技术 数据安全/隐私保护 C++
|
测试技术 数据安全/隐私保护 C++
LoadRunner 调用Dll完成加密解密
LoadRunner里的函数比较少,没有MD5、Base64加密。 我们可以通过在C++里把一些加解密写成函数,供LR调用。 DLL函数编写 C++里新建工程Class Library(此处是用VS2005,在VS6是:Win32 Dynamic-Link Library) 创建了一个叫LrLoadDll的工程,在LrLoadDll.
909 0
|
存储 测试技术
Loadrunner 脚本开发-利用Loadrunner生成Web service测试脚本
Loadrunner 脚本开发-利用Loadrunner生成Web service测试脚本
207 0
Loadrunner 脚本开发-利用Loadrunner生成Web service测试脚本
|
Java 测试技术 Android开发
Loadrunner脚本开发-基于HTTP协议的流媒体视频在线播放服务器性能测试
Loadrunner脚本开发-基于HTTP协议的流媒体视频在线播放服务器性能测试
298 0
|
XML 存储 测试技术
Loadrunner 脚本开发-soap_request函数介绍及WebService接口测试
Loadrunner 脚本开发-soap_request函数介绍及WebService接口测试
276 0
|
JSON 测试技术 数据格式
Loadrunner 脚本开发-利用web_custom_request函数进行接口测试
Loadrunner 脚本开发-利用web_custom_request函数进行接口测试
284 0
|
Oracle Java 关系型数据库
loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试
loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试
237 0
|
缓存 前端开发 中间件
loadrunner 场景设计-制定负载测试计划
loadrunner 场景设计-制定负载测试计划
274 0
|
监控 测试技术
软件测试面试题:LoadRunner分为哪三个模块?请简述各模块的主要功能?
软件测试面试题:LoadRunner分为哪三个模块?请简述各模块的主要功能?
233 0