Jmeter并发测试

2023 篇文章 51 订阅
1243 篇文章 21 订阅

之前在项目中用LoadRunner进行并发性能测试,后改用Jmeter更为简便快捷,笔者认为这也是开源工具颇受欢迎的原因之一吧。本次继之前的分享更新了一版,近期项目做个小结,希望大家也可以有新的收获!

01 下载

官网https://archive.apache.org/dist/jmeter/,选择binaries。目前最新5.6.3,官网上说“应该避免使用比最后一个版本早3个版本的版本”。笔者习惯不使用最新的版本,免得不稳定,大家可以使用5.0以上的都行,2、3版本的bug比较多。

02 环境配置

2.1 配置环境变量

系统变量中新建 JMETER_HOME ,值为安装路径 D:\dev\apache-jmeter ,再新建classpath,

值为

%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar;

配置之后在命令行直接输入

Jmter

就可以打开 Jmeter ,而无需在安装文件夹找bin目录下的 jmeter.bat ,是不是很便捷?!

2.2 配置语言

打开 apache jmeter5.5 ,“Options” 菜单选择语言为简体中文。

如果想永久切换成简体中文,可以打开bin目录下的jmeter.properties ,找到第27行

#language=en

修改成

language=zh_CN

即可。

在项目中性能测试要用到分布式,找到如下的代码

# Remote Hosts - comma delimited
remote_hosts=127.0.0.1
#remote_hosts=localhost:1099,localhost:2010

将 remote_hosts 进行修改,多个电脑IP时用英文逗号分隔。

2.3 启动Jmeter

命令行敲 cmd,输入 jmeter,出现 Apache JMeter GUI Mode 后停顿一会儿,出现 CLI mode 的界面。

这是Jmeter主界面,是用Swing(Java用户界面开发工具包)应用程序开发的。

03 创建测试计划

启动Jmeter窗口,默认打开创建测试计划界面。

测试计划定义如何测试,并提供一个布局,可以看作一个容器在运行测试。一个完整的测试计划将包括如下元素:比如线程组、逻辑控制器、样品产生控制器、监听器、定时器、断言和配置元素等。

测试计划必须至少有一个线程组。

  • setUp线程组:第一个执行的线程组,用来初始化测试环

  • 线程组:普通的线程组

  • tearDown:最后一个执行的线程组,用来清理测试环境。

04 元件

主要分为三类:配置元件、监听器元件和其他常用元件

4.1 配置元件

HTTP请求默认值

新增了HTTP请求默认值,后续的HTTP请求中不需要再填写协议、服务器名称或IP,端口号;

如果改变了环境(测试环境、预生产环境、生产环境)则只需修改请求默认值就好。

端口 443 https,端口 8080 tomcat,端口 80 http。

HTTP消息头管理器

HTTP Cookies管理器

可自动获取到 cookie,带给登录接口用。

4.2 监听器元件

查看结果树

  • 分析查看具体某一个请求的详情:

    l 请求头、请求体

    l 响应头、响应体

  • 做性能场景时分析错误请求的原因

    l 分析请求错误的原因

聚合报告

  • 汇总统计

    l 请求数、响应时间(平均的),单位是ms

    l 错误率,越低越好

    l 吞吐量,越高越好

    l 发送/接收,代表着带宽

用表格查看结果

图形结果

4.3 其他常用元件

断言

可以把断言拖拽到请求下

前置处理器

请求发出去之前执行的控制器元件

如:加密,md5

后置处理器

请求发出去后执行的控制器元件

如:提前数据,正则表达式

定时器

  • 思考时间,固定定时器

  • 同步定时器,集合点

  • 随机定时器

  • 吞吐量定时器

05 Jmeter逻辑控制器

可以控制samplers(采样器)的执行顺序。控制器需和采样器一起使用,否则没有意义。

在控制器下的所有采样器都会被当成一个整体,执行时也会一起被执行。Jmeter逻辑控制器可对元件的执行逻辑进行控制,除一次控制器外,还可以嵌套其他种类的逻辑控制器。

分类:

  • 控制测试计划执行过程中节点的逻辑执行顺序,如Loop Controller(循环控制器)、If Controller(IF 控制器)

  • 对测试计划中的脚本进行分组,如Simple Controller(简单控制器)、事务控制器

  • 控制该控制器下元件的执行次数,如 Throughput Controller(吞吐量控制器)

  • Runtime(second):默认1,不填则默认0,当为0时表示不执行其节点下的元件。

  • Runtime控制器用来控制执行时间长度,不控制运行次数。

  • 性能测试中,当某特定业务需要执行特定时长时,可用Runtime控制器。单位是秒。

  • 在不同num时选择控制器下的对应数字位不同sampler。

  • 一般用在模拟多线程同时操作不同请求的测试场景。

  • 事务控制器下的操作要么全部成功,要么失败。

  • Total Executions:按吞吐量值指定执行次数。吞吐量值的单位是”次“

  • Percent Executions:按百分比来指定执行次数。吞吐量单位是”%”

  • 吞吐量:可以是任意整数,若小于等于0,则一次也不执行

  • Per User:勾选则按虚拟用户数(线程数)来计算执行次数,若不勾选则按所有的虚拟用户数来计算。

  • Percent Executions执行次数=线程数*循环次数*吞吐量%,循环次数=线程组循环次数*循环控制器循环次数。

06 线程组

有关完整的JMeter用户线程组,请参见图4.2。

中文模式下显示可能更直观,如图

运行结果,执行5次,每次间隔1秒,循环次数为1.

HTTP请求默认值有何用?它用于新建http请求时“已经在HTTP Request Defaults元素中指定了此值,因此不必设置Server Name字段”。如下图

添加聚合报告,如图

聚合报告中,Average指的是平均响应时间,单位是毫秒,Throughput是指我们常说的吞吐量。

07 登录接口实例

新建“测试计划”,名称默认为“测试计划”

添加“线程组”,名称默认为“线程组”

添加“取样器”——“HTTP请求”

线程组名称填写“登录”,填写“协议”:http,填写“服务器名称或IP”:47.92.127.***,填写端口号“8180”,HTTP请求的方法选择“POST”,路径为IP接口名,如果是根目录,则直接填写“/”,如果不是则填写具体路径,比如“/api/doc/login2”,在参数中参考下图表格中添加参数。

username

zhangsan

password

12345_abc&

api_type

1

线程组添加“监听器”——“查看结果树”

执行“启动”按钮后,可以查看取样器结果、请求和响应数据。

线程组添加“监听器”——“用表格查看结果”,可以看到连接时间最大值1.065秒,均在3秒范围内(用户体验最佳)。

将返回的响应数据比对接口文档,基本一致

{"code":200,
"api":"/doc/login2",
"data":
{"api_os_code":"",
"api_os_model":"",
"api_version_code":null,
"api_login_time":1606706241,
"api_client_ip":"60.28.***.18",
"oauth_token_secret":"520cb280f8ec2551343794ed9b1ba603",
"validtime":1607311041,
"oauth_token":"ff3390cec2ef56c012774276f916a0d0",
"uid":"1008",
"uuid":"ODT5698b49b09d03",
"oid":"OF120105",
"name":"zhangsan",
"sex":1,
"type":2,
"mobile":"",
"email":"zhangsan@test.com",
"is_verified":"2",
"avatar":"/data/upload/2020/0416/13/5e97ee6be07cd.jpg",
"im_username":"oim0000001008",
"im_nickname":"zhangsan",
"status":1,
"department":["\u90d1\u6d4b\u8bd5\u673a\u6784"],
"comment":"\u5218\u533b\u751f\uff0c\u533b\u5b66\u535a\u58eb\uff0c10\u5e74\u7ecf\u9a8c","grade":"\u4e3b\u4efb\u533b\u5e08",
"worktime":"\u5de5\u4f5c\u65f6\u95f4",
"speciality":"\u4e13\u4e1a\u64c5\u957f\u547c\u5438",
"careerList":[],
"addressList":[{
  "title":"\u8054\u7cfb\u5730\u5740","content":"\u5730\u5740"}],
  "contactList":[{"title":"\u8054\u7cfb\u65b9\u5f0f","content":"\u8054\u7cfb\u4fe1\u606f"}],"certificationList":["\u8bc1\u4e66\u4fe1\u606f"],"prizeList":["\u83b7\u5956\u4fe1\u606f"],"statistics":[],"account":{"basic":null,"cards":false},"im_password":"3376718bd94336e4d3a01de0d6cdf79d","ftpconfig":{"ip":"47.92.127.107","port":"3224","user":"ftpuser","pass":"12345_abc&"}},
  "message":"Success"}

创建用户接口

mobile

12345678900

uname

王五

doc_uid

1008

birthday

1960-01-01

height

175

weight

75

sex

1

groupid

iscds

0

idnumber

120135196001011343

Patcode

pat12020120101

oauth_token

db4d903928256a7289971f372d4dff70

oauth_token_secret

68d3a07248da6c0c332bfa7a9e2488ff

但是响应请求返回401,判断应该是token问题。

解决的办法:

查看oauth_token和oauth_token_secret获取得不对,

用正则表达式

"oauth_token":"(.+?)"

此外检查到api_type没有添加,

解决的办法:

api_type 取1

从查看结果树中查看结果返回了绿色成功200。

以上实现了1个用户的测试场景,下面5个用户同时:

设置线程数=用户数,有两处需要设置:HTTP请求的线程组和HTTP请求默认值的线程组

添加到5,都可以成功。

查看结果树:

聚合报告:

汇总报告:

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

在这里插入图片描述

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值