草帽路飞UU 发表于 2017-6-30 11:40:47

Jmeter 录制手机 app,模拟场景进行压测做性能数据分析

好久没发过帖子了,最近一直忙着测试,近来有个项目要求做性能测试,客户端是app,用loadrunner只有11.5以上的版本才有mobile协议支持对app的脚本录制;但寻求了许久目前只能破解loadrunner 11.0及之前的版本,11.5目前没破。非破解版的loadrunner 11.5及以上版本只能支持50个用户的测试,无奈只能用jmeter测试了。

使用JMeter录制手机App脚本

1、 添加线程组
 选中“测试计划”,右键依次添加【线程组】,用于保存录制的脚本。
2、 添加HTTP代理服务器
 选中“工作台”,右键依次添加【HTTP代理服务器】。
 配置HTTP代理服务器,端口可以使用默认8080,目标控制器选择“测试计划>线程组”。
 启动HTTP代理服务器,弹出“Root CA……”的提示框,点击“确定”表示HTTP代理服务器开始工作。
3、 配置手机网络代理
 进入手机WIFI设置,选择一个WIFI,长按WIFI名称,在弹出的提示框中,选择“修改网络”
 在修改网络页,勾选【显示高级选项】,填写代理服务器主机名(JMeter软件所在的主机IP地址)和代理服务器端口(添加HTTP代理服务器配置的端口,默认8080),保存配置
4、 查看JMeter录制的手机App脚本
https://testerhome.com/uploads/photo/2017/2a131cd8-a9ac-4103-aa0b-932f26d71e19.png!large
备注:本人不太喜欢用Jmeter的录制功能,因为会录制很多无效的网络请求,但若不知道接口参数的情况下,可以采用录制方式,然后删除修改。


线程组的设置

普通线程组
1、 线程数:设置并发用户线程数量,即通常意义的并发用户数
2、 Ramp-Up Period (in seconds):设置并发用户加载时间,假设并发用户数设置为100,此处设置为10,则认为jmeter会在10s内加载完成100并发用户数,也就是说每隔10秒加载一个
3、 循环次数:输入框与复选框只能选择一种,不能同时被选择为场景循环方式;输入框输入数字则被认为是当前线程组所控制的脚本区域的执行次数;【永远】复选框选择后,输入框内的数字将失效,启动后脚本将一直执行下去。
4、 调度器:对于调度而言,顾名思义就是我们想在什么时间开始运行,运行多长时间自动停止诸如此类的场景需求均可以在此设置。
  • 启动时间:在设置时间点开始运行场景,比如你想在下班后开始运行,如果时间小于当前时间,启动后立即执行,大于当前时间,启动后等待本地时间到了自动运行
  • 结束时间:在设置时间点结束运行场景,比如上班前结束运行,结束时间如果小于开始时间或者当前时间,自动运行后立即终止
  • 持续时间:设置当前场景持续运行的时间
  • 启动延迟:设置场景启动后多长时间再开始真正运行,比如你想在下班后5分钟开始运行场景
其中持续时间和启动延迟的优先级高于启动时间和结束时间,也就是说当你设置了持续时间或者启动延迟,那么你的启动时间或者结束时间将失效,
5、 几种设置场景组合:
  • 不勾选【永远】,选择【调度器】,设置完成后,启动运行也只会运行当前并发用户数循环次数,运行完成即会结束。所以此中选择可用于希望未来某时间点开始运行完成并发用户数循环次数的场景
  • 勾选【永远】,设置启动时间及结束时间,持续时间和启动延迟均为空,可用于希望未来某时间点自动运行并且到未来某时间点自动结束的场景
  • 勾选【永远】, 设置 持续时间和启动延迟, 可用于希望在启动多久后自动运行并持续多长时间的场景

另外介绍一个调试工具Debug Sampler,会把我们自定义的变量输出在response data中,方便我们调试的时候使用,但在正式执行脚本时需要删除Debug Sample
https://testerhome.com/uploads/photo/2017/e1e8d832-6d0e-466b-9c3d-1eead591b061.png!large
jp@gc - Stepping Thread Group
https://testerhome.com/uploads/photo/2017/a59940a0-c7da-4bfd-8c76-8a4b72b9cb35.png!large
类似loadrunner的场景设置,解释:
 This Group will start 100 threads:这次的测试总共会起100个线程。
 First , wait for 0 seconds:等待0s后开始起线程,也就是不等待直接起线程。
 Then start 10 threads every 30 seconds:每起10个线程后会运行30s,再起余下的10个线程,再运行30s,以此类推。
 Using ramp-up 5 seconds:前面每起多少个线程的时候花5s,与上面结合起来即5s内起10个线程,运行30s,然后再再5s内再起10个线程,再运行30s,以此类推。
 Then hold load for 60 seconds. :全部的线程起来后,运行60s 后开始停止(跟loadrunner类似,从jmeter聚合报告里面可以看出来,这里的hold load 的意思,其实是这些线程,一直在请求,相当于jmeter普通线程组里面的循环运行)。
 Finally , stop 5 threads every 1 seconds:最后停止线程,5个线程停一次,等1s再停5个线程(当然,第一次是hold时间一过就先停5个线程,然后等1s再停余下的5个线程)。


介绍几个常用的逻辑控制器

JMeter中的Logic Controller分为两类:
a) 控制测试计划执行过程中节点的逻辑执行顺序,如:循环控制器(Loop Controller)、if控制器(If Controller)等;
b) 对测试计划中的脚本进行分组、方便JMeter统计执行结果以及进行脚本的运行时控制等,如:吞吐量控制器(Throughput Controller)、事务控制器(Transaction Controller)。
一、ForEach控制器(ForEach Controller)
  作用:ForEach控制器一般和用户自定义变量一起使用,其在用户自定义变量中读取一系列相关的变量。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。
二、包含控制器(Include Controller)
  作用:用于引用外部的Jmx文件;从而控制多个测试计划组合
三、事务控制器(Transaction Controller)
  作用: 事务控制器会生产一个额外的采样器,用来统计该控制器子结点的所有时间。
四、仅一次控制器(Once Only Controller)
  作用:在测试计划执行期间,该控制器下的子结点对每个线程只执行一次,登录场景经常会使用到这个控制器。
五、吞吐量控制器(Throughput Controller)
  作用:控制其下的子节点的执行次数与负载比例分配,也有两种方式:
  Total Executions:设置运行次数
  Percent Executions:设置运行比例(1~100之间,不用写%)
  如:设置线程组循环5次,吞吐量控制器1:百分比40,吞吐量控制器2:百分比60
https://testerhome.com/uploads/photo/2017/2345227d-9435-47c0-9680-efe544dae85b.png!large

六、If 控制器(If Controller)
  作用:根据给定表达式的值决定是否执行该节点下的子节点,默认使用javascript的语法进行判断
https://testerhome.com/uploads/photo/2017/88ecd8db-f685-4e9a-a7af-3c4d7b6fb711.png!large
脚本参数化的几种方式

一、使用Jmeter自带函数获取参数值
  Jmeter中可以产生值的函数有:Random( , , ),threadNum,CSVRead( , ),StringFromFile( , , , ) 。函数调用方法就不细说了,因为Jmeter中有函数助手
https://testerhome.com/uploads/photo/2017/74059e48-7c1e-4bf0-8920-3246b46bb669.png!large
1、 第一个参数:用于解析服务器响应数据的正则表达式。它会找到所有的匹配项。如果测试人员希望将表达式中的某部分应用在模板字符串中,记得加上圆括号。
2、 第二个参数:这是一个模板字符串,函数会动态填写字符串的部分内容。要在字符串中引用正则表达式捕获的匹配组合,请使用语法:$$。例如$1$或者 $2$。测试人员的模板可以是任何字符串
3、 第三个参数:第3个参数告诉JMeter使用第几次匹配。测试人员的正则表达式可能会找到多个匹配项。对此,测试人员有4种选择:
 整数,直接告诉JMeter使用第几个匹配项。 “1”对应第一个匹配,“2”对应第二个匹配,以此类推
 RAND,告诉JMeter随机选择一个匹配项
 ALL,告诉JMeter使用所有匹配项,为每一个匹配项创建一个模板字符串,并将它们连接在一起
 浮点值0到1之间,根据公式(找到的总匹配数目*指定浮点值)计算使用第几个匹配项,计算值向最近的整数取整
4、 第四个参数:如果在上一个参数中选择了“ALL”,那么这第4个参数会被插入到重复的模板值之间
5、 第五个参数:如果没有找到匹配项返回的默认值
6、 第六个参数:重用函数解析值的引用名,参见上面内容
7、 第七个参数:输入变量名称。如果指定了这一参数,那么该变量的值就会作为函数的输入,而不再使用前面的采样结果作为搜索对象

二、使用CSV Data Set Config获取参数值
https://testerhome.com/uploads/photo/2017/07956f7f-1acf-4e80-a6d7-aa20b674f7ea.png!large
三、使用用户定义的变量获取参数值
https://testerhome.com/uploads/photo/2017/d3747148-55e5-4ac2-8928-98fab49cef51.png!large
一般配合ForEach控制器一起使用


参数值的传递

一、利用Cookie进行值的传递
  用JMeter进行接口调试时,有时候会遇到需要登录的情况,如请求wetest的DataSearchAjax接口:
https://testerhome.com/uploads/photo/2017/040fc1fd-a17e-411f-b566-493ac6d14e19.png!large
 出现这种情况的原因很明显是未登录引起的。一个较好的解决方法就是将登录后的cookies保存下来,在访问DataSearchAjax接口的时候,带上用户登录后的cookies信息进行查看。
  在JMeter中,我们可以通过如下途径进行cookies的传递,如下图添加HTPP Cookie管理器:
https://testerhome.com/uploads/photo/2017/9133cdb9-ea5b-4d9a-b6cf-d14f14060e84.png!large
 再给登录的接口添加前置处理器Bean Shell PreProcessor,用来保存登录的cookies:
https://testerhome.com/uploads/photo/2017/29b96836-e878-4d5f-aed1-0741b168fdc3.png!large
我们要在Bean Shell PreProcessor里面添加我们的cookies值了。
二、利用正则匹配提取上一个接口的返回数据作为下个请求的输入
  用JMeter进行接口调试时,经常会遇到上一接口的返回值中的某个字段,要作为下一接口的输入,这种情况下,我们需要利用正则匹配来提取我们需要的值。
  例如,若要提取相应数据中的userid字段作为下个接口的输入的话,可以在该接口请求后面添加正则表达式提取器:
https://testerhome.com/uploads/photo/2017/8af43d26-d2bb-418d-977a-cc7b1a819b98.png!large
我们给正则表达式提取器命名为get_userid,并填写引用名称、正则表达式、模板、匹配数值、缺省值,填写后的如如下:
https://testerhome.com/uploads/photo/2017/c2055827-ae22-4656-a658-dbc979696876.png!large
 填写完成后,在添加新的HTTP请求,来测试提取到的user_id字段:
https://testerhome.com/uploads/photo/2017/3be56d03-2e7e-4401-ba62-8bbf4339b314.png!large





joan123123 发表于 2017-7-7 10:31:25

正好要测试这方面,感谢楼主的分享
页: [1]
查看完整版本: Jmeter 录制手机 app,模拟场景进行压测做性能数据分析