我们用 HTTP 协议做脚本,要注意的是,不同协议的函数是不一样的,假如换 websocket 协议,关联函数就要用其他的

参数化

原理

1、什么叫参数化

  把脚本内一个写死的值,去一个数组内取值,进行替换

2、为什么要参数化

  烂大街的回答:模拟真实场景,模拟真实情况

  真实原因:

应用程序/数据库对数据有唯一性要求(应用程序内就是单点登录;数据库内就是该字段为 Unique ,唯一)

避免查询缓存对结果造成失真(重复查询同一条数据,如果该数据的表内开启了查询缓存,则会命中。那么响应时间会比市价值偏小)

3、可不可以不用参数化

  查询缓存的开关是用query_cache_size = 20M和query_cache_type = ON 打开查询缓存,程序校验就得修改代码了,数据库唯一要求,把 Unique 的限制给拿掉就ok

如何参数化(参数化会变紫)

1、选中需要参数化的内容,右键,选择"Replace with a Parameter",

2、为参数命名,并且制定参数取值的文件格式

  Parameter name,就是我么那要设定的参数名,这个是不能重复的

  Parameter type 是参数取值的方式,这个 file 是从 .bat 文件中取值,这个文件会自动生成在项目路径下

结果:

例如:

web_submit_data("提交",
"Action=http://192.168.66.129/bbs/member.php?mod=register&inajax=1",
"Method=POST",
"TargetFrame=",
"Referer=http://192.168.66.129/bbs/member.php?mod=register",
ITEMDATA,
"Name=regsubmit", "Value=yes", ENDITEM,
"Name=formhash", "Value={formhash}", ENDITEM,
"Name=referer", "Value=http://192.168.66.129/bbs/forum.php", ENDITEM,
"Name=activationauth", "Value=", ENDITEM,
"Name={Name}", "Value=hua00{username}", ENDITEM,
"Name={pass}", "Value=123456", ENDITEM,
"Name={conpass}", "Value=123456", ENDITEM,
"Name={mail}", "Value=hua00{username}@qq.com", ENDITEM,
LAST);

另一种情况,我们要把另一个数值也运用之前同一个参数咋办?

另外,我们的参数化还有种方式:可以先建好,然后再脚本内用,这种情况适用于只给了脚本,但是没有给参数化文件的情况

打开变量列表,填写变量值

参数化变量和值是怎样对应的

根据脚本中的参数名({username})去找参数列表中的的参数username,再去找参数列表中的username对应的bat文件

注意,我们 loadrunner 的参数化默认是以 {} 为边界的,我们也可以修改这个参数化的边界类型:

在 Tools-->General Options-->Parameterization的Paramrter Braces 内可以设置,我们可以看到默认是 {}

参数化策略

  最常用的取值方式:唯一(Unique+XX)

我们写一个脚本来执行不同的参数化策略:

Action()
{
int i;  //申明变量
for (i = ;i<;i++) {  //循环
char *a = "{p1}";  //获取参数值传给 a
char *b = "{p2}";  //获取参数值传给 b
char *c = "{p1}";  //获取参数值传给 c lr_output_message("%s,\t%s,\t%s",lr_eval_string(a),lr_eval_string(b),lr_eval_string(c));
  //分贝演示 9 种不同的参数化策略组合结果
}
return ;
}

如下Loadrunner参数化取值策略由[select next row]、[update value on]两部分组成。各取值情况如下:

● Select next row(除去same as):顺序、随机、唯一

● Update value on:每次迭代、每次出现、唯一

Select next row 代表下一行要变更时,下一行取哪个值

Update value on 代表触发值变更的条件

取值策略简单理解就是:当触发值的变更值条件时,下一个取值怎么取,除去same as 这种取值,根据排列组合共有9种取值情况。

另外,我们可以测试单个参数的取值

如我们刚刚的脚本所示,我们来理解下,这几种策略的美妙之处:简单地,我们 p1 取 a1~a10,p2 取 b1~b10

取值结果如下图:

其他格式

  这个其实也是每次的值都不一样,值唯一,1~100,是 3 位的

  随机数  

  迭代内相同的值

  日期(可选格式)

等等……

特别说明

当update value on值为[unique]时,可设置[when out of values]、[Allocate Vuser values in Cotroller]值

when out of values:当值用完怎么办?

  Abort Vuers  退出

  Continue in a cyclic manner  从头开始取

  Continue with last value  一直用最后一个数

Allocate Vuser values in Cotroller,就是给每个 vu 分配的值个数

注意:

● 唯一+每次出现:不能自动分配(loadrunner不会读脚本,不知道脚本中的循环),只能手动分配

● 手动分配时要注意:计算每个用户分配多少个值、参数化文件中要录足够的值

计算手动分配时,为每个用户分配多少个值:

例1:银行流水号参数化,10个并发,跑10分钟,1个用户跑TPS=10,假如服务器的tps无限大

解:10个并发每秒跑的请求量:1*10*10=100

10个并发跑10分钟请求量:100*10*60=60000

10钟每个用户跑的请求数:60000/10=6000

则理想情况下为每个用户分配6000个值,考虑到实际可为每个用户分配6200个值。

例2银行流水号参数化,10个并发,跑10分钟,1个用户跑TPS=10,假如服务器的tps为50

解:10个并发每秒跑的请求量:1*10*10=100>服务器TPS。服务器处理不过来

以服务器最大TPS来处理

10个并发跑10分钟请求量:50*10*60=30000

10钟每个用户跑的请求数:30000/10=3000

则为每个用户分配3000+个值即可

连接数据库取值

1、选择好参数,点击 Data Wizard,如出现提示,点击 ok

2、选择到系统数据源

3、如果要连接 Mysql 还要安装驱动:https://dev.mysql.com/downloads/connector/odbc/

安装过程中如果遇到类似于ANSI问题,要将Windows>>system32>>msvcr100_clr0400.dll复制,改名为msvcr100.dll

安装即可成功。进入到 C:\Windows\System32 找到刚才安装的驱动。双击进入

然后在 loadrunner 内可以看到该连接

前面俩都可以瞎写,后面填写数据库的连接信息,可以 test 一下,说明正常连接上了数据库

之后就简单了:

  输入连接池的名称,以及 sql 语句

结果:取到了数据库的这些值

此方式比较麻烦,只适合装 X 使用

关联

1. 定义

  关联就是将服务器返回的动态的变化的一个值把它保存为一个参数,以供后面需要用到该值的请求进行使用。

2. 为什么要关联

  客户端发送的请求内,有某些动态值是由服务器返回并且在发送请求过程中会被服务器校验,不校验的值可以不用关联,比如一些时间戳

3. 哪些值需要关联

3.1经验判断

  1. 自己输入的值肯定不需要关联
  2. 常见的(1,0) (on,off) (yes,no) 空值 都不需要关联
  3. 90%以上都只会关联value,但有极少数情况下会出现关联key(key看起来不正经)
  4. 非自己输入的脚本里出现的参数是可能需要关联的

3.2根据关联类型判断

1)服务器校验提交请求的合法性(值的合法性、key的合法性)、正确性

  • 验证码要校正确性,常见验证码包括:图片验证码、邮箱验证码、手机验证码
  • 时间戳、token(手机)、session(http)要校验合法性

题外话:

  •  图片验证码怎么处理:万能验证码、验证码失效、找开发要验证码的实现逻辑(做正则)
  •  现在图片识别技术不成熟,有错误率
  •  token校验比session校验更安全,token更复杂

2)数据库类(值是int的数字,key是id类)

  • 插入操作的关联就是把insert这个表的必填字段补全,这个必填字段是跟其他数据的关联关系的字段一般是id,不要让你的数据是垃圾(无根之源的数据)

语法:

  insert into 表(字段,字段...) values (值,值...)

举例说明:

例1:insert into 户籍表("id","name","sex","bir","adr","fuid","muid")

------fuid,muid:来源于父母的户籍信息

------猜想:fuid,muid需要关联

例2:insert into 帖子表("自增id","msg","title","time","模块id","谁发的帖")

------猜想谁发的帖要关联,模块id看是否要求,time待定

● delete操作的关联就是补全where后面的条件值并且值是对的,这些条件值可能是一个也可能是多个

语法:

delete from 表 where xx = ??? and xx >= ???

------and/or

------>= ,<=, != ,in ,not in ,between

● update操作的关联就是补全where后面的条件值并且值是对的,这些条件值可能是一个也可能是多个

语法:

update 表 set xx=xxx where xx = ??? and xx >= ???

------and/or

------>= ,<=, != ,in ,not in ,between

● select操作的关联就是补全where后面的条件值并且值是对的,这些条件值可能是一个也可能是多个

语法:

select xx,xx from 表 where xx = ??? and xx >= ???

------and/or

------>= ,<=, != ,in ,not in ,between

题外话:

● 数据库简单定义

DDL:数据库模式定义语言,关键字:create

DML:数据操纵语言,关键字:Insert、delete、update

DCL:数据库控制语言 ,关键字:grant、remove

DQL:数据库查询语言,关键字:select

● int类型数字检索比char类型快很多

4. 关联位置放哪

哪个请求response中返回你想要用的那个值,关联函数就放在这个请求的前面。关联位置放哪,需要从应用程序和数据库角度去考虑。关联的值肯定是在触发校验请求之前给。如:seesion是在进入登录页面时给的,token是在登录后给的。

下面以注淘宝注册购物结束精简流程来说明关联的位置,例子比较粗糙,顺带说一下参数化。

● 注册

----参数化(用户名、手机号)

----关联(手机验证码,输入手机号点下一步时给)

● 登录

----参数化(用户名或手机号)

● 查看商铺详情

----参数化or关联都行(商品id,商铺id,避免缓存造成的结果失真)

----可能会记录谁在浏览,若记录就需要关联uid(最早在注册时给,后续登录也会给)

● 收藏商品

----关联(商品id,商铺id,uid),uid同上,商铺id,店铺id由商品列表返回)

● 加入购物车

----关联(商品id,商铺id,uid),uid同上,商铺id,店铺id由商品列表返回)

● 删除购物车

----关联(商品id,商铺id,uid),uid同上,商铺id,店铺id由商品列表返回)

● 结算

----关联(uid,商品id,店铺id)、delete购物车、update库存

● 查询订单

----关联(订单id,uid),订单id结算时返回,uid同上

5. 关联函数怎么写

5.1关联的5种方法

  1. tree视图右键关联
  2. tree视图获取左右边界,手写关联
  3. 扩展日志获取到服务器的返回结果,取到左右边界值,手写关联
  4. 抓包工具获取到服务器的返回结果,取到左右边界值,手写关联
  5. 通过查看页面源文件,到左右边界,手写关联

5.2关联值如果出现多个不同的关联边界,如何选取边界

  1. 选择出现次数多的
  2. 选择正经的(容易区分的)

5.3 tree视图右键关联操作

  1)tree视图下选中要关联的值,点击右键-->Create Paramter

  2)回到script视图,自动填写好关联函数,需要注意的是右键关联填写的边界值可能不对,需自己根据情况调整

5.4手写关联

知道边界值的情况下可以自己手写关联函数,手写关联可以用web_reg_save_param或者web_reg_save_param_ex函数,当边界值不需要用到正则表达式时,推荐用web_reg_save_param即可。下面演示用web_reg_save_param手写关联。

  1)点击【Insert-->New Step】

  2)输入web_reg_save_param并选择,点击ok

  3)填写匹配规则后点击ok

● Notfound: 当在返回信息中找不到要找的内容时应该怎么处理

  Notfound=error: 当在返回信息中找不到要找的内容时,发出一个错误讯息。这是缺省值。

  Notfound=warning: 当在返回信息中找不到要找的内容时,只发出警告,脚本也会继续执行下去不会中断。

● LB( Left Boundary ) : 返回信息的左边界字串。该属性必须有,并且区分大小写。

● RB( Right Boundary ): 返回信息的右边界字串。该属性必须有,并且区分大小写。

● RelFrameID: 相对于URL而言,欲查找的网页的Frame。此属性质可以是All或是数字,该属性可有可无。

● Search : 返回信息的查找范围。可以是Headers,Body,Noresource,All(缺省)。该属性质可有可无。

● ORD : 说明第几次出现的左边界子串的匹配项才是需要的内容。该属性可有可无,缺省值是1。如为All,则将所有找到的内容储存起来。

● SaveOffset : 当找到匹配项后,从第几个字元开始存储到参数中。该属性不能为负数,缺省值为0。

● SaveLen :当找到匹配项后,偏移量之后的几个字元存储到参数中。缺省值是-1,表示一直到结尾的整个字串都存入参数。

  4)关联函数写完

LoadRunner参数化&关联的更多相关文章

  1. [Loadrunner参数化]一个文件输两列参数的取值

    关于LoadRunner参数化的内容,在脚本开发中属于非常重要的一个知识点.关于这部分知识,在书上和网上到处都能找到,本篇只讲一种特殊情况:一个参数化文件为File类型,有多列值,如何进行参数化取值. ...

  2. LoadRunner 参数化之 连接数据库进行参数化

    LoadRunner 参数化之 连接数据库进行参数化 Loadrunner(简称“LR”)对性能测试的脚本进行参数化时,由于数据量偏大,大家往往都会把数据录入到数据库表里,然后关联到LR,本文将详细介 ...

  3. LoadRunner参数化时的各个选项说明

    LoadRunner参数化时的各个选项说明 分类: LoadRunner 2009-03-27 09:32 6294人阅读 评论(1) 收藏 举报 loadrunnerrandomgeneratore ...

  4. LoadRunner参数化详解

    LoadRunner参数化详解 距离上次使用loadrunner 已经有一年多的时间了.初做测试时在项目中用过,后面项目中用不到,自己把重点放在了工具之外的东西上,认为性能测试不仅仅是会用工具,最近又 ...

  5. Loadrunner参数化连接oracle、mysql数据源报错及解决办法

    Loadrunner参数化连接oracle.mysql数据源报错及解决办法 (本人系统是Win7 64,  两位小伙伴因为是默认安装lr,安装在 最终参数化的时候,出现连接字符串无法自动加载出来: 最 ...

  6. LoadRunner参数化MySQL

    准备:安装[msql-ODBC驱动] 一.配置数据源 1.Win7,打开控制面板-系统和安全-管理工具,点击“数据源(ODBC)”. 打开数据源(ODBC),在用户DSN选项卡中点击“添加”按钮,弹出 ...

  7. 【Loadrunner】Loadrunner 手动关联技术

    Loadrunner 手动关联技术 录制成功,回放失败,怀疑和动态数据有关: 1 重新录制一份脚本,两次录制的脚本进行比对,确定动态数据,复制动态数据: 2  找到第一次产生该动态数据的响应对应的相应 ...

  8. Loadrunner参数化如何在记事本中将参数值显示超过100个参数值

    Loadrunner参数化如何在记事本中将参数值显示超过100个参数值 1.loadrunner的参数值没有最大的限度, 可以修改C:\Program Files\HP\LoadRunner\conf ...

  9. Loadrunner参数化逗号报错解决方法

    Loadrunner参数化逗号报错解决方法     介绍Loadrunner参数化时,参数中包含有逗号时出错的解决方法. 在Loadrunner进行参数化时,参数中如果含有逗号,编辑保存后会报错: 此 ...

随机推荐

  1. 3.2 C++继承方式

    参考: http://www.weixueyuan.net/view/6359.html  总结: 子类继承父类,继承方式将限制父类的成员属性在子类中的访问权限,子类访问父类的成员,也需要遵循其成员的 ...

  2. linux系统安装tomcat详细配置

    1.通过ssh工具将apache-tomcat-7.0.85.tar.gz拖拽到 /home文件下 2.切换到/home 目录下 3.解压 指令 tar -zvxf apache-tomcat-7.0 ...

  3. doctype和Quirks模式

    doctype: 告诉浏览器使用什么模式去渲染页面,可能会影响页面的css渲染和js代码的执行. DTD :为了兼容旧的浏览器渲染方式,将DTD作为参数告诉浏览器使用什么模式渲染页面.始于IE6; 1 ...

  4. Java中泛型Class<T>、T与Class<?>

    一.区别 单独的T 代表一个类型 ,而 Class<T>代表这个类型所对应的类, Class<?>表示类型不确定的类 E - Element (在集合中使用,因为集合中存放的是 ...

  5. Oracle function和procedure

    1.返回值的区别 函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有 2. 调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用. 函数:一般情况下是用来计算并返回一个计算结 ...

  6. Appium Desktop 介绍及使用

    一.AppiumDesktop介绍 1.Appium-server的图形界面.可以设置选项.启动/停止服务器.查看日志等功能:且无须提前安装Node / NPM,因为Node运行时直接与Appium ...

  7. nginx——优化 Nginx worker 进程数

    Nginx 有 Master 和 worker 两种进程,Master 进程用于管理 worker 进程,worker 进程用于 Nginx 服务 worker 进程数应该设置为等于 CPU 的核数, ...

  8. hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

    基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化 ...

  9. Vue数组操作不刷新视图问题的解决

    最近使用Vue2.0开发项目,有一个列表使用v-for绑定到数组,按照Vue的推荐方案,使用push.splice.this.$set三个变异方法操作数组.发现在添加页面,三个方法都能及时刷新视图:但 ...

  10. java学习笔记15(String 类,StringBuffer)

    /* * String类的特点: * 所有的""都是String的对象 * 字符串一旦创建就是常量,不能改变 */ public class StringDemo { public ...