Jmeter性能压测技术分享

来自:韩文佳分享

1.JMeter学习笔记——JMeter参数化

参数化是自动化测试脚本的一种常用技巧。简单来说,参数化的一般用法就是将脚本中的某些输入使用参数来代替,在脚本运行时指定参数的取值范围和规则;
这样,脚本在运行时就可以根据需要选取不同的参数值作为输入。这种方式通常被称为数据驱动测试(Data Driven Test),参数的取值范围被称为数据池(Data Pool)。

jmeter的test plan(测试计划)中,支持如下4种参数化方式:
函数助手:_CSVRead
CSV Data Set Config:CSV数据控件
User Defined Variables:用户定义的变量
User Variables:用户参数

首先新建一个测试脚本,可以通过工具(badboy)录制或者自己手动编写

项目中:运营后台-登录请求的界面如下:
在这里插入图片描述
在这里插入图片描述
登录成功
在这里插入图片描述
这里我们对登录的用户名密码进行参数化,将用户名密码写入txt文档,保存为.dat格式,编码类型选择UTF-8;

因为配置元件——CSV Data Set Config对参数化的格式要求比较严格,用户名密码一一对应,之间用半角英文逗号隔开

在这里插入图片描述

然后将保存的.dat文件放入计算机的某个盘里,这里我放入路径为:D:/Jmeter/jmeter5.1.1/user.txt/
下面具体介绍参数化常用的的两种方法:

一、函数助手:_CSVRead

点击jmeter的界面,功能栏选项→ 函数助手对话框→ _CSVRead

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

*CSV file to get values from | alias:CSV文件取值路径,即这里需要写入之前的需要参数化的参数的文件路径

*CSV文件列号| next|alias:文件起始列号:CSV文件列号是从0开始的,第一列为0,第二列为1,以此类推。。。

函数字符串:即生成的参数化后的参数,可以直接在登陆请求中的参数中引用,第一列为用户名,函数字段号为0,第二列为密码,函数字段号为1,以此类推进行修改使用即可

在这里插入图片描述

替换参数化后的参数,然后修改线程数,执行脚本,通过监听器里结果树的请求内容,可以看到请求的参数都是参数化后的数据

二、配置元件——CSV Data Set Config
点击线程组添加配置元件→ CSV Data Set Config:

在这里插入图片描述
说明():

//没有错误可以直接跳过
Filename:C:/Users/EDZ/Desktop/user.dat文件名,保存参数化数据的文件目录,可选择相对或者绝对路径(建议填写相对路径,避免脚本迁移时需要修改路径);
File encoding:UTF-8,C:/Users/EDZ/Desktop/user.dat文件的编码格式,在保存时保存编码格式为UTF-8即可;
Variable Names(comma-delimited):对对应参数文件每列的变量名,类似excel文件的文件头,起到标示作用,同时也是后续引用的标识符,建议采用有意义的英文标示;
(如:有几列参数,在这里面就写几个参数名称,每个名称中间用分隔符分割,这里的 user,pwd,可以被利用变量名来引用:{pwd};
Delimitet:参数文件分隔符,用来在“Variable Names”中分隔参数,与参数文件中的分隔符保持一致即可;
Allow quote data:是否允许引用数据,默认false,选项选为“true”的时候对全角字符的处理出现乱码 ;
Recycle on EOF?:是否循环读取参数文件内容;因为CSV Data Set Config一次读入一行,分割后存入若干变量中交给一个线程,如果线程数超过文本的记录行数,那么可以选择从头再次读入;
△ Ture:为true时,当已读取完参数文件内的测试用例数据,还需继续获取用例数据时,此时会循环读取参数文件数据(即:读取文件到结尾时,再重头读取文件);
△False:为false时,若已至文件末尾,则不再继续读取测试数据;通常在“线程组线程数* 线程组循环次数>参数文件行数”时,选用false(即:读取文件到结尾时,停止读取文件);
Stop thread on EOF?:当Recycle on EOF为False时(读取文件到结尾),停止进程,当Recycle on EOF为True时,此项无意义;
△若为ture,则在读取到参数文件行末尾时,终止参数文件读取线程;
△若为false,此时线程继续读取,但会请求错误,因此时读取的数据为EOF;
Sharing mode:共享模式,即参数文件的作用域,有以下几种方式:
△All threads:当前测试计划中的所有线程中的所有的线程都有效,默认;
△Current thread group:当前线程组中的线程有效;
△Current thread:当前线程有效;

完成之后,将刚才生成的参数写入参数对应的值里面:

在这里插入图片描述
以上两种常见的参数化的方法,推荐使用CSV控件方法(因为函数助手参数化功能相比其较弱)

三、配置元件——User Defined Variables

点击线程组添加配置元件→ User Defined Variables(用户定义的变量):

在这里插入图片描述
如上图所示,在该参数组中已经定义了两个参数,通过界面下方的添加、删除按钮可以向参数列表增加和删除参数,Up和Down可以上下移动参数的位置;

PS:User Defined Variables中定义的参数值在test plan执行过程中不能发生取值的改变,因此一般仅将test plan中不需要随迭代发生改变的参数(只取一次的参数)

设置在此处;例如:被测应用的host和port值。

四、前置处理器——User Variables

点击线程组添加前置处理器——User Variables(用户参数):

在这里插入图片描述
如上图所示,在该参数组中已经设置了两个参数,username和password分别有2组不同的取值,通过页面下方的四个按钮,可以增加删除参数的可能取值。
PS:User Variables中设置的参数可以在test plan执行过程中发生变化。

以上就是jmeter参数化的四种方式,其中:
1、函数助手_CSVRead的参数化功能相比CSV Data Set Config较弱;
2、CSV Data Set Config适用于参数取值范围较大的时候使用,该方法具有更大的灵活性;
3、User Defined Variables一般用于test plan中不需要随请求迭代的参数设置;
4、User Variables适用于参数取值范围很小的时候使用;

PS:相比于loadrunner来说,jmeter参数化有以下不同:
1.jmeter参数文件第一行没有列名称
2.参数文件的编码,尽量保存为UTF-8(编码问题在使用CSV Data Set Config参数化时要求的比较严格)
3.Jmeter的参数化没有LoadRunner做的出色,它是依赖于线程设置的(只有CSV Data Set Config参数化方法才有)

2.jmeter响应结果乱码问题

使用JMeter进行HTTP请求,响应结果中的中文乱码。

乱码的原因:

当响应数据或响应页面没有设置编码时,jmeter会按照jmeter.properties文件中,sampleresult.default.encoding设置的格式解析。通常是没有配置,默认ISO-8859-1,解析中文肯定出错。

  方法一:打开apache-jmeter-5.1.1\bin\jmeter.properties文件,搜索“encoding”关键字,找到上图配置。将注释删掉,并改成utf-8编码,即:

在这里插入图片描述

    这种方法是修改时全局性的,以后所有的测试计划都是使用UTF-8.

3.JMeter学习笔记——content-type与参数

讲三种content-type以及在Jmeter中对应的参数输入方式
第一部分:目前工作中涉及到的content-type 有三种:
content-type:在Request Headers里,告诉服务器我们发送的请求信息是哪种格式的。

1 content-type:application/x-www-form-urlencoded,(该部分未在项目上找到具体接口,所以还是沿用本图讲)
默认的。如果不指定content-type,默认使用此格式。
参数格式:key1=value1&key2=value2

2 content-type:application/json
参数为json格式
{
“key1”:“value1”,
“key2”:“value2”
}
3 content-type:multipart/form-data [dinghanhua]
上传文件用这种格式
发送的请求示例:

在这里插入图片描述

第二部分 不同的content-type如何输入参数

1 content-type:application/x-www-form-urlencoded (该部分未在项目上找到具体接口,所以还是沿用本图讲)
参数可以在Parameters或Body Data里输入,格式不同,如下图所示。
这两个参数输入的tab页只能使用一个,某一个有数据后不能切换到另一个。

Parameters:

在这里插入图片描述
Body Data:

在这里插入图片描述

2 content-type:application/json
2.1 首先添加信息头管理。http请求上点击右键》添加》配置元件》 HTTP信息头管理器

在这里插入图片描述

2.2 信息头编辑页面,点击添加,输入content-type application/json

在这里插入图片描述

2.3 在http请求,Body Data中输入json格式的参数

在这里插入图片描述

3 content-type:multipart/form-data;boundary=----WebKitFormBoundarywClOtEDxS7fjKHaO [dinghanhua]
在http请求编辑页面,选中Use multipart/form-data for POST
Parameters中输入除了上传的文件以外的参数:参数名和参数值
Files Upload中上传文件,参数名和MIME类型
结合项目中:财务-订单收款-新增收款记录-上传附件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上传文件如果不成功,修改Implementation为java试一下。

在这里插入图片描述
新版修改Implementation位置

在这里插入图片描述

///
///
4.JMeter学习笔记——元件的作用域与执行顺序

jmeter是一个开源的性能测试工具,它可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的父子关系,那么随着它们的顺序和所在的域不同,它们在执行的时候,也会有很多不同。

jmeter的test plan通过图形化的方式表达脚本,域代码方式的脚本不同,图形方式表达的脚本中无法使用变量和函数等描述元件的作用域,因此jmeter主要依靠test plan中元件的相对位置、

父子关系以及元件本身的类型来决定test plan中各元件的执行顺序;原件在test plan中的位置不同,可能导致该元件的行为有很大差异。(新版jmeter都可以自主选择语言,对号入座即可)

//
1、元件的作用域

上一节中,介绍了8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(config elements 、timers 、post-processors、assertions、listeners、)需要与取样器(sampler)等元件交互。

配置元件(config elements )
  元件会影响其作用范围内的所有元件。
  
前置处理程序(Per-processors)
  元件在其作用范围内的每一个sampler元件之前执行。
  
定时器(timers )
  元件对其作用范围内的每一个sampler 有效
  
后置处理程序(Post-processors)
  元件在其作用范围内的每一个sampler元件之后执行。
  
断言(Assertions)
  元件对其作用范围内的每一个sampler 元件执行后的结果执行校验。
  
监听器(Listeners)
  元件收集其作用范围的每一个sampler元件的信息并呈现。
  
在jmeter中,元件的作用域是靠测试计划的的树型结构中元件的父子关系来确定的,作用域的原则是:
取样器(sampler)元件不和其它元件相互作用,因此不存在作用域的问题。
逻辑控制器(Logic Controller)元件只对其子节点中的取样器 和 逻辑控制器作用。
除取样器 和逻辑控制器 元件外,其他6类元件,如果是某个sampler的子节点,则该元件公对其父子节点起作用。
除取样器和逻辑控制器元件外的其他6类元件,如果其父节点不是sampler,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)。
讲了这些,你可能迷糊了,?通过两个例子来理解一下他们的作用域。
A(注:下图只是为了说明作用域,无法正常运行)

在这里插入图片描述

取样器(HTTP请求1、FTP请求2、TCP取样器3),逻辑控制器(循环控制器),监听器(图形结果1、聚合报告2)

HTTP请求1、FTP请求2、TCP取样器3,元件没有作用域的概念。

循环控制器,元件作用域名是其子节点FTP请求2、TCP取样器3 。

图形结果1,元件的作用域是是FTP请求2、TCP取样器3。

聚合报告2,元作的作用域是HTTP请求1、FTP请求2、TCP取样器3

在这里插入图片描述
这个例子稍微复杂一些,包含的元件较多。先来分分类。

取样器(HTTP请求、FTP请求、TCP取样器、JDBC Request ),逻辑控制器(循环控制器、随即控制器),定时器(固定定时器、Uniform Random Timer ),断言(响应断言、XML断言),监听器(图形结果、聚合报告)。
根据作用域原则,这些元件的作用域分别为:

HTTP请求 、FTP请求 、TCP取样器、 JDBC Request 元件没有作用域名概念

循环控制器 的作用域为 FTP请求 、TCP取样器和 随即控制器

固定定时器作用于 HTTP请求 , Uniform Random Timer 作用于所有取样器

响应断言作用于JDBC Request , XML断言作用于FTP请求 、TCP取样和JDBC Request 。

图形结果作用于FTP请求 、TCP取样和JDBC Request ,聚合报告作用于作用于所有取样器。

其实,通过上面的分析,并没有你想象的那么复杂,我们从各个元件的层次结构就可以判断每个元件的作用域。
Jmeter 中的逻辑控制器(Config Elements)在其作用范围内的行为与其他元件相比稍有不同。逻辑控制器元件分两大类:默认配置(HTTP默认请求、FTP默认请求等)和 管理(HTTP 头管理、HTTP cookie 管理等)。
其中默认配置(Configuration Defaults)元件中设置的值可以在作用域内叠加,例如,在一个测试计划中添加两个HTTP 默认请求,其中第一个默认设置 Server name or IP 为www.google.com ,第二个默认设置Path 为/page-not-exist , 则在这两个元件作用域内的所有HTTP 默认请求,其默认的Server name or IP 和Path 均为Server name or IP 和 /page-not-exist 。(你有一个故事,我有一个笑话,我们一交换,两个人都分别拥有了一个故事加一个笑话。)
管理(Manager)类逻辑控制器元件的效果则不能进行叠加。如果两个或两个以上相同的管理类元件作用域有重叠。则在重叠作用域内的取样器元件只会随即受到其中一个的作用,这样会导致取样器行为的不确定性。因此,在使用管理类逻辑控制器时,一定要注意保证相同的管理类元件的作用域不发生重叠。

2、元件的执行顺序
了解了元件有作用域之后,来看看元件的执行顺序,元件执行顺序的规则很简单,在同一作用域名范围内,测试计划中的元件按照如下顺序执行。

1.配置元件(config elements)
2.前置处理程序(Per-processors)
3.定时器(timers)
4.取样器(Sampler)
5.后置处理程序(Post-processors):(除非Sampler得到的返回结果为空)。
6.断言(Assertions):(除非Sampler得到的返回结果为空)。
7.监听器(Listeners):(除非Sampler得到的返回结果为空)。

关于执行顺序,有两点需要注意:

  • 前置处理器、后置处理器和断言等元件公能对 取样器作用,因此,如果在它们的作用域内没有任何取样器,则不会被执行。
  • 如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序一次执行。’

附加:
有时候下一个接口需要上一接口的返回作为传参,如token
用到正则表达式,这里不做赘述,讲函数_property,项目中查看需要登录的token,这时就可以使用该函数

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JMeter是一种常用的性能测试工具,它可以帮助开发人员评估应用程序或网站在不同负载下的性能表现。对于性能压测,你可以使用JMeter来模拟多个用户同时访问系统,并收集各项指标,如响应时间、吞吐量和错误率等。通过这些指标,你可以评估系统在不同负载条件下的稳定性和性能表现。 为了进行JMeter性能压测,你可以按照以下步骤: 1. 安装JMeter:首先,你需要从官方网站下载并安装JMeter。 2. 创建测试计划:打开JMeter,并创建一个新的测试计划。在测试计划中,你可以添加线程组、定时器、取样器、监听器等组件,以设置并收集所需的压测数据。 3. 配置线程组:在线程组中,你可以设置并发用户数、循环次数、Ramp-Up时间等参数,以模拟真实用户的访问行为。 4. 添加取样器:取样器用于模拟用户发送请求,并收集服务器的响应数据。你可以根据需要选择合适的取样器,如HTTP请求、FTP请求等。 5. 配置监听器:监听器用于收集和显示压测结果。你可以选择适当的监听器,如查看结果树、聚合报告、图形结果等,来监控系统的性能指标。 6. 运行测试计划:在JMeter中,你可以点击“运行”按钮来执行测试计划。在执行过程中,JMeter会模拟多个并发用户发送请求,并记录和分析服务器的响应数据。 7. 分析测试结果:执行完测试计划后,你可以使用JMeter提供的各种报表和图表来分析性能测试结果。这些结果可以帮助你评估系统的性能瓶颈和优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值