jmeter关联、下载文件、简单压测,jmeter 参数化学习笔记合集

181 篇文章 19 订阅
2 篇文章 1 订阅

jmeter 参数化学习笔记

上次写了在接口的交互过程中,系统返回的内容,需要在接下来的交互中用到,从而把参数进行参数化的关联,这次写一下在压测过程中,如果每次发起请求参数名相同,单参数值需要替换的,我们需要进行的参数化。

在使用Jemeter做压力测试的时候,比如登录接口,往往需要参数化用户名,密码以到达到多用户使用不同的用户名密码登录的目的.或者注册接口也需要大量不同的用户名和密码的用户以达到目的。

一、使用CSV Data Set Config实现参数化

我们以上次说到的添加学生信息接口为例来实验。

首先通过Test Plan或者Thread Group或http请求的Add->Config Element->CSV Data Set Config添加

以下是CSV Data Set Config各个参数的简要说明:

  • FileName:参数化文件的读取位置,
  • File Encoding: 选择UTF-8
  • Varible Names: 变量名称。这里定义的变量名称,后面就可以直接用来引用了。(多个变量名称以逗号隔开。例如username,passwd。参数化文件中同样有对应的两列数据。)
  • Delimiter:分隔符,默认逗号。
  • Allow Quoated data: 是非选项,是否允许变量中间有分隔符,这里最好先默认false,数据中间最好不要有分隔符。
  • Recycle on EOF: 设置为True后,允许循环取值
  • Stop Thread on EOF: Recycle on EOF和Stop thread on EOF按需设置。是否循环,到结尾是否停止测试。
  • Sharing Mode: 设置是否线程共享,allthreads表示所有的线程都可以利用此参数化。

 准备测试数据

添加学生信息接口

  • 请求URL:http://api.nnzhp.cn/api/user/add_stu
  • 请求方式  post 
  • 参数 ,入参是json类型

                        参数名        必选     类型     说明

                       name           是       string    学生姓名

                       grade           是        string   班级

                      phone           是      string    电话

                      sex               否      string    性别,如果不传,默认为男

                       age               否    string    年龄 ,不传默认为18

                       add              否     string   地址,如果不传默认为北京市昌平区

返回参数说明

                       参数名         类型   说明

                       error_code  int       错误编码,1000为操作成功

                       msg            string   提示信息

创建学生账号的时候,手机号码不能重复,姓名我们也设置为不重复,则需要参数化的参数为:name,phone

新建文件userinfo.txt

填写相应的信息

引用方法是 ${}   ;其中{}内写入参数化中的变量。

线程数我们设置为1.循环11次,表示一个用户调用这个接口11次;因为文件中只有10条数据,我们可以看一下循环之后的效果;

点击运行,查看结果树

我们可以看到请求调用的11次,第一次的phone为1结尾;第二个请求获取的phone为2结尾;

第10个是调用成功的,第11个是执行失败的,手机号码重复的。

如果只从调用结果中我们看不出添加是否成功,所以可以添加断言来看是否达到了我们预期的效果;

APPly to:适用范围

         Main sample and sub-samples:作用于父节点取样器及对应子节点取样器

         Main sample only:仅作用于父节点取样器

         Sub-samples only:仅作用于子节点取样器

         JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)

要测试的响应字段:要检查的项

                响应报文

                Documeng(text):测试文件

                URL样本

                响应代码

                响应信息

                Response Headers:响应头部

                Ignore status:忽略返回的响应报文状态码

模式匹配规则:

           包括:返回结果包括你指定的内容

           匹配:(好像跟Equals查不多,弄不明白有什么区别)   

           Equals:返回结果与你指定结果一致

           Substring:返回结果是指定结果的字串

           否:不进行匹配

要测试的模式:即填写你指定的结果(可填写多个),按钮【添加】、【删除】是进行指定内容的管理

此处我们选择响应文本,选择规则为包括,内容为:操作成功 ,意思为返回结果中包括“操作成功”则创建用户成功;

 我们在来执行一次上面的操作:

我们可以看到最后一次执行的结果是红色的,查看断言结果为匹配失败。

二、使用函数助手对话框实现参数化

jmeter中创造函数随机数的工具在选项->函数助手对话框

在函数里选择一个功能,例如_Random

设置一个最小数,一个最大数和一个参数名,点击生成,生成函数字符串,放入到需要参数化的参数中

 ${__Random(1000,1100,name2)}

同样的道理,我们对手机号也执行此操作

我们再来执行一下操作

可以看到执行结果中,我们传入的参数为设置的随机数中的随机数,11次调用结果都是成功的,因为没有重复。

jmeter关联、下载文件、简单压测

关联

一、什么是关联

关联是请求与请求之间存在数据依赖关系,需要从上一个请求获取下一个请求需要回传回去的数据。

简单地说就是在测试过程中有些数据的值会经常发生变化,要获取并使用这些数据,把这个动态的信息保存下来,我们就要进行关联。

例如:用户登录后,session信息都不同,有些操作要使用session,就需要将这个动态的信息保存下来。 
还有经常遇到的场景,第二个请求提交的参数要从第一个请求的返回数据中获取。

二、关联的用法

常用的两种关联用法

1.json  Path Extractor提取参数值

2.正则表达式的方法

我们已学生金币充值的接口为例来实验,由于接口需要权限,需要获取登录时的sign值我们就用关联来实现。

登录接口

  • 请求URL  http://api.nnzhp.cn/api/user/login
  • 请求方式    post
  • 请求参数  参数为key-value形式

                       参数名        必选     类型     说明

                       username    是       string    用户名

                       passwd        是        string   密码

     

       登陆用户名:niuhanyang

       密码:aA123456

返回参数说明

                      参数名         类型   说明

                       error_code  int       错误编码,0为操作成功

                       login_info   object   登录对象信息

                       userId        int        用户id

                       sign           string     签名

                       login_time  string  登录时间

打开jmeter,添加登录接口请求,调用查看结果

 获取学生信息接口

  • 请求URL  http://api.nnzhp.cn/api/user/stu_info
  • 请求方式  get
  • 请求参数

                       参数名        必选     类型     说明

                       stu_name    是       string    学生姓名

调用接口结果

学生金币充值

  • 请求URL:http://api.nnzhp.cn/api/user/gold_add
  • 请求方式  post 
  • 参数 ,

    该接口有权限验证,需要admin用户才可以做操作,需要添加cookie

    cookie中key为登录的用户名,value从登录接口中获取,登陆成功之后会返回sign

                        参数名        必选     类型     说明

                       stu_id           是       int    学生id

                       gold           是        int     金币数量

返回参数说明

                       参数名         类型   说明

                       error_code  int       错误编码,0为操作成功

                       msg            string   提示信息

第一种方法比较简单,使用插件json path  postprocessorh  或 jp@gc - json Path Extractor 

如下:在登录接口添加json path  postprocessorh,获取需要参数化的值的信息

$.login_info.sign

提取json串,使用json path extra

意思为给sign赋值,取值第一层为$,第二层为login_info , 第三层为sign ;

{(第一层)

"error_code": 0,

"login_info": {(第二层)

"login_time": "20171210170002",

"sign": "5071cef01583473c7beb6fe1110f937f",(第三层)

"userId": 8

}

}

 然后在cookie设置中,sign的值进行参数化,参数化的值用${参数名}

上面的例子中,返回值只有一个结果,如果存在多个结果的场合,我们怎么取值呢?

现在我们以学生ID为例来实验,可以看到上图中的查看学生信息中反回了多个ID号,我们用上边的方式来试一下

添加json  Path Extractor

从学生信息返回的结果看,获取内容的json串取为$.stu_info.id,将stu_id进行参数化为${id},执行

可以看到执行结果是失败的,传入的学生id是我们输入的默认值nono。

我们来看一下学生接口的返回信息

{
        "error_code": 0,
        "stu_info": [
                {
                        "id": 872,
                        "name": "A",
                        "sex": "nn",
                        "age": 33,
                        "addr": "士大夫是非得失的士大夫士大夫",
                        "grade": "33",
                        "phone": "15221223211",
                        "gold": 9500
                },
                {
                        "id": 1053,
                        "name": "A",
                        "sex": "nn",
                        "age": 33,
                        "addr": "士大夫是非得失的士大夫士大夫",
                        "grade": "33",
                        "phone": "16221223211",
                        "gold": 100
                }
        ]
}

上述的返回结果中,有两组信息,包含了两个学生的信息,如果用$.stu_info.id,计算机不知道要去获取,所以我们需要指定一下要获取哪一个ID号

$.stu_info[1].id

[1]因为计算机的计数是从0,开始的,所以1表示的是取第二个学生信息中的id号,我们再来执行一下

执行结果是成功的。

2.正则表达式 需要进行参数化还有一种方法是用正则表达式,如下

 执行

下载文件 1.文件上传我们先来回忆一下在jmeter中文件上传的操作

文件上传类型

  • 请求URL:http://api.nnzhp.cn/api/file/file_upload
  • 请求方式  post 
  • 参数

                       参数名        必选     类型     说明

                       file              是        file       文件     

返回参数说明

                       参数名         类型   说明

                       error_code  int       错误编码,0为操作成功

                       msg            string   提示信息

在jmeter中添加http请求,选择文件,添加参数信息,执行

可以看到上传文件执行成功了。

2.下载文件

现在我们来试一下下载文件是如何操作的

在网络上找到一个图片资源,获取到图片的地址:http://img4.duitang.com/uploads/item/201209/08/20120908180716_3rrvi.jpeg

我们在jmeter中新建一个HTTP请求,填写相应的参数,执行

可以看到下载成功了,那怎么把图片下载到本地呢?这就需要用到Bean Shell Sampler

BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;

具体如何写java代码这里就不具体介绍了,可以找到一段下载文件的代码。

代码如下:

import java.io.*;

byte[] result = prev.getResponseData();  //这个是获取到请求返回的数据,prev是获取上个请求的返回

String file_name = "C:\\besttest\\jmeter\\xiaer.jpg"; //代表存放文件的位置和文件名

File file = new File(file_name);

FileOutputStream out = new FileOutputStream(file);

out.write(result);

out.close();

执行并查看结果:
可以看到在填写的下载路径文件夹下,可以看到下载好的文件

 压测

一、什么是压力测试 压力测试通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大的服务级别的测试。通俗地讲,压力测试是为了发现在什么条件下您的应用程序的性能会变得不可接受。

再直白一点就是被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定(资源占用情况)

二、压力测试的工具

最常用的压力测试工具是loadrunner和jmeter

下面我们说一下jmeter中怎么做简单的压测

以上面的登录接口为例

登录接口

  • 请求URL  http://api.nnzhp.cn/api/user/login
  • 请求方式    post
  • 请求参数  参数为key-value形式

                       参数名        必选     类型     说明

                       username    是       string    用户名

                       passwd        是        string   密码 

       登陆用户名:niuhanyang

       密码:aA123456

添加线程组,添加http请求,添加聚合报告

设置压测的并发数,这里我们设置100个并发,循环10次,持续30s

下面看一下各个参数的含义:

Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
#Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100,我们设置的为100个用户循环10次,所以一共的请求为100*10=1000
Average:平均响应时间——默认情况下是单个 Request 的平均响应时间(单位是毫秒),当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间
Median:中位数,也就是 50% 用户的响应时间
90% Line:90% 用户的响应时间
Min:最小响应时间
Max:最大响应时间
Error%:本次测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的Transaction per Second 数
KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec

根据具体的压测结果与目标需求进行比较来分析是否满足需求以及需要进行的优化操作

3、添加压力机

有时压力测试的时候一台压力机可能不能满足需求,我们需要添加多个压力机,或者用其他人的机器进行压测,这个时候我们就需要添加压力机。

1、先在其他电脑上启动jmeter_server,确保都在一个网段上,确保几台机器能ping通

2、修改jmeter配置文件,在remote_hosts 添加对应的IP地址,端口号默认1099

3、本机启动jmeter,在运行中选择远程启动,可以单独启动压力机也可以全部启动

如果脚本里边又参数化文件的话,那么在其他压力机上相同位置也得有相同的文件。

我们在本地jmeter看一下添加的压力机

运行->远程启动

或者直接点击全部运行按钮,进行运行,就可以进行压测啦,大家一起来试一下吧

好了  这次就学习到这了哦! 

还想学习的话,记得收藏及关注哦. 

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

① 2000多本软件测试电子书(主流和经典的书籍应该都有了)

② 软件测试/自动化测试标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python编程语言、API接口自动化测试、web自动化测试、App自动化测试(适合小白学习)

⑤ Python学习路线图(告别不入流的学习) 

 在我的QQ技术交流群里(技术交流和资源共享,广告进来腿给你打断)

可以自助拿走,群号768747503备注(csdn999)768747503备注(csdn999)群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在进行JMeter分布式时,可以使用参数文件来为试计划提供动态数据。参数文件可以包含多个变量和对应的值,这样在执行试时,JMeter会根据参数文件中的数据来进行参数操作。 要配置JMeter分布式参数文件,可以按照以下步骤进行操作: 1. 首先,在主节点上打开JMeter并打开你的试计划。 2. 在试计划上右键单击,并选择"Add" > "Config Element" > "CSV Data Set Config",这将添加一个CSV数据集配置元件到你的试计划中。 3. 在CSV数据集配置元件的属性窗口中,填写以下信息: - "Filename"字段:指定参数文件的路径。 - "Variable Names"字段:指定参数文件中的变量名称,可以使用逗号或分号进行分隔。 - "Delimiter"字段:指定参数文件中的变量和值之间的分隔符,例如逗号、分号等。 - 其他字段:根据你的需求进行设置,例如是否循环读取、文件编码等。 4. 点击"Save"保存你的试计划。 这样,你就可以在试计划中使用参数文件了。在需要使用参数值的地方,可以通过`${变量名}`的方式引用参数文件中的变量值。例如,你可以在HTTP请求中的参数字段中使用`${变量名}`,这样在每次执行试时,JMeter会从参数文件中读取对应的变量值并进行替换。 请注意,在执行分布式时,你需要确保参数文件在所有的Slave节点上都能够被访问到。可以将参数文件放在共享的网络路径上,或者使用分发工具将参数文件复制到所有的Slave节点上。 希望这些信息能够帮助到你。如果还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值