【软件测试】学习笔记-构建并执行 JMeter 脚本的正确姿势

news2024/10/3 10:33:01

有些团队在组建之初往往并没有配置性能测试人员,后来随着公司业务体量的上升,开始有了性能测试的需求,很多公司为了节约成本会在业务测试团队里选一些技术能力不错的同学进行性能测试,但这些同学也是摸着石头过河。他们会去网上寻找一些做性能的方案,通常的步骤是写脚本,出结果然后交给开发。这虽然能够依葫芦画瓢地完成一些性能测试的内容,但整个过程中会存在不少值得商榷之处。

这篇文章就以脚本为切入点,探讨在脚本构建与执行过程中可能存在不规范的地方有哪些,以及如何去解决。

脚本构建

脚本构建就是编写脚本,是你正式开始执行性能测试的第一步,对于常规的请求来说只需要通过界面的指引就可以完成,这个是非常容易的,但是上手容易不代表你使用方法科学,下面我带你看看常见的误区。

一个线程组、一条链路走到底

先来看下这样一张线程组的图:

图 1:一个线程组

图中包含了注册、登录、浏览商品、查看订单等,它们在同一个线程组,基于同一线程依次进行业务。这样的做法其实和自动化非常相似。

比如张三先注册一个网站,然后进行登录、添加购物车等操作。但仔细想一想,对于一个网站的性能而言,这么考虑是有些问题的。

在正常情况下,基于同一个时间节点,一部分人在浏览商品,而另一部分人在下单。这两部分之间没有先后关系,人数占比也不一定就是 1:1。脚本中的设计思路实际上也是你对性能测试模型的理解,能够反馈出模型中的用户访问比例分布,这块内容我会在第二模块重点描述,不仅会讲述满足脚本的跑通,还会通过脚本构建基于性能模型的场景。

未提取公共部分,增加脚本管理难度

我在平时的工作中发现,有的测试会基于同一类型的 HTTP 请求,配置相同的 host、端口等,并没有很好地利用JMeter 中作用域的思想

一般全链路级别的测试脚本里可能会包含上百个接口,对于一些 host 和端口号,并不需要每一个接口都去配置,我们可以使用一个 HTTP 请求默认值去做公共部分。如果说不提取这些公共部分,每改动一个配置,所有接口可能都要改动,这样脚本维护成本工作量也会比较大,有可能会造成“牵一发而动全身”的情况。

查看结果树使用频率高

在脚本调试过程中,我们通常会添加结果树来实时查看返回数据的正确性。这个插件本身是比较消耗性能的,在正式压测中应当禁止使用。一般来说,在脚本调试中通过作用域的思想去配置一个查看结果树就可以了,不要过度使用,不然等到正式压测的时候,一个个地禁用结果树不仅会消耗时间,还容易遗漏。

脚本逻辑复杂

有的测试在编写脚本的过程中为了区分业务逻辑,会使用很多插件,比如 if 判断、循环, 这些插件虽然可以让你进入不同的业务场景,但会增加脚本的复杂度,影响发起压力的效率。你可以自己做一些对比测试,看使用该插件和去除该插件实际的处理能力相差多少,不要因为自己的脚本结构而影响实际的性能测试结果。

以上是在脚本构建时,一些普遍存在的误区,而规范的脚本构建,我认为要做到真实和精简

  • 真实在于你的脚本可以体现出真实的用户访问场景;
  • 精简在于少使用周边的插件,比如通过 JMeter 去监控服务器资源,这样的监控不仅简单粗糙,而且较大地影响 JMeter 的压力发起的效率。

脚本执行

在正确构建了脚本之后,我们就要来看如何执行脚本了。脚本执行就是你怎么去运行脚本,可能有的同学会一头雾水,我直接点击界面上的运行按钮不就行了吗?事实上真正的压测可不是这个样子的。

界面化执行性能测试

一些测试人员在 Windows 或 Mac 环境编写完脚本后,会直接用界面化的方式进行性能测试,这样的做法是非常不规范的。打开 JMeter 界面之后就会弹出提示,如图 2 所示:

图 2:界面化性能测试提示

很多人会选择直接忽略掉,但图中的第一段是这样的:

Don’t use GUI mode for load testing!only for Test creation and Test debugging。For load testing,use NON GUI Mode。

中文意思就是图形化模式只让你调试,不要进行压测

图形化的压测方式会消耗较多的客户端性能,在压测过程中容易因为客户端问题导致内存溢出。既然官方不推荐我们使用图形化界面,那我们应当如何执行测试脚本呢?

我们来看图 2 中的第三行内容:

jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

官方早已给出答案:通过命令行执行。命令行执行的方式同样适用于 Windows、Mac 和 Linux 系统,不需要纠结系统兼容性的问题。

那既然命令行执行的方式不会造成这样的问题,为什么还要用界面化的方式呢?

相对于命令行执行,界面化的方式更为简单、方便,但命令行执行也并不是完美无缺的。

我们来回顾这段文字中的含义:

jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

  • -n 表示在非 GUI 模式下运行 JMeter;
  • -t 表示要运行的 JMeter 测试脚本文件,一般是 jmx 结尾的文件;
  • -l 表示记录结果的文件,默认以 jtl 结尾;
  • -e 表示测试完成后生成测试报表;
  • -o 表示指定的生成结果文件夹位置。

我们来看一下执行了上面的脚本后的实际效果,如图 3 所示:

图 3:脚本执行后的效果

从图中可以看到,命令行的方式直接产生了总的 TPS、报错和一些时间层级的指标。命令行的执行方式规避了一些图形化界面存在的问题,但这样的结果输出方式存在 2 个问题:

  • 看不到实时的接口返回报错的具体信息;
  • 看不到混合场景下的每个接口的实时处理能力。

这 2 个问题都有个关键词是“实时”,是在压测过程中容易遗漏的点。虽然压测之后我们有很多方式可以回溯,但在性能测试过程中,发现、排查、诊断问题是必不可少的环节,它能够帮助我们以最快的速度发现问题的线索,让问题迅速得到解决。

先来看第一点:看不到实时的接口返回报错的具体信息

jmeter.log 刚刚执行过程中记录了哪些内容呢?如图 4 所示:

图 4:jmeter.log 执行时记录的内容

你可以看到只能显示报错率,但看不到具体的报错内容,那如何去解决呢?一般我会使用 beanshell,把判定为报错的内容增加到 log 里。beanshell 的示意代码如下所示,你可以根据自己的需求改进。

String response = prev.getResponseDataAsString();



//获取接口响应信息


String code = prev.getResponseCode();


//获取接口响应状态码


if (code.equals("200")){//根据返回状态码判断


	log.info("Respnse is " + response);


    //打印正确的返回信息,建议调试使用避免无谓的性能消耗


}else {


	log.error("Error Response is"+response);


    //打印错误的返回信息


	}

这样就会自动在 jmeter.log 中打印出具体的报错信息,如图 5 所示:

图 5:报错信息

客户端的日志只是我们需要关注的点之一,排查错误的根因还需要结合服务端的报错日志,一般来说服务端的报错日志都有相关的平台记录和查询,比较原始的方式也可以根据服务器的路径找相关日志。

我们再来看第二个问题:看不到综合场景下的每个接口的实时处理能力

我个人认为原生的实时查看结果是有些鸡肋的,如果想实时且直观地看到每个接口的处理能力,我比较推荐 JMeter+InfluxDB+Grafana 的方式,基本流程如下图所示:

图 6:JMeter+InfluxDB+Grafana

JMeter 的二次开发可以满足很多定制化的需求,但也比较考验开发的能力。如果不想进行二次开发,JMeter+InfluxDB+Grafana 也是一种比较好的实现方式了。

下面,对 InfluxDB 和 Grafana 做一个简单的介绍,包括特点、安装等。

InfluxDB

InfluxDB 是 Go 语言编写的时间序列数据库,用于处理海量写入与负载查询。涉及大量时间戳数据的任何用例(包括 DevOps 监控、应用程序指标等)。我认为 InfluxDB 最大的特点在于可以按照时间序列面对海量数据时候的高性能读写能力,非常适合在性能测试场景下用作数据存储。

安装

首先带你来看下 InfluxDB 具体的安装步骤(基于 CentOS 7.0),直接输入以下命令行即可:

#wget https://dl.influxdata.com/influxdb/releases/influxdb-1.1.0.x86_64.rpm


#rpm -ivh Influxdb-1.1.0.x86_64.rpm


#systemctl enable Influxdb


#systemctl start Influxdb


#systemctl status Influxdb  (查看 Influxdb 状态)
基本操作

当你已经安装完成之后,我带你了解下如何操作 InfluxDB:

#influx 


linux 命令行模式下进入数据库


#show databases
查看库
create database jmeter;
建库
use jmeter
使用该库
show measurements;
查看库下面的表

InfluxDB 成功安装并且建库之后,我们就可以来配置 JMeter 脚本了。配置过程可以分为以下 3 步。

(1)添加核心插件,在 listener 组件中选择 Backend Listener(如下图所示)。

图 7:添加 Backkend Listenner

(2)Backend Listener implementation 中选择第二项(如下图所示)。

图 8:Backend Listener implementation

(3)配置 InfluxDB URL,示例“http://127.0.0.1:8086/write?db=jmeter”;IP 为实际 InfluxDB 地址的 IP,DB 的值是 InfluxDB 中创建的库名字(如下图所示)。

图 9:配置连接 influxdb 库的具体信息

配置完后运行 JMeter 脚本,再去 InfluxDB 的 JMeter 数据库中查看是否有数据,有数据则代表如上链路配置没有问题。

再来了解一下 Grafana。

Grafana

Grafana 是一个跨平台的开源的度量分析和可视化工具,纯 JavaScript 开发的前端工具,通过访问库(如 InfluxDB),展示自定义报表、显示图表等。大多时候用在时序数据的监控上。Grafana 功能强大、UI 灵活,并且提供了丰富的插件。

安装步骤

在 linux 命令行下直接输入以下内容即可:

#wget https://dl.grafana.com/oss/release/grafana-6.4.4-1.x86_64.rpm


#下载 granafa


#yum install  Grafana-6.4.4-1.x86_64.rpm


#安装,遇到需要输入的直接 y 就 ok;


#systemctl start Grafana-server


#systemctl enable Grafana-server


#启动 Grafana


#/etc/Grafana/Grafana.ini


配置文件路径,一般保持默认配置即可。


#systemctl  status   firewalld.service


查看防火墙状态,防止出现其他干扰问题,最好关闭


登录访问 Grafana 访问:http://127.0.1.1:3000(ip 自行替换,3000 为默认端口)


默认账号/密码:admin/admin

输入密码后如果出现了如下界面,说明 Grafana 安装成功了。

图 10:Grafana 界面

数据源配置

为什么要配置数据源呢,简单来说就是 Grafana 需要获取数据去展示,数据源的配置就是告诉你去哪里找数据,配置安装的 InfluxDB 地址和端口号,如下图所示:

图 11:配置地址和端口号

然后输入 InfluxDB 中写入的数据库名字,如下图所示:

图 12:数据库名字

输入完成之后可以 Save & Test,如出现以下示意图即配置成功:

图 13:配置成功

导入 JMeter 模板

为了达到更好的展示效果,Grafana 官网提供了针对性的展示模版。先下载 JMeter 模板,然后再导入 Grafana。

图 14:导入 JMeter 模板

配置完成后,运行 JMeter 脚本。如果在界面右上方下拉选择 5s,则每 5s 更新一次:

图 15:运行 JMeter 脚本

如上图便是完成了实时压测情况下运行结果的实时展示图,你可以以此为基础,进行多接口的数据采集,相应增加脚本里的 Backend Listener 插件,区分不同的 application name 名称,你会看到不同的接口数据都进入 influxdb 数据库中。并且 Grafana 从 Edit 中进入, 你可以根据不同的 application name 修改 SQL 来区分展示。

图 16:编辑 Grafana

总结

这一篇主要介绍了构建和执行性能测试脚本时的一些注意事项,总结了目前业内使用 JMeter 常见的方法。你不仅需要知道这些常见的手段,也需要知道为什么要这么做,这么做有什么好处,同样随着实际采集数据指标的增高,这些做法可能还会存在哪些缺陷或者注意点,如果上述内容你都能考虑清楚了,相信你也就掌握工具了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1412581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言指针变量

1. 指针变量 区别于C/C中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 Go语言中的指针3个概念:指针地址、指针类型和指针取值。 1.1. Go语言中的指针 Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候&a…

zuul网关

zuul网关 zuul自定义过滤器hystrix和ribbon时间RibbonAutoConfiguration自动配置FeignAutoConfiguration自动配置RibbonEurekaAutoConfigurationSendErrorFilter过滤器EnableZuulServerHasFeatures EnableZuulProxy zuul自定义过滤器 继承ZuulFilter类,实现其方法f…

【论文笔记】Learning Deconvolution Network for Semantic Segmentation

重要说明:严格来说,论文所指的反卷积并不是真正的 deconvolution network 。 关于 deconvolution network 的详细介绍,请参考另一篇博客:什么是Deconvolutional Network? 一、参考资料 Learning Deconvolution Netwo…

十分钟搭建本地Linux开发运行环境

十分钟搭建本地开运行环境 linux环境请参考:5分钟搭建本地linux开发环境 环境:宝塔、Jdk、Mysql、Redis 1、宝塔: 官网地址:宝塔官网 yum install -y wget && wget -O install.sh https://download.bt.cn/install/in…

图形化方式利用脚手架创建Vue项目

图形化方式利用脚手架创建Vue项目 1 安装node.js(附带安装npm)安装v14.3.0版本 查看安装版本 node -v 2 安装cnpm npm install -g cnpm 查看安装版本 cnpm -v 以管理员身份运行powershell,运行 set-ExecutionPolicy RemoteSigned 3…

【VSAN数据恢复】VSAN数据重构迁移失败的数据恢复案例

VSAN简介: VSAN存储是一个对象存储,以文件系统呈现给在vSphere主机上。这个对象存储服务会从VSAN集群中的每台主机上加载卷,将卷展现为单一的、在所有节点上都可见的分布式共享数据存储。 对于虚拟机来说,只有一个数据存储&#x…

Modern C++ std::shared_ptr的实现原理

shared_ptr的UML图 注意:这是Linux上GCC 8.5.0的实现版本 先看下它的继承关系。 shared_ptr里面的数据成员 有了上面的UML图,可能还没有一个直观的认识,下面我们把这些成员打印出来。 当然得先写个小小的程序: $ cat shared_ptr.cpp #include <memory> #include…

单元测试——题目十二

目录 题目要求: 定义类 测试类 题目要求: 根据下列流程图编写程序实现相应处理,执行j=10*x-y返回文字“j1=:”和计算值,执行j=(x-y)*(10⁵%7)返回文字“j2=:”和计算值,执行j=y*log(x+10)返回文字“j3=:”和计算值。 编写程序代码,使用JUnit框架编写测试类对编写的…

【开源】基于JAVA语言的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

RHCE项目:使用LNMP搭建私有云存储

目录 一、准备工作 1、关闭防火墙、安全软件 2、搭建LNMP环境 3、上传软件 4、设置nextcloud安装命令权限 二、数据库 1、设置数据库 2、重启数据库 三、配置nginx 四、安装nextcloud 五、内网穿透 1、创建内网映射 2、linux系统安装花生壳客户端 3、重新打开浏览…

《幻兽帕鲁》爆火,玩家在阿里云上部署联机服务器:全程仅3分钟

《幻兽帕鲁》大卖800万份&#xff0c;玩家纷纷上阿里云光速搭建联机服务器 《幻兽帕鲁》爆火&#xff0c;玩家在阿里云上部署联机服务器&#xff1a;全程仅3分钟 1月26日消息&#xff0c;生存类游戏《幻兽帕鲁》异常火爆&#xff0c;发售仅6天销量就突破了800万份&#xff0c;在…

在docker中配置 Linux ls 配色方案 与 shell 提示符

发行版中默认的配置一般非常合理&#xff0c;但是docker中往往忽略了这些简单的配置&#xff0c;备忘一下 1. ls 配色方案 vim &#xff5e;/.bashrc 在文件最末尾加入如下一行内容&#xff1a; export LS_COLORS"rs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40…

APUE学习之管道(pipe)与命名管道(fifo)

目录 一、简介 二、管道&#xff08;Pipe&#xff09; 1、管道的基本概念 2、管道的局限性 3、管道的创建 4、管道的读写规则 5、实战演练 三、命名管道&#xff08;fifo&#xff09; 1、命名管道的基本概念 2、命名管道的创建 3、实战演练 4、运行结果 四、补充 …

深入理解stress/stress-ng

文章目录 一、概述二、安装2.1、源码编译安装2.2、命令行安装2.3、安装确认 三、重要参数详解3.1、查询支持的参数3.2、重要参数说明 四、实例4.1、压测CPU4.2、压测内存4.3、压测IO4.4、压测磁盘及IO4.5、压测磁盘及CPU 团队博客: 汽车电子社区 一、概述 stress是一种工作负载…

Java基础进阶03-注解和单元测试

目录 一、注解 1.概述 2.作用 3.自定义注解 &#xff08;1&#xff09;格式 &#xff08;2&#xff09;使用 &#xff08;3&#xff09;练习 4.元注解 &#xff08;1&#xff09;概述 &#xff08;2&#xff09;常见元注解 &#xff08;3&#xff09;Target &#x…

Codewave学习体验分享:低代码开发世界的黑马

前言 Codewave平台介绍 CodeWave智能低代码开发平台基于网易自研拥有大规模参数和深度学习能力的智能模型底座产品架构,为企业级应用提供更加智能化研发的软件生产方式,IT人员可以轻易实现从“智能生成”到“可视化拖拽调整”的全栈低代码应用搭建,让复杂应用开发更加高效,加快…

百度百科词条编辑规则是什么?

百度百科词条编辑规则是指在百度百科平台上编辑和创建词条时需要遵循的一系列标准和指南。百度百科作为全球最大的中文百科全书&#xff0c;旨在为用户提供准确、全面、客观的知识信息。为了确保词条内容的质量&#xff0c;百度设定了严格的编辑规则。伯乐网络传媒来给大家分享…

2 搭建模块环境

2.1 架构的问题分析 当前要开发的是媒资管理服务&#xff0c;目前为止共三个微服务&#xff1a;内容管理、系统管理、媒资管理&#xff0c;如下图&#xff1a; 后期还会添加更多的微服务&#xff0c;当前这种由前端直接请求微服务的方式存在弊端&#xff1a; 如果在前端对每…

电脑监控软件都有哪些,哪款好用 | 四款热门软件盘点

在信息化时代&#xff0c;电脑已经成为我们工作和生活中不可或缺的工具。然而&#xff0c;随着电脑使用的普及&#xff0c;也带来了一些安全和隐私方面的问题。 为了保护企业的机密资料和员工的行为规范&#xff0c;越来越多的企业开始使用电脑监控软件来加强管理和监控。 本…

常见问题-d3dx9_39.dll丢失如何解决,快速修复d3dx9_39.dll丢失教程

d3dx9_39.dll 是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它是微软 DirectX 组件的一部分&#xff0c;主要用于支持 3D 图形和声音处理功能。这个文件通常在运行需要 DirectX 支持的游戏或应用程序时被调用。 一、d3dx9_39.dll文件属性 以下是 d3dx9_39.dl…