网站压力测试工具 apache-jmeter-3.2

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 是压力测试的首选软件。

要求:jdk版本必须在8或以上。

基础知识:

Bean Shell常用内置变量

    JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:

log:写入信息到jmeber.log文件,使用方法:log.info(This is log info!);

ctx:该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext

vars - (JMeterVariables):操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:

    a) vars.get(String key):从jmeter中获得变量值

    b) vars.put(String keyString value):数据存到jmeter变量中

    更多方法可参考:org.apache.jmeter.threads.JMeterVariables

props - (JMeterProperties - class java.util.Properties):操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties

    a) props.get("START.HMS");  注:START.HMS为属性名,在文件jmeter.properties中定义

    b) props.put("PROP1","1234");

prev - (SampleResult):获取前面的sample返回的信息,常用方法:

    a) getResponseDataAsString():获取响应信息

    b) getResponseCode() :获取响应code

    更多方法可参考:org.apache.jmeter.samplers.SampleResult

sampler - (Sampler)gives access to the current sampler

附件JSON解析架包 ============下面用到的json解析架包

本文章脚本文件============下面的脚本原件

userinfo.csv======用户信息csv文件

 

以下是一个考试App的测试脚本,以这个为基础一步步编写测试脚本。

主界面:

线程组页(ramp-Up Period(in seconds)参数指的是多长时间启动规定的线程数,然后再按照线程数进行一次次的循环,这个循环貌似与那个时间参数无关):

第一步:添加线程组之后,在线程组里面添加各种数据和请求来模拟网站的访问,我们先在线程组里新建一个CSV Data Set Config,用来读取用户名和密码。

  

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

  • FileName:即同目录下csv文件的名称——>csv文件是一种文件格式,本次脚本的csv文件只有两列数据,user和pwd,用来模拟不同用户,如图:
  • File Encoding: 默认为ANSI
  • Varible Names: 定义文本文件中的参数名,参数之间逗号分隔.定义后可在脚本在以Shell变量的同样的方式引用
  • Allow Quoated data: 双引号相关
  • Recycle on EOF: 设置为True后,允许循环取值
  • Stop Thread on EOF: 当Recycle on EOF为false并且Stop Thread on EOF为true,则读完csv文件中的记录后,停止运行
  • Sharing Mode: 设置是否线程共享

第二步:添加一个http请求(返回的是json),填写相关信息,协议,ip,端口,请求类型,路径,编码方式,头信息(这边的${user}和${pwd}就是上一步读取到的数据,变量名是根据上一步Varible Names里面的定义来的)。

 

该请求会返回一个标准的的json数据,我们需要拿到这个json数据中的token数据,来进行下面的操作,所以在本请求下面添加一个后置处理器。

  • Varible Names: 定义文本文件中的参数名.定义后可在脚本在以Shell变量的同样的方式引用(也是这样${xx}引用)
  • JSON Path expressions 用$来取出json数据内容,如返回的json为 {"name":"zhangsan","age":"20"},想要取得name则 $.name。json数组也差不多,$.list[0].name这种写法也可以的。

在json后置处理器下面还有一个http头信息是用来添加http相关头部信息的,如图所示(个人感觉意义不大):

 

第三步:我们已拿到用户相关登录信息,设置了http相关头部信息,现在我们再添加一个http请求(返回的是一个页面),用拿到的数据去登录主页

如图所示,${accessToken}参数就是后置的json解析器所解析出来的数据,这个参数已经添加到全局变量,在后面的操作中都可以使用,所以注意参数的命名,不要重复了。

第四步:我们其实可以直接跳过这个请求,直接发起下一个HTTP请求,因为本请求只是用来跳转页面的,我们并不需要从这个链接获取到什么。但是为了真实的模拟用户的点击,所以添加了这个http请求(返回的是页面)。

第五步:第四步过后,此时用户已到达考试的列表页,但页面上无任何数据,数据通过ajax加载,所以再次添加一个http请求(返回的是json),用来获取考试列表信息。

然后添加一个后置json解析器,如图:

第六步:添加一个http请求(返回的是页面),模拟用户点击考试列表的第一个考试信息,然后跳转到考试简介页:

第七步:添加http请求(返回的是页面)模拟点击 参加考试按钮,进入试卷列表页(一场考试有多个试卷),本页面会有一个input框,里面有我们需要的值,怎样从返回的页面,而不是json里面去取值呢,添加一个jq处理器

填写相关信息,就可以取出需要的参数。

第八步:本步为第七步页面加载之后,通过js发出的ajax请求,添加这个http请求(返回的是json数据),是为了获取试卷列表信息。

本次请求之后,返回的是json数据,但是好像不是什么正经的json数据,如果遇到后置json解析器解析不了,则可以试试beanshell postprocessor,这个东西可以对返回的任何东西进行截取处理,你把页面给getString出来之后,用它截取一样的。解析页面使用案例参考第九步。

这里是直接可以写java代码的,需要什么包也可以在测试计划下面添加之后使用; prev.getResponseDataAsString是Jmeter提供的方法,可以调取上次请求的响应字符串。

这边直接截取一张试卷的id,如果有多张试卷,也只会截取一张,因为是indexof嘛嘻嘻。

 

第九步:根据第第八步获取的的试卷id发起http请求(返回页面),本页面会用model带回每个人单独的试卷id,放在页面里(试卷只有同一套,在本次请求发出去后会为每个用户产生一套对应的试题,这样,每个人答题都不会影响,也好还原客户考试信息)

 

我们添加一个beanshell postprocessor来获取到model带回每个人单独的试卷id

第十步:在第九步返回页面之后,发起一个获取试题的ajax请求(返回json),用第九步获取的每个人的pid获取每个人试卷的题目内容,本次返回的json比较大,是一整套题目,但是是个标准的json数组数据,我们利用beanshell postprocessor和java代码将返回的数据放到vars全局变量里面去,具体代码见下图

解析返回的数据,这里我获取了题目id和答案,将其添加到了vars全局变量。

 

第十一步:添加http请求(返回页面)。开始一题一题的答题了。

高斯随机定时器(主要是用来模拟用户的思考过程)

第十二步:提交试卷和提交考试

END:结果查看器

1.聚合报告:查看每个方法被访问的状态(访问量,响应时间,错误率)

2.图形结果:已图形的方式展示压测的压力情况

3.察看结果树:每次请求的请求和响应信息都会在这里显示,我们可以很清楚的看到请求信息的请求和应答结果。

 

 

发布者:songJian   点击数:2376   发布时间:2017-09-09 22:49:59   更新时间:2019-12-20 06:14:54
正在加载评论...
相关文章