Bootstrap

用Jmeter轻松搞定简单压力测试全步骤

一、前期准备工作

  (一)安装Jmeter相关环境

  在开始使用Jmeter进行压力测试之前,我们需要先做好相关的环境准备工作。

  首先,要确保电脑上已经安装好了JDK(Java Development Kit)环境。你可以前往Oracle官网(针对Oracle JDK)或者OpenJDK官网(针对开源的OpenJDK)根据自己的操作系统版本下载对应的JDK安装包,然后按照安装向导逐步完成安装。安装完成后,记得配置好 JAVA_HOME 环境变量,这个步骤在不同操作系统下略有不同。例如在Windows系统中,右键点击“我的电脑”,选择“属性”,然后在弹出的窗口中点击“高级系统设置”,进入“环境变量”设置界面,在“系统变量”里新建一个名为 JAVA_HOME 的变量,其值为JDK的安装路径(比如 C:\Program Files\Java\jdk1.8.0_XXX,这里的 XXX 是具体的小版本号)。同时,在“系统变量”里找到 Path 变量,点击编辑,在变量值的末尾添加 ;%JAVA_HOME%\bin(注意分号是英文状态下的,用于和前面已有的路径分隔开),这样就能在命令行等地方正常调用Java相关命令了。

  接着,我们去Jmeter官网(https://jmeter.apache.org/)下载适合你操作系统的Jmeter安装包。下载完成后,将其解压到你指定的目录下,比如解压到 D:\Program Files\apache-jmeter-XXX(XXX 为具体版本号)。之后进入解压目录下的 bin 目录,找到 jmeter.bat 文件(在Windows系统下,如果是Linux或macOS系统则是 jmeter.sh 文件),双击(或在命令行执行对应的启动文件)即可启动Jmeter,至此,Jmeter的基础环境搭建完成。

  (二)配置基础参数

  为了让我们后续在使用Jmeter进行操作和查看测试结果时更加方便,还需要对一些基础参数进行配置。

  Jmeter的配置文件是 jmeter.properties,它位于Jmeter安装目录下的 bin 目录中。我们可以使用文本编辑器(如Windows系统下的记事本或者专业的Notepad++等)打开这个文件进行修改。

  如果想将Jmeter的界面语言设置为中文,方便我们更好地理解各项操作和提示信息,找到文件中的 language=en 这一行,将 en 改为 zh_CN,保存文件后,下次启动Jmeter就会显示中文界面了。

  另外,考虑到在测试过程中可能涉及到各种字符编码的处理,为了避免出现乱码问题,建议将返回字符码设置为UTF-8。在 jmeter.properties 文件中找到 sampleresult.default.encoding=UTF-8 这一行,如果前面有 # 注释符号,将其去掉,确保这一行配置生效。

  二、创建测试计划核心内容

  (一)构建线程组

  1. 添加线程组

  当我们启动Jmeter后,映入眼帘的是它的可视化操作界面。在这个界面中,我们要开始构建压力测试的核心元素——线程组。

  操作很简单,在左侧的“测试计划”上右键单击,在弹出的菜单中选择“添加”->“线程(用户)”->“线程组”,这样就成功添加了一个线程组到测试计划中。线程组在整个压力测试过程中起着模拟并发用户的关键作用,它可以让我们根据实际需求来设定虚拟用户的数量、启动方式等参数,以此来模拟不同规模的用户访问场景。

  2. 设置线程组参数

  添加好线程组后,我们需要对其相关参数进行合理的设置,以贴合实际的测试场景。

  · 线程数:这个参数代表了我们模拟的虚拟用户数量。例如,如果我们想要模拟100个用户同时访问某个网站或者接口,那么就在这里填写 100。它是衡量压力大小的一个重要指标,数值越大,对服务器施加的压力也就越大。

  · 准备时长:也叫 ramp-up period(启动时间),它决定了启动所有虚拟用户所需要花费的时间。单位是秒,比如设置为 10 秒,那么Jmeter会在10秒钟内逐步启动完设定好的所有虚拟用户。合理设置这个参数可以让模拟的用户访问更接近真实情况,避免一下子全部涌入给服务器造成过大冲击。

  · 循环次数:表示每个虚拟用户发送请求的次数。如果设置为 -1,则代表无限循环,也就是虚拟用户会一直不停地发送请求,直到手动停止测试;如果设置为具体的数字,比如 5,那就意味着每个虚拟用户会重复发送5次请求。

  · 延迟线程创建:勾选这个选项后,Jmeter会在需要的时候才创建线程,而不是一开始就把所有线程都创建好,这在某些特定的测试场景下可以节省系统资源。

  我们要根据实际要测试的系统情况以及预期的测试效果,综合考虑来设置这些参数,确保测试的科学性和有效性。

  (二)添加HTTP请求

  1. 创建HTTP请求

  在线程组添加好之后,我们需要添加具体的HTTP请求来模拟用户的实际操作行为,比如访问网页、调用接口等。

  操作步骤是:右键单击刚才添加的线程组,在弹出的菜单中选择“添加”->“取样器”->“HTTP请求”,这样就创建好了一个HTTP请求元素。

  接下来要对这个HTTP请求进行详细的参数配置。

  · 协议:根据实际情况填写,常见的有 http 或者 https,比如要测试的网站使用的是 https 协议,那就填写 https 在这里。

  服务器名称或IP:填写要测试的目标服务器的域名或者IP地址,例如 www.example.com 或者 192.168.1.100 等。

  · 端口号:如果目标服务器使用的是非默认端口(http 默认端口是80,https 默认端口是443),那么就需要在这里填写实际的端口号,比如 8080 等。

  · 请求方法:可以选择 GET、POST、PUT、DELETE 等常见的HTTP请求方法,根据实际测试的接口或者页面请求方式来选择,例如对于一般的网页查询操作,可能使用 GET 方法,而提交表单数据等操作可能就需要使用 POST 方法。

  · 路径:填写具体的请求路径,也就是在服务器域名或者IP后面的那部分内容,比如访问某个网站的登录页面,路径可能是 /login 等。

  在填写这些参数时,一定要确保信息的准确性,它们直接关系到请求能否正确发送到目标服务器以及能否得到期望的响应。

  2. 配置性能相关设置

  除了上述基本的请求参数设置外,为了提高压力测试的准确性,还有一些和性能相关的设置需要关注。

  在HTTP请求的设置页面中,有一个“高级”选项卡,点击展开它。

  在这里,我们可以选择“使用Java实现”这个选项,它能够在一定程度上提高请求的性能和稳定性,特别是在高并发的压力测试场景下。

  另外,建议勾选“启用长连接(Keep-Alive)”选项,它可以让客户端和服务器之间建立持久连接,减少每次请求都重新建立连接所带来的开销,提高请求的发送效率,更符合实际网络环境中的情况,有助于获取更真实准确的测试结果。

  三、添加必要元件完善测试

  (一)添加配置元件

  在实际的压力测试中,仅仅有线程组和HTTP请求还不够,我们往往还需要添加一些配置元件来辅助完成更复杂的测试场景,满足不同的测试需求。

  比如,很多时候我们需要处理Cookie信息,这时就可以在线程组下方右键单击,选择“添加”->“配置元件”->“HTTP Cookie管理器”。添加成功后,在后续的测试过程中,Jmeter会自动处理服务器返回的Cookie,并在后续请求中带上相应的Cookie信息,就如同真实用户在浏览器中访问网站时浏览器自动处理Cookie一样,保证了测试的连贯性和真实性。

  再比如,如果测试的接口或者网页需要特定的请求头信息(Header),那么可以添加“HTTP Header管理器”。在其中,我们可以根据接口文档或者网页的要求,添加如 Content-Type(用于指定请求体的数据格式,常见的有 application/json、application/x-www-form-urlencoded 等)、Authorization(用于传递身份验证信息,比如Bearer Token等)等各种请求头信息,确保请求能够被服务器正确识别和处理。

  (二)添加断言

  为了验证我们发送的请求是否得到了预期的响应,也就是判断测试结果是否符合我们的期望,我们需要添加断言到测试计划中。

  操作方法是:右键单击线程组,选择“添加”->“断言”,在这里可以选择不同类型的断言,比较常用的是“响应断言”。

  在“响应断言”的设置界面中,我们可以根据响应数据的不同方面来判断请求是否正常。例如,我们可以设置“响应代码”的断言,在“模式匹配规则”里选择“等于”,然后在“要测试的响应代码”文本框中填写 200,这就意味着我们期望服务器返回的HTTP状态码是200,表示请求成功处理。除此之外,还可以对响应的消息体内容进行断言,比如通过设置包含特定的字符串等规则来判断响应内容是否正确,比如我们期望在响应体中包含“success”这个单词,就可以在相应的设置区域进行添加和配置,只要服务器返回的响应体中包含这个单词,就认为这个请求的响应是符合预期的,否则就判定为测试失败。

  四、添加监听器查看测试结果

  (一)添加查看结果树

  在完成了上述的测试计划构建和相关元件添加后,我们还需要添加监听器来查看测试的结果,这样才能知道压力测试的实际情况如何。

  其中一个很直观的监听器就是“查看结果树”。添加的操作是:右键单击线程组,选择“添加”->“监听器”->“查看结果树”。

  添加好之后,当我们运行测试计划,就可以通过这个“查看结果树”监听器来查看每一个HTTP请求的详细情况了,包括请求的发送内容、服务器返回的响应内容等。它还提供了不同的显示格式,比如“文本”格式可以直接查看原始的请求和响应文本信息,“HTML”格式则会以网页的形式展示响应内容(如果返回的是HTML页面的话),方便我们根据实际需求去查看和分析具体的数据。

  (二)添加聚合报告

  除了“查看结果树”这个监听器外,“聚合报告”也是在压力测试中非常重要的一个监听器,它能够从宏观的角度展示整个测试过程的关键性能指标。

  添加“聚合报告”监听器的操作和添加“查看结果树”类似,同样是右键单击线程组,然后选择“添加”->“监听器”->“聚合报告”。

  在运行测试计划后,我们可以在“聚合报告”中看到一系列关键的性能指标数据,下面来详细解读一下这些参数的含义:

  · 请求总数:表示在整个测试过程中总共发送的请求数量,它等于线程数乘以循环次数(如果循环次数不是 -1 的话),通过这个数据我们可以大致了解测试的规模大小。

  · 平均响应时间:是指所有请求的响应时间的平均值,单位通常是毫秒。这个指标能够反映出服务器处理请求的平均速度,平均响应时间越短,说明服务器的性能越好,处理请求的效率越高。

  · 错误率:用百分比来表示,计算的是出现错误响应(比如返回的状态码不是我们期望的,或者响应内容不符合断言要求等情况)的请求数量占总请求数量的比例。如果错误率过高,那就说明系统在当前压力下可能存在性能问题或者功能缺陷,需要进一步排查原因。

  · 吞吐量:指的是单位时间内服务器处理的请求数量,单位通常是“请求数/秒”,它反映了服务器的处理能力,吞吐量越高,说明服务器在单位时间内能够处理更多的请求,性能也就越强。

  通过对这些参数的综合分析,我们可以全面地评估系统在高负载情况下的性能表现,找出可能存在的性能瓶颈或者问题所在。

  五、运行测试计划与结果分析

  (一)运行测试计划

  当我们把测试计划以及相关的元件、监听器都配置好之后,就可以运行测试计划来开展压力测试了。

  不过需要注意的是,虽然Jmeter提供了可视化的GUI界面来运行测试,但在实际进行压力测试尤其是大规模并发测试时,不建议单纯使用GUI界面来运行,因为GUI界面本身会消耗一定的系统资源,可能会影响测试结果的准确性,甚至在高并发情况下可能导致Jmeter本身出现卡顿或者内存溢出等问题。

  更好的做法是通过命令行来运行测试计划。进入Jmeter安装目录下的 bin 目录,打开命令行窗口(在Windows系统下是 cmd,在Linux或macOS系统下是终端),然后输入类似这样的命令:

  jmeter -n -t [测试计划文件名.jmx] -l [结果文件名.jtl]

  其中,-n 表示以非GUI模式运行,-t 后面跟着的是你创建好的测试计划文件的完整路径和文件名(文件后缀是 .jmx),-l 后面跟着的是要生成的测试结果文件的名称(文件后缀是 .jtl),你可以根据自己的实际情况来指定合适的文件名和保存路径。

  例如:jmeter -n -t D:\test_plan\my_test_plan.jmx -l D:\test_result\my_result.jtl,这样Jmeter就会按照我们配置好的测试计划在后台以非GUI模式运行,并将测试结果保存到指定的 .jtl 文件中,方便后续进一步的分析和处理。

  (二)分析测试结果

  在测试计划运行完成后,我们就可以根据之前添加的监听器(如查看结果树、聚合报告等)展示的数据来对测试结果进行深入的分析了。

  首先,重点关注聚合报告里的关键性能指标,比如平均响应时间,如果这个数值在不断增加,或者远远超出了我们预期的合理范围,那就可能意味着服务器在处理大量请求时出现了性能瓶颈,可能是数据库查询效率低下、服务器资源不足(如CPU、内存等资源使用率过高)等原因导致的。

  再看错误率,如果错误率不为0,需要仔细查看查看结果树里对应的请求的详细情况,分析是请求本身的参数问题、服务器端的逻辑错误,还是因为压力过大导致的系统崩溃等原因造成的响应不符合预期。

  而吞吐量这个指标,如果发现随着虚拟用户数的增加,吞吐量并没有相应地提升,甚至出现下降的情况,也说明系统的处理能力可能在当前压力下达到了极限,需要进一步排查是网络带宽限制、服务器配置不足还是代码逻辑等方面的问题。

  根据分析出来的结果,我们可以对系统进行相应的优化调整,比如优化数据库查询语句、增加服务器资源、优化代码逻辑等,然后再次运行测试计划,观察各项指标的变化情况,不断重复这个过程,直到系统在预期的压力情况下能够稳定、高效地运行,满足业务需求为止。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

;