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看一下添加的压力机
运行->远程启动

或者直接点击全部运行按钮,进行运行,就可以进行压测啦,大家一起来试一下吧
好了,先简单想这么多了,具体工作中遇到什么问题再慢慢学习吧~加油
原文地址:https://www.cnblogs.com/phoebes/p/8058927.html