LOADRUNNER中的一个关联技巧

    众所周知,在LoadRunner中,关联是一个很重要的动作,大多数的脚本在录制完成后并不能直接回放,需要通过一定的关联才能成功回放。关联的技巧有很多,这里介绍的就是其中之一,以下用一个实际的例子来说明。
    脚本的背景如下:
    web_submit_data("classiLoanMaterial.jsf_2")(web_submit_data函数的其它部分省略,下同。)返回的页面上可能存在多条记录,可能一条,可能两条,也可能三条,等等。我们需要将这些记录逐个选中进行操作。注意:不是全部选中,而是要逐条记录进行操作。同时,每一条记录各有一个编号,这是需要进行关联的值。在下面的操作中web_url("directAdjust.jsf",
        "URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
classiadjuststepbystep/directAdjust.jsf?approveFormNum=123456")需要使用到该编号,即黑体字部分的值。面对这样的目的,很自然地,我们会想到用一个循环语句来实现。首先,在classiLoanMaterial.jsf页面之前加一个关联如下:
    web_reg_save_param("sor","LB=sor\" value=\"","RB=\"","Ord=ALL",LAST);将Ord参数值设定为ALL,则关联函数将自动把符合条件的关联值保存到参数数组里。在本例中,假设关联值返回三条记录,则LR分别将值保存到sor_1,sor_2,sor_3中,同时,LR还将自动创建一个sor_count变量来保存总的记录数,在这里sor_count值等于3。利用这些信息,我们就可以很方便地在循环语句中实现我们的目的了。步骤如下:
1、声明各变量:
    int count;
    int i;
    char sor[50];
    char sorvalue[50];
2、将返回的记录数保存到count变量里:
count=atoi(lr_eval_string("{sor_count}"));
3、使用for循环:
for(i=1;i<=count;i++)
{
    sprintf(sor,"{sor_%d}",i); //分别将各个sor值保存到sor字符串中

    sprintf(sorvalue,"%s",lr_eval_string(sor));//通过lr_eval_string函数将字符串赋给sorvalue变量

}
4、在循环体中使用关联值替换相关值:
web_url("directAdjust.jsf",
        "URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
classiadjuststepbystep/directAdjust.jsf?approveFormNum={sorvalue}")
 
    一切看起来似乎顺理成章,然而如果按照以上的步骤做下来,将会很遗憾地发现:我们定义的{sorvalue}值根本就不被LR认可并接受,于是它将无情地给我们抛出一个错误,说该值是非法的。怎么办?难道我们前面做的一切都白费了吗?
    有句老话说得好:天无绝人之路。聪明而又善良的LR开发团队已经为我们考虑到了这个问题,给我们预备了一个很有用的函数:lr_save_string,它可以帮助我们解决这个问题。于是我们祭出lr_save_string这道最后的杀手锏:
5、在使用关联值之前进行字符串格式转换:
    lr_save_string(sorvalue,"sorvalue1");
    
web_url("directAdjust.jsf",
        "URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
classiadjuststepbystep/directAdjust.jsf?approveFormNum={sorvalue1}")

需要特别注意lr_save_string的用法,它是参数值在前(sorvalue),参数名在后("sorvalue1"),这和一般的习惯用法正好反过来(真是好奇怪!)。而且"sorvalue1"这个参数名称不需要事先声明,它只是一个字符串而已(这也比较奇怪!^_^)。

到此,我们总算大功告成!脚本回放成功,并且正确达到了预期的效果!打完收工!

总结:C的变量不能直接在LR的API里调用,所以必须用lr_save_string进行转换。

最后顺便说一下,lr_save_string这个函数真的很好用,这个例子中提到的方法也适用于另外一些情况,比如说有时候,通过关联函数出来的值我们不能直接使用,还需要做一些特殊的处理时,那么我们可以把关联得到的值取出来,赋给一个字符串,对其进行一番修剪加工后,再用lr_save_string,就可以使用它来替代需要关联的值了。

后记:我的这篇文章发布在网上以后,在广大的测试同行中间引起了强烈的反响,他们纷纷发来贺电和表扬信,对我这种勇于探索、乐于分享的精神给予了充分的肯定。^_^当然,这中间也难免存在极个别的不和谐声音,例如Zee同学就对我的这篇文章提出了不同看法,他觉得我的做法是把简单的问题复杂化了,理由是可以只做一次关联,每次只取第一笔记录即可,当循环进行操作时,第一笔做完以后,第二笔记录自然会上升到第一笔记录的位置,因此没有必要使用关联数组。我认为他的疑问并非没有道理,而且是比较有代表性的,因此我在这里做一个补充说明。在我接触过的大多数应用系统中,确实都是按照Zee所说的方式进行处理,在这种情况下,脚本的处理的确没有必要像我以上所述的那样复杂。不过我在本例中谈到的例子比较特殊,在操作完成后,它只是把每笔记录的状态位由“未完成”修改为“已完成”,而原有的记录并没有消失,而是仍然停留在原有的位置,此时如果按照Zee所说的方法,那么在执行第二次循环时,LR将取到操作状态为“已完成”的第一笔记录,而不会取到下一笔未完成的记录,显然这是不符合我们的要求的,因此在这里我需要做以上这样复杂的一个处理。

lr关联-保存数组并调用(转)的更多相关文章

  1. JavaScript--数组--关联(hash)数组

    关联(hash)数组的原理: hash算法: 接收一个字符串,计算出一个尽量不重复的序号 不同的字符串,计算出的序号尽量不同 相同的字符串,计算出的序号一定是相同 存入数据时: 将自定义下标名称交给h ...

  2. 对LR关联的一些理解

    从接触LR关联的迷茫,到现在略有感悟,小记期间的一些理解. 一开始认识关联是在LR自带学习例子,需要关联session,也知道了自动关联,手动关联以及边录制边关联. 在使用关联的过程中,也学习了web ...

  3. Atitit main函数的ast分析  数组参数调用的ast astview解析

    Atitit main函数的ast分析  数组参数调用的ast astview解析 1.1. Xxcls.main(new String[]{"","bb"}) ...

  4. PHP保存数组到文件中的方法

    ThinkPHP自3.1以后的版本,F函数保存数组时先序列化后再保存到文件中,因为我需要使用C方法来读取自定义配置文件,故需要把PHP数组保存到文件中以便C方法读取,PHP保存数组到文件的方法如下: ...

  5. 性能测试基础---LR关联2

    ·LR中的关联函数详解.在LR中,用于关联的函数一般有以下四个:web_reg_save_param 是通过字符串查找的方式来查找获取数据.web_reg_save_param_ex 是通过字符串查找 ...

  6. 性能测试基础---LR关联

    ·什么时候需要做关联?一般来说,在脚本运行出错的时候,我们就可能需要进行关联处理. ·脚本出错分为两种情况: ·直接回放出错(失败).通常来说,如果录制成功,回放失败,排除数据的唯一性约束之后,那就必 ...

  7. Android使用SharedPreferences保存数组

    核心原理: 对象序列化 步骤 1.要保存的对象实现序列化Serializable 2.将序列化的对象保存String(本文的做法是保存为byte数组在转为16进制的String类型保存起来) 3.将保 ...

  8. PHP保存数组到数据库

    数组是 PHP 开发中使用最多的数据类型之一,对于结构化的数据尤为重要. 很多时候我们需要把数组保存到数据库中,实现对结构化数据的直接存储和读取. 其中一个案例就是,对于 Form 提交的多选 che ...

  9. vue 保存数组和对象, 避免双向绑定影响

    很多时候需要保存数据然后复用该数据,因vue的双向绑定总是不能保存原始数据 随笔记录解决方式 1. 不要把变量放置在data中 2. 保存至新的变量 object :   let obj= Objec ...

随机推荐

  1. 【转】QT事件传递与事件过滤器

        [概览] 1.重载特定事件函数.    比如: mousePressEvent(),keyPressEvent(),  paintEvent() .     2.重新实现QObject::ev ...

  2. Distributed1:链接服务器

    链接服务器(Linked Server)允许访问针对OLE DB数据源的分布式异构查询, 通过使用sys.sp_addlinkedserver创建链接服务器后,可以对此服务器运行分布式查询. 如果链接 ...

  3. 在Docker中安装和部署MongoDB集群

    此文已由作者袁欢授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在Docker中安装mongodb 采用的mongodb镜像:https://registry.hub.doc ...

  4. 没听说过这些,就不要说你懂并发了,two。

    引言 为了更加形象的描述并发的基础知识,因此本文LZ采用了园子里一度大火的标题形式——“没听说过XXXX,就不要说你XXXX了”.希望能够给猿友们一个醒目的警醒,借此来普及并发的基础知识,也讨论一下这 ...

  5. Jmeter+ant+jenkins接口自动化测试 平台搭建(三)

    四.报告优化 Jmeter 默认生成报告不是很详细,因此我们需要进行优化.这里我们使用新的报告模板:默认的报告模板是 jmeter-results-detail-report_21.xsl 先上效果图 ...

  6. git push失败

    不知道弄错了什么上传项目到github上失败 git commit的时候提示 On branch masternothing to commit, working tree clean git pus ...

  7. 基于Redis实现分布式锁(续)

    代码实现: redis实现分布式锁(lock:通过间隔时间段去请求Redis,来实现阻塞占用,一直到获取锁,或者超时. unlock:删除redis中key)

  8. 零基础学Python之结构化数据(附详细的代码解释和执行结果截图)

    3结构化数据 字典(查找表).集合.元组.列表 3.1字典 是有两列任意多行的表,第一列存储一个键,第二列存储一个值. 它存储键/值对,每个唯一的键有一个唯一与之关联的值.(类似于映射.表) 它不会维 ...

  9. vi/vim命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/mondol/p/vi-examples.html 进入vi vi filename # 打开或新建文件,并将光标置于第 ...

  10. ltrace命令详解

    原文链接:https://ipcmen.com/ltrace 用来跟踪进程调用库函数的情况 补充说明 NAME       ltrace - A library call tracer ltrace命 ...