LR自定义函数以及调用

2.2.自定义函数以及调用

2.2.1.虚拟用户编程,使用C# 语言DLL
  1. VS中建立DLL类库项目,编写函数时使用public声明;实现函数后编译生成DLL;
  2. LR中建立 .Net Vuser脚本工程,
  3. 1、手动增加dll的配置,将附加的DLL文件放入bin\references目录下,打开scripts.csproj文件,增加节点引入DLL;或者
  4. 2、使用vs2005打开(.Net3.5以下),vs自动给你增加这个dll的配置,注意用不匹配的VS打开项目时,不要对LR的工程文件进行单项升级,否则LR将不支持升级后的版本;
  5. Action中开始引用一下using 命名空间(DLL的命名空间名称);就可以在Actinon中调用命名空间下的函数方法了;在脚本中Add Files to Script加入Dll可以远程负载时调用,否则场景中若使用远程负载时,会提示错误。


2.2.2

LR调用VC++6.0动态链接库


   引言:  VuGen使用Web(HTTP/HTML)等协议编写脚本时,程序使用的为类C语言,这样的程序可以引用Win32 Dynamic-link Library动态链接库, 允许我们调用外部的DLL定义的函数。通过调用外部DLL中的函数,可以减少我们的脚本在整个运行期间内存消耗。同时,还有一个好处是可以对一些复杂的算 法进行复用,比如一个包括MD5加密、CRC32验证、文件压缩/解压、Base64编码的DLL。

 

VC6.0对DLL的支持:

     1、DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数(或变量、类)可供  应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。

    2、导出函数的声明方式: 

  • 一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。 
  • 另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下: 
    • LIBRARY 库工程名称 
    • EXPORTS 导出函数名 
    • DLL的调用方式:
      • 一种静态调用,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。 
      • 另外一种动态调用,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。 

步骤1-建立DLL工程:

打开VC++ 6.0,新建一个工程,这里先择工程类型为“Win32 Dynamic-link Library”,起一个工程名称,并选择好存方位置,在选择类型时选择“A DLL that exports some symbols。

   

步骤2-编写导出函数:

  1. 建立的.cpp文件中写入函数;
  2. .h文件中加入导出函数声明【extern "C" _declspec(dllexport) int func(int x);】,因为我们的loadrunner 的VuGen是一个C语言的解释器与编译器,只支持纯的C语言,不支持C++ ,所以,我们要在前面加“extern "C"”将函数转义成纯的C语言.
  3. 编译通过后工程下Debug/Release文件夹下有dll和lib文件生成;

步骤3-调试DLL:

  1. 在同一个工作区下建立win32 console application应用程序,
  2. 将上一步生成的.dll和.lib文件复制到该工程文件夹下;
  • .h文件中导入lib文件,导入函数;
  •  #pragma comment(lib,”MFC_dll.lib”) //告诉编译器DLL相对应的lib文件所在路径和文件名,[ ../]父目录,[./]当前目录;
  • extern “C”_declspec(dllimport) int _stdcall Add_new(int a,int b);//声明导入

    4. 在.cpp文件main函数中写入函数调用,编译执行;

 

步骤4-LR调用DLL:

 调用外部DLL的方法有两种:

  1. (单个脚本中)在脚本中是使用 lr_load_dll 函数。

lr_load_dll方法

  有了符合要求的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选项不要勾上。

  1. (全局设置,所有脚本)通过修改 mdrv.dat 文件实现。

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

3.  如何想查看DLL中是否有符合要求的导出函数,可以使用微软的SDK里自带的Dependency Walker工具。如图:

转载于:https://www.cnblogs.com/lunaG/p/6170400.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一个使用Python原生代码复现多元逻辑回归的示例,并封装成实体类以便调用自定义函数的方法: ```python import numpy as np class MultinomialLogisticRegression: def __init__(self, num_classes): self.num_classes = num_classes self.weights = None def train(self, X, y, learning_rate=0.01, num_iterations=1000): num_samples, num_features = X.shape self.weights = np.zeros((num_features, self.num_classes)) for i in range(num_iterations): scores = np.dot(X, self.weights) probabilities = self.softmax(scores) error = probabilities - y gradient = np.dot(X.T, error) self.weights -= learning_rate * gradient def predict(self, X): scores = np.dot(X, self.weights) probabilities = self.softmax(scores) return np.argmax(probabilities, axis=1) def softmax(self, x): exps = np.exp(x - np.max(x, axis=1, keepdims=True)) return exps / np.sum(exps, axis=1, keepdims=True) # 示例用法 X_train = np.array([[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]]) y_train = np.array([0, 0, 0, 1, 1, 1]) lr = MultinomialLogisticRegression(num_classes=2) lr.train(X_train, y_train) X_test = np.array([[1, 1], [5, 5]]) predictions = lr.predict(X_test) print(predictions) ``` 在上面的示例中,我们定义了一个`MultinomialLogisticRegression`类,该类包含了训练和预测函数。`train`函数用于训练模型,`predict`函数用于预测新样本的类别。 你可以根据自己的需求修改和扩展这个示例,例如添加正则化项、改变学习率等。 希望对你有所帮助!如果有任何疑问,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值