精华内容
下载资源
问答
  • 使用JMeter进行Web 性能测试 - 检查点、关联和参数化

    1. 检查点

    JMeter通过断言组件来实现测试结果正确性验证。断言组件获取服务器的响应数据,根据断言规则匹配这些响应数据,匹配到,正常;匹配不到,则断定为失败。下面的例子是通过响应断言判断用户是否登录成功,登录成功后,响应的数据,即html中有一个 <a id="logout" ></a>的元素,通过判断是否存在id="logout" 可以判断是否登录成功。

    1)成功登录的响应数据


    2)定义响应断言


    2.关联

    后置处理器是JMeter的关联组件,可以从服务器响应数据中查找到需要的数据。常用的是正则表达是提取器(Regular Expression Extractor),下面的例子是利用正则表达式提取器提取论坛版块的列表。

    1)利用正则表达式验证工具验证正则表达式的正确性


    2)创建一个正则表示提取器


    如上图所示,定义提取第1组模板的第1个值。在下一步可以用${moduleID_g1}来获取这个值,这样就实现了关联,如下图所示。


    3.参数化

    JMeter的配置组件,可以实现参数化。下来的例子使用CSV Data Set Config 来实现真实模拟多个用户登录。

    1)定义CSV  Data Set Config


    2) CSV 参数文件,UTF-8格式,如果出现问题,有可能是 UTF-8 + BOM



    3)使用参数





    展开全文
  • 一、关联步骤 1、定位到登录事务 2、userSession的value是122711.999189955zDVVQQiptfiDDDDDDHiHVpQQAHf(可变) 3、复制,到上一步web_url函数点击切换到treeview,在response页面寻找刚刚复制的value 4、在/Web...

    一、关联步骤

    1、定位到登录事务
    2、userSession的value是122711.999189955zDVVQQiptfiDDDDDDHiHVpQQAHf(可变)
    3、复制,到上一步web_url函数点击切换到treeview,在response页面寻找刚刚复制的value
    4、在/WebTours/nav.pl?in=home这个path里面找到了
    5、复制name=userSession value=122711.999189955zDVVQQiptfiDDDDDDHiHVpQQAHf>
    6、以注释的方式(“//”)粘贴到scriptview中的web_url函数上方
    7、在语句下方输入如下代码:
    web_reg_save_param(“session”,
    “LB=name=userSession value=”,
    “RB=>”,
    LAST);
    解释:LB为左边界,RB为右边界(相对value来说)
    8、用{session}替换事务脚本中的value值

    二、参数化步骤:

    1、右键需要参数化的value
    2、选择Replace with a parameter
    3、在Parameter name输入框中输入参数名称(一般以name名称命名)
    4、点击ok,设置参数完成
    5、点击ctrl+L,打开parameter list,展示刚刚设置完成的参数名
    6、在脚本的根目录新建一个dat文件,里面存上需要替换的值(如果脚本存放在桌面,那么直接在桌面上新建),如城市名称

    三、dat文件创建步骤

    1、新建一个文本文档,文档以参数命名(如:city)
    2、第一行为参数名(如:city)
    3、第二行开始每行一个参数值
    4、最后一个参数值后面点击回车键另起一行
    5、点击保存,并将文件扩展名改为dat

    展开全文
  • 1.什么是关联技术? 在很多在流水上的工作,第一步工序不做,第二步工序做不了的 所以,一定是先把第一步完成,才能做的工作 什么是关联?不同请求之间有关系—有值需要传递 一般有验证的接口,都是需要token值的...

    jmeter脚本优化技术

    在这里插入图片描述
    1.什么是关联技术?
    在这里插入图片描述
    在很多在流水上的工作,第一步工序不做,第二步工序做不了的
    所以,一定是先把第一步完成,才能做的工作

    什么是关联?不同请求之间有关系—有值需要传递

    一般有验证的接口,都是需要token值的
    可以先用获取token的接口
    
     什么是token?
           token:手牌(去洗澡的时候,会有一个柜子,然后会给你一个手牌。)
           获取token:需要身份:账号密码
           优势:如果没有token机制的话,所有的接口,都需要去数据库校验---耗时间---效率低
           token使用的地方:1.请求头;2.cookie
    

    2.什么时候需要关联技术?

    • 请求之间数据的传递

    3.怎么实现关联技术?

    • 获取上一个请求的值

       json提取器
           响应一定是json格式,才可以。
               什么json?什么是字典?
                   json是字符串,是键值对形式的字符串
                   字典:数据类型
       正则表达式提取器
           万能法。(.*?) ---可以使用一些网站上的工具
       beanshell提取方式
      

      把这个变量给下一个请求用

      前置处理器:请求执行之前运行的
      使用场景:加密数据,导入外部的java jar class(连接数据库是config做的,有前置的概念。不是这里的)
      后置处理器:请求执行之后处理的
      使用场景:提取响应数据;对请求之后的数据处理

    关联技术

    1.正则表达式提取器
    在这里插入图片描述
    2.json提取器
    在这里插入图片描述

    需求:要写一个秒杀的脚本,秒杀的接口需要先登录

    • 先在测试计划(秒杀系统)里面建一个线程组

    • 在线程组—>取样器—>HTTP请求(改名为:获取token)

      密码的传参是这样的:键:password 值:md5(“zr”+密码+“hg”) 是加了盐的md5加密
      在这里插入图片描述
      复制完了之后,就直接粘贴在这里
      在这里插入图片描述
      因为获取token这个接口,是有固定的传参类型的:Content-Type: application/x-www-form-urlencoded

    • 所以我们要添加一个请求头:HTTP请求头管理器

    在这里插入图片描述
    如下:添加HTTP请求头管理器
    在这里插入图片描述

    • 下面可以加一个监控元件,就看一下请求有没有成功。用到察看结果数

    在这里插入图片描述
    经测试,一个请求是可以通的
    在这里插入图片描述

    现在是一个请求,是正常可以搞定的。下面我们要聊的是关联,还要一个秒杀的接口来关联

    • 再添加一个请求:秒杀操作

    因为秒杀的接口,和登录的接口是同一个项目。里面的这些数据就不需要在填一次了。
    在这里插入图片描述
    写脚本的时候,一定要考虑到维护性,而并不是一味的去重复写

    • 所以要用到请求默认值,包括ip地址,要用参数化做。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这个里面写了之后,后面请求里面就不用写了(登录和秒杀的接口就不用写了)

    • 这时,发现IP地址最好做成参数化。因为测试环境和生产环境都做性能测试的话,这时ip地址是不一样的。所以为了便于维护,最好做参数化
      添加用户定义变量

    在这里插入图片描述
    在这里插入图片描述
    下面调用的时候就是这样写
    在这里插入图片描述

    秒杀操作里面,需要传token值,这个值是登录接口里面获取到的
    此时,我们需要将登录接口里面的token拿出来,给这个接口用
    现在就是这么把这个token值拿出来
    在这里插入图片描述

    $.data
    json的根目录:$
    获取对应的键的值:。键(用.键调用对应的值)
    

    在这里插入图片描述

    现在这么把这个值传递出去?

    • 可以通过对请求添加,后置处理器,json提取器来实现

    在这里插入图片描述
    因为要提取获取token这个请求的返回值,所以只能放在这个请求下面
    在jmeter里面牢记3个字:作用域(就像py里面的缩进)
    顺序是没有关系的

    Names of created variables: 这个填变量名,这个变量存放你提取到的数据(不要用abc什么的)
    JSON Path expressions:这边就刚刚测试成功的表达式(这里是$.data)
    Match No. (0 for Random): 0代表随机,-1是全部,正数1是取第一个,2就是取第二个(这个就一个,写1就行)
    Compute concatenationvar    Default Values:这个是默认值,就是没取到的话,就用这个值。(就像py里面的字典,通过get去取值,可以设置一个默认值)
    

    取多个值的话,要以分号隔开
    在这里插入图片描述

    • 接着,我们可以用debug调试器,看一下我们这样是不是能获取到token值

    在这里插入图片描述
    这个调试器的目的就是调试用的,就像我们ide里面的debug一样
    在这里插入图片描述
    如果是可以拿到值的,在debug调试器里面会有一个get_token的值
    调试器的作用就是在给下一个请求之前,可以测试一下有没有拿到这个值,作为调试用。用完,禁用掉就行

    现在提取到token了,在下一个接口用就行了
    在这里插入图片描述
    在这里插入图片描述
    这样就通了

    当然我们也可以用正则来处理
    我们先把json提取器禁用掉
    在这里插入图片描述
    在这里插入图片描述
    一般写正则的时候,就是把响应复制过来,直接把想要的数据复制过,把想要的数据用(.+?)或(.*?)代替

    "data":"0a729cc3924b4913bac146e435b146e0"变为"data":"(.+?)"
    模板:取一个的话写:$1$
    匹配数据:写1
    

    在这里插入图片描述
    在这里插入图片描述

    但是在工作中,好多接口的响应是层层嵌套的
    比如
    在这里插入图片描述
    要提取这个里面的“goodsName”
    返回值如下:

    {
        "msg": "成功",
        "code": 0,
        "data": [
            {
                "goodsImg": "\/img\/iphonex.png",
                "miaoshaPrice": 0.01,
                "endDate": "2020-12-25T23:27:11.000+0000",
                "goodsPrice": 8765.0,
                "goodsTitle": "Apple\/苹果 iPhone X 苹果x 苹果10手机 iphonex正品分期免息",
                "id": 1,
                "goodsName": "iphoneX",
                "goodsDetail": "Apple\/苹果 iPhone X 苹果x 苹果10手机 iphonex正品分期免息",
                "startDate": "2020-02-24T23:23:58.000+0000",
                "goodsStock": 10000,
                "stockCount": 9
            },
            {
                "goodsImg": "\/img\/iphone11.png",
                "miaoshaPrice": 0.01,
                "endDate": "2020-12-25T23:27:11.000+0000",
                "goodsPrice": 3212.0,
                "goodsTitle": "苹果11 Apple\/iPhone 11苹果手机中移动2019新款全网通智能手机",
                "id": 2,
                "goodsName": "iphone11",
                "goodsDetail": "苹果11 Apple\/iPhone 11苹果手机中移动2019新款全网通智能手机",
                "startDate": "2020-02-24T23:23:58.000+0000",
                "goodsStock": -1,
                "stockCount": 10
            },
            {
                "goodsImg": "\/img\/iphone8.png",
                "miaoshaPrice": 0.01,
                "endDate": "2020-12-25T23:27:11.000+0000",
                "goodsPrice": 5589.0,
                "goodsTitle": "Apple\/苹果 iPhone 8 Plus 全网通4G智能手机iphone8plus 苹果8p",
                "id": 3,
                "goodsName": "iphone8",
                "goodsDetail": "Apple\/苹果 iPhone 8 Plus 全网通4G智能手机iphone8plus 苹果8p",
                "startDate": "2020-02-24T23:23:58.000+0000",
                "goodsStock": 10000,
                "stockCount": 10
            },
            {
                "goodsImg": "\/img\/iphonexr.png",
                "miaoshaPrice": 0.01,
                "endDate": "2020-12-25T23:27:11.000+0000",
                "goodsPrice": 3212.0,
                "goodsTitle": "Apple\/苹果 iPhone XS Max 苹果xsmax苹果XR美版4G国行双卡手机8X",
                "id": 4,
                "goodsName": "iphoneXS",
                "goodsDetail": "Apple\/苹果 iPhone XS Max 苹果xsmax苹果XR美版4G国行双卡手机8X",
                "startDate": "2020-02-24T23:23:58.000+0000",
                "goodsStock": 10000,
                "stockCount": 10
            }
        ],
        "tag": "松勤教育"
    }
    

    想要取到iPhonex,这样写:

    $.data[0].goodsName     (如果想要随机取,就把这个数字用随机数去做)
        $.data   :获取到data对应的所有值,返回的是列表
        $.data[0]    :取列表里面的第一个元素。又是一个字典
        $.data[0].goodsName     :通过键goodsName取到goodsName对应的值
    

    在这里插入图片描述
    就是:字典通过:.
    键;列表通过[索引]

    • 如果想要随机的取出一个手机型号的话可以这样实现:
    $..goodsName
        就是找出第二层所有的goodsName对应的值
        这个点,跟数据结构有关系。有几层,就几个点。如果嵌套嵌了好多层,该几个点就是几个点
    

    在这里插入图片描述
    在这里插入图片描述

    补充:
    关联的最核心是拿到上一个接口的值,给后面的接口使用

    消息体里面有中文的话,加utf-8

    在这里插入图片描述

    增加断言
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    上图这里填-1的话,就是获取全部
    在这里插入图片描述
    在这里插入图片描述

    参数化技术

    在这里插入图片描述
    在这里插入图片描述
    参数化的核心:用变量来替代常量
    哪些场景需要参数化:登录,很多单点单点登录的网站,就是一个用户只能在一个地方登
    在这里插入图片描述
    新增的用户,手机号码不能一样,所以要做参数化

    最常见的就是用**__Random**函数来做
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    账号密码要做参数化用csv来做,比较简单一点
    就是通过配置文件来做
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这样就实现了CSV的参数化
    默认是按照顺序取的

    有参数化的数据要加密,可以这样思路
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    用时间戳做参数化的时候,里面可能有大坑

    高并发的时候是都一样的,同一秒发出去的时间是一样的
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    上面的时间戳是毫秒级别的,想要秒级别的,这样写

    ${__time(/1000,)    (在原来的基础上除以1000)
    

    上面的同步定时器:请求要做高并发的话,就把这个同步定时器的元件,放在这个作用域里面。

    为了避免上面的这个问题:要么在拼凑随机数,要么用count计数器
    在这里插入图片描述
    每次调用就会生成1,2,3,4.。。(尴尬的是,如果被参数化的数据,有位数限制,就不太行了)

    展开全文
  • 最近几天,按照项目需要突击学习下LoadRunner。...基于已有的RPT经验基础知识,从LR理论基础向项目实践转变。功夫不负有心人,第一个LR脚本终于能够跑通并且完成了表单的提交。尽管脚本比较简单(只有15个transacti

    最近几天,按照项目需要突击学习下LoadRunner。本人有Rational Performance Test的脚本录制经验,但是对LR从没有接触过,花了两天时间看完了虫师的LR博客,通俗易懂收益良多。值得初学者学习的文档。

    基于已有的RPT经验和基础知识,从LR理论基础向项目实践转变。功夫不负有心人,第一个LR脚本终于能够跑通并且完成了表单的提交。尽管脚本比较简单(只有15个transaction),但是麻雀虽小五脏俱全,它也包括了参数化,手动关联等。这些也是保证脚本能够在多用户下正常运行最基本也是最重要的东西。

    在RPT的影响之下,难免向把LR和RPT进行比较,由于我接触LR时间比较短,有可能我理解的不够全面,请各位高人指正!

    LR比RPT方便的地方(优点):

    1. LR支持多语言,C,Java等,但是RPT只支持JAVA。
    2. LR手动增加transaction和action更加方便。
    3. LR可以直接修改.C文件(C语言),但是RPT不能直接修改文件并直接保存,需要代码时间重新打包(这点会在另外的博客解释)。
    4. LR参数化的形式更加多元化,文件,日期,随机数等等,在选择同一行的参数时,可配置的选项比较多,产生的效果也更加丰富。
    5. 个人感觉,LR运行速度比RPT快,主要原因LR分为generator,controller 和 analysis, 而RPT是三者结合在一起,并且RPT使用java也会吃大量的内存。

    LR不如PRT的地方(主要针对关联和参数化的缺点):

    1. LR通过比较两次录制脚本的不同找到需要关联的地方,人为确定左右边界等参数,通过web_reg_save_param(现在有新的函数web_reg_save_param_ex)完成关联,而RPT无需确定左右边界参数和添加任何函数,RPT可以找到所有的reference供使用者选择想要的reference。
    2. LR关联之后关联部分显示的是reference内容(是web_reg_save_param函数的一个变量),而RPT只是将关联部分更改颜色,不会将原始值改变。LR这样做的不好之处是,在建立关联之后,假如你想取消关联返回原来的参数值,那么你需要花费一段时间找到原来的值(我是去data文件下找当时的录制脚本,是不是很麻烦),而PRT可以简单地点点鼠标取消关联,原来的参数还在那里,不用去找。
    3. LR在建立好关联之后对相同的多个元素进行关联(就是你关联了一个,现在把所有相同的元素都关联上),此时我们无法选择哪个元素可以关联哪个元素不要关联,只能关联所有,而RPT会把所有的关联显示出来,让你自己选择关联哪些相同元素,当然也有全选。(这点我可能需要再确认下)。
    4. LR参数化整体做的还是不错的,只是在对多个相同元素进行参数化时同样是只能全部替换,不能手动选择需要改变哪些,不改变哪些。

    以上是个人的一点点经验,由于接触LR时间比较短,可能有许多不妥之处,希望各位高人指正,万分感谢!

    转载请回复作者并注明出处。

    展开全文
  • loadrunner参数化和关联

    2018-03-30 18:21:00
    Tools下面有个General Options,下面有个Display标签,勾上Show run_time viewer,回放的时候会出现右边的浏览器,如果输入的参数在某个场景时错误会把错误的信息打印出来,通过下图设置可以把参数化关联的值打印...
  • 参数化脚本 选择需要参数化的内容右键(以登录名为例),选择【替换为参数】。 输入参数名称,点击【确定】按钮,可将登录名参数化。同理参数化密码等其他内容。 关联登录名密码: 选中已经参数化的密码...
  • 一、关联的意义 1.关联的含义  关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应... 其实关联也属于一同特殊的参数化,只是与一般的...
  • 参数化和关联的区别

    2014-07-23 18:31:00
    ①数据处理的方式不同 参数化的数据是由客户端向服务器提交的,而关联是需要获取服务器返回给客户端的数据。在参数化时候,参数化的数据会通过web_submit_data提交到服务器,关联的数据是从服务器返回给客户端的,是...
  • jmeter参数化关联

    2021-01-14 19:38:44
    参数化: 指对每次发起的请求,参数名称相同,参数值进行替换,如登录三次系统,每次用不同的用户名密码。 关联: 与系统交互过程中,系统返回的内容,需要在接下来的交互中用到,如防止csrf攻击而生成的Token ...
  • 接口关联字段提取提取任意字段方法首次测试提取token判断提取字段长度登录接口提取token处理异常返回数据为空再从测试提取token正常登录 获取token没有提取到token参数的传递参数传递的前期准备工作获取用户信息...
  • jmeter试用记录-参数化和关联

    千次阅读 2014-12-05 15:36:00
    一般来说,用录制功能录制的脚本都需要经过编辑,性能测试脚本的编辑主要涉及到参数化和关联这两部分,jmeter支持这两个功能。 一、参数化  参数化是指用参数替代测试脚本中的字符,这里介绍两种常用的参数化...
  • LoadRunner中参数化和关联

    千次阅读 2010-03-06 08:24:00
    首先还是录制脚本,将脚本录制完成后进行如下分析1、航班的起始地址目的地是从服务器端传过来的,这就表明我们不能使用参数化的方法,而是使用关联的方法。关联方法就像一个盒子,他把服务器方发送来的信息放在...
  • jmeter参数化的几种方法: 1.用户定义的变量 2.函数助手中使用已包装好的函数,如csvread(); 3.csv用户
  • 1、什么是参数化? a)LR发送数据始终是录制记录的一种数据,为保证LR每次发送的数据都是独立的 b)模拟接近真实数据; c)仅一种情况不用参数化:模拟多个用户,使用同一账号密码登 如:网页登录。用户名不...
  • 1 Jmeter如何设置断言的?...LR中: web_find()web_reg_find() 二个函数类型不同,web_find()只是一个普通函数,而web_reg_find()是一个注册函数 web_find()必须开启内容检查项。而web_reg_fi...
  • Jmeter参数化关联

    2013-01-06 08:59:26
    参数化:指对每次发起的请求,参数名称相同,参数值进行替换,如登录三次系统,每次用不同的用户名密码。 关联:与系统交互过程中,系统返回的内容,需要在接下来的交互中用到,如防止csrf攻击而生成的token。 ...
  • 文章目录前言一、jmeter的参数化二、关联三、断言总结 前言 本篇主要介绍接口测试工具jmeter的参数化关联、断言 学会了这些就能完全胜任工作中的接口测试任务。 提示:以下是本篇文章正文内容,下面案例可供参考...
  • 今天大家聊下使用Jmeter进行参数化关联操作,实现从文件中读取参数进行注册,登录及抽奖的一系列操作。具体看下面的介绍吧。 1,首先在注册接口处添加CSV Data Set Config,配置好参数数据信息,如图。 2,...
  • H09_HttpRunner参数化:函数动态生成测试数据 + 组合关联参数 在测试用例集合(testsuite)中实现参数化: 用例中参数个数:2个 (用户名密码同时进行参数化处理) 数据源提供:通过在外部 debugtalk.py 文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,442
精华内容 576
关键字:

关联和参数化