本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Apache JMeter是一个开源性能测试工具,由Java编写,支持跨平台兼容性,广泛用于服务器和应用性能评估。JMeter从Web应用测试起家,现已演化为多用途的测试框架,能对多种协议和服务执行负载和压力测试。其核心功能包括负载测试、稳定性测试、功能测试、分布式测试等,并支持丰富的协议和测试元素。本教程将指导读者安装和使用JMeter 2.13版本,涵盖JMeter的安装目录结构、主要组件介绍,以及如何运行和分析测试结果,从而让读者能够有效地构建测试计划并提升性能测试技能。 技术专有名词:Apache JMeter

1. Apache JMeter简介及版本特性

Apache JMeter是一个开源的Java应用程序,它被设计用于负载测试和性能测试各种不同的服务,尤其是Web应用程序。作为一个功能强大的性能测试工具,JMeter拥有着活跃的社区和定期更新的版本。

1.1 JMeter的历史和版本迭代

JMeter自1998年由Stefano Mazzocchi发起项目以来,经过了多年的迭代发展,引入了新的特性和改进。每一个版本的发布都伴随着对性能、稳定性和用户体验的提升。举例来说,JMeter 5.0版本带来了对HTTP/2协议的支持,并改进了GUI界面的使用体验。

1.2 JMeter的安装和环境配置

JMeter可以通过Java Web Start或下载可执行的ZIP文件来安装。安装后,配置测试环境是必要的步骤,包括设置Java运行环境、安装和配置必要的插件以及调整内存参数等。

# 下载并解压JMeter
tar -zxvf apache-jmeter-5.0.zip
cd apache-jmeter-5.0/bin

启动JMeter,可以通过执行 jmeter.sh (Linux/macOS) 或者 jmeter.bat (Windows)。

1.3 JMeter 2.13版本的新特性

JMeter 2.13版本在提升测试稳定性和测试脚本的易用性上做出了重要改进。其中显著的新特性包括JSON和HTML报告器、更加完善的CSV Data Set Config功能、以及对WebSocket的支持,这些更新使得JMeter能够更好地适配现代Web技术。

随着JMeter版本的更新,用户可以期待更多针对性能测试的增强功能以及对最新互联网技术的适应。了解这些历史和版本特性对于正确选择和使用JMeter进行性能测试至关重要。

2. JMeter核心功能和测试类型

2.1 JMeter的测试计划设计

测试计划是JMeter运行的基石,它定义了测试的总体目标和流程。设计一个优秀的测试计划对于达到测试目的至关重要。本章节将详细解释如何创建和组织测试计划,以及如何使用各种元件来构建测试场景。

2.1.1 测试计划的创建与组织

在JMeter中,一个测试计划可以包含一个或多个线程组(Thread Groups),每个线程组代表一组虚拟用户并发地执行测试任务。创建测试计划通常包括以下步骤:

  1. 打开JMeter,选择菜单中的“File” -> “New” -> “Test Plan”来创建一个新的测试计划。
  2. 在测试计划中添加线程组,通过右键点击测试计划,选择“Add” -> “Threads(Users)” -> “Thread Group”。
  3. 在线程组的配置界面中,可以设置线程数(模拟的用户数)、循环次数等参数,这些参数将影响测试的执行方式。
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4.1">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="测试计划" enabled="true">
      <stringProp name="***ments">JMeter测试计划的示例</stringProp>
      <!-- 其他属性和子元素 -->
    </TestPlan>
    <hashTree>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组" enabled="true">
        <!-- 线程组的详细配置 -->
      </ThreadGroup>
      <!-- 其他线程组或元素 -->
    </hashTree>
  </hashTree>
</jmeterTestPlan>

测试计划的组织结构,通常是将测试用例按照功能、业务流程或性能目标分类,使用不同的线程组或逻辑控制器(Logic Controllers)来构建。逻辑控制器允许测试工程师创建更复杂的测试场景,如仅在特定条件下执行某些测试步骤。

2.1.2 元件的使用和配置

JMeter支持多种元件,如取样器(Samplers)、逻辑控制器、监听器(Listeners)、配置元件(Config Elements)等。这些元件共同工作,使得测试计划能够灵活地应对各种测试需求。

取样器负责发送请求到服务器,并接收响应。逻辑控制器用于控制取样器的执行逻辑。监听器则收集和展示测试数据。配置元件为测试计划中的采样器提供所需的配置信息。

2.2 JMeter支持的测试类型

JMeter不仅支持性能测试,还具备了进行压力测试、功能测试和回归测试的能力。这些测试类型基于不同的测试目标和策略,帮助测试工程师全面地评估被测应用的性能和稳定性。

2.2.1 性能测试

性能测试是JMeter的主要测试类型之一,通过模拟多个用户同时对服务器发起请求来评估系统的响应时间、吞吐量、资源利用率等性能指标。JMeter可以使用HTTP请求取样器(HTTP Request Samplers)对Web应用进行性能测试,支持多种协议,如HTTP、HTTPS、FTP等。

import org.apache.jmeter.protocol.http.sampler.HTTPSampler;
import org.apache.jmeter.threads.JMeterVariables;

HTTPSampler mySampler = new HTTPSampler();
mySampler.setDomain("***");
mySampler.setPort(80);
mySampler.setPath("/index.html");
mySampler.setMethod("GET");

在进行性能测试时,重要的是确保测试计划能够尽可能地模拟真实的用户行为,包括请求的频率、不同类型的数据负载等。

2.2.2 压力测试

压力测试通常是为了找出系统的瓶颈。在JMeter中,压力测试可以通过增加线程数或迭代次数来实现。压力测试的目的不仅是发现系统的最大容量,还包括系统在高负载情况下的表现和错误处理能力。

import org.apache.jmeter.protocol.http.control.Threads;

Threads threads = new Threads();
threads.setNumThreads(100); // 设置并发用户数
threads.setRampUp(10); // 设置启动时间
threads.setLoopCount(100); // 设置循环次数

压力测试需要精确控制测试的流量,JMeter提供了丰富的监控和监听器工具来帮助工程师分析系统在压力下的表现。

2.2.3 功能测试

功能测试主要验证应用程序的各项功能是否按照需求正常工作。JMeter可以通过JMeter断言(Assertions)来检查服务器响应的正确性。使用JMeter进行功能测试时,可以模拟各种正常的和异常的用户行为,验证应用程序是否能够正确地返回预期结果。

import org.apache.jmeter.assertions.ResponseAssertion;
import org.apache.jmeter.assertions.String Assertion;

ResponseAssertion myAssertion = new ResponseAssertion();
myAssertion.setTestField(ResponseAssertion.RESPONSE_DATA);
myAssertion.setPattern("expected response");
myAssertion.setAssertionFailureMessage("Response not as expected");
myAssertion.setAssertionResultMessage("Assertion passed");

对于复杂的应用,可能需要使用JMeter的JDBC请求、SOAP/RESTful Webservice请求等其他类型的取样器来进行功能测试。

2.2.4 回归测试

随着应用开发的进行,新功能的引入或现有功能的修改可能会对应用的其他部分产生影响。回归测试就是用来确保这些修改没有破坏原有的功能。JMeter可以重复使用之前定义的测试计划或测试脚本来进行回归测试。

import org.apache.jmeter.protocol.http.control.Threads;

// 设置线程数为之前测试的用户数
Threads threads = new Threads();
threads.setNumThreads(previous_test_thread_number);
threads.setRampUp(ramp_up_time);
threads.setLoopCount(previous_test_loop_count);

在进行回归测试时,重点在于快速发现问题和验证修复效果,JMeter的快速执行和结果分析功能可以有效地支持回归测试工作。

JMeter的测试计划设计和测试类型的选择是一个复杂但有序的过程,它需要测试工程师对测试目标有深刻的理解,并且能够灵活运用各种测试技术和工具。通过上文对测试计划的创建与组织、元件的使用以及不同测试类型特点的介绍,测试工程师可以更加高效地构建测试场景,准确地评估软件系统的性能和稳定性。

3. 分布式测试及性能评估

3.1 分布式测试的原理和配置

3.1.1 服务器和代理的设置

在进行大规模的性能测试时,单台机器可能无法满足负载需求,这时就需要采用分布式测试。分布式测试通过多台机器协同工作,模拟多用户访问服务器,从而提供更加真实的测试环境。在JMeter中,分布式测试需要至少一个服务器(Master)和多个代理(Slaves)。

设置服务器和代理的步骤如下:

  1. 下载并安装代理: 在每个代理机器上下载JMeter的安装包,解压并配置好JMeter环境,然后执行 jmeter-server.bat (Windows系统)或 jmeter-server (Linux系统)启动代理进程。

  2. 配置防火墙: 确保代理机器的防火墙设置允许远程机器进行连接。

  3. 启动服务器: 在主控机上启动JMeter,选择“Options”菜单中的“远程启动”选项,并输入所有代理机器的IP地址和端口(默认为1099端口)。如果使用默认配置,启动时,JMeter会自动搜索本地网络中的代理并尝试连接。

  4. 验证连接: 启动后,可以从主控机的“远程服务器”对话框中查看所有已连接的代理。每个代理后面会显示其状态,如 Remote IP:port (connected) 。

3.1.2 分布式运行模式的工作原理

分布式运行模式的工作原理基于一个主控机(Master)和多个代理(Slave)。在测试计划运行时,主控机负责协调整个测试过程,包括分发测试计划给各个代理,并收集代理返回的测试结果数据。

具体的工作流程如下:

  1. 测试计划分发: 主控机首先编译测试计划,然后将测试计划发送给所有已连接的代理。

  2. 并发执行: 各个代理在自己的机器上并发执行测试计划,并将执行结果实时地回传给主控机。

  3. 结果收集: 主控机收集所有代理返回的数据,并进行汇总和处理。

  4. 数据分析: 测试结束后,主控机上的监听器组件(Listeners)将对收集到的数据进行分析,生成测试报告和图表。

通过这种方式,分布式测试可以有效地扩展测试规模,提高测试的并发量,模拟真实环境下成千上万用户同时访问系统时的性能表现。

3.2 性能评估指标和分析

3.2.1 常用性能指标的解读

在性能测试中,评估服务器或应用程序的性能时,会关注一系列关键的性能指标(KPIs)。以下是一些常用性能指标:

  • 响应时间(Response Time): 从发起请求到接收到响应的总耗时。它是衡量用户体验的重要指标,通常以毫秒(ms)为单位。

  • 吞吐量(Throughput): 在单位时间内完成的请求数或传输的数据量。它可以表示系统处理请求的能力,通常以请求/秒(requests per second, rps)或者每秒字节数(bytes per second, Bps)为单位。

  • 错误率(Error Rate): 在测试过程中出现的错误请求数占总请求数的百分比。错误率可以帮助我们了解系统的稳定性。

  • 事务成功率(Transaction Success Rate): 成功执行的事务占总事务数的百分比。事务通常是指一系列相关的请求,例如在线购物的下单流程。

  • 资源利用率(Resource Utilization): 系统硬件(CPU、内存、磁盘、网络)的使用情况。资源利用率可以帮助我们判断是否存在资源瓶颈。

3.2.2 性能测试结果的分析方法

分析性能测试结果时,我们通常会关注如下几个方面:

  1. 趋势分析: 观察响应时间、吞吐量等指标随时间的变化趋势。如果这些指标在测试过程中持续上升或下降,这可能预示着系统性能的变化。

  2. 比较分析: 如果进行了多次测试(如在不同压力下的测试),对比每次测试的结果,看看系统在不同负载下的表现。

  3. 关联分析: 分析系统资源使用情况和性能指标之间的关联。例如,如果CPU使用率上升同时响应时间也在增加,这可能表明CPU是瓶颈。

  4. 阈值分析: 根据业务需求,设定性能指标的阈值,判断系统是否满足性能要求。

  5. 瓶颈分析: 识别性能瓶颈,即系统中限制性能的关键因素。瓶颈可能是软件缺陷、硬件限制或配置问题。

使用工具和图形化方式辅助分析性能测试结果也非常有效。JMeter提供了各种监听器组件,如聚合报告(Aggregate Report)、图形结果(Graph Results)等,可以以表格、图表等形式直观展示测试数据,帮助分析性能瓶颈和系统行为。通过这些方法,测试人员能够对性能测试结果进行全面的分析,为系统优化提供依据。

4. 支持的协议和服务类型

4.1 JMeter支持的协议

4.1.1 Web协议测试

Web协议测试是JMeter的一个核心功能,用于模拟浏览器与Web服务器之间的交互,对Web应用程序进行压力测试。JMeter支持HTTP和HTTPS协议,并且可以通过插件支持WebSocket等其他协议。在进行Web协议测试时,JMeter模拟用户发送请求,并记录服务器的响应时间、响应数据等关键性能指标。

要进行基本的Web测试,您需要配置HTTP(S) Test Script Recorder,这通常涉及到设置浏览器的代理配置,以确保浏览器的所有请求都通过JMeter进行代理。在JMeter中,您可以设置采样器(Samplers)来发送GET、POST、PUT、DELETE等请求,并通过响应断言(Response Assertions)来验证服务器返回的数据是否符合预期。

示例代码块:配置HTTP请求采样器
<httpSample label="Home Page" protocol="HTTP" method="GET" contentEncoding="UTF-8" testPlan="LoadTest" host="***" port="80" path="/index.html" quietly="true"/>

在上述代码块中, <httpSample> 元素定义了一个HTTP请求。 label 属性可以指定采样器的名称, protocol 和 method 分别指定了使用的协议和HTTP方法。 host 属性指定了服务器地址, port 是端口号,而 path 指定了要访问的路径。 quietly 属性设置为 true 表示不记录请求响应的详细信息。

为了提高测试的准确性和可复现性,可以在测试计划中添加线程组,以模拟多个并发用户对服务器发起请求。

4.1.2 数据库协议测试

数据库协议测试主要考察数据库的性能和稳定性。JMeter支持多种数据库协议,例如JDBC、ODBC等。通过JDBC请求采样器,可以执行数据库查询、更新、删除等操作,并获取执行结果。

示例代码块:配置JDBC请求采样器
<jdbcSample name="SELECT from database" connection="MyDatabaseConnection"autocommit="true">
    <statement>SELECT * FROM users WHERE user_id = ?</statement>
    <variable name="user_id" value="1001"/>
</jdbcSample>

在上述代码块中, <jdbcSample> 元素定义了一个数据库查询操作。 connection 属性引用了已配置的数据库连接。 <statement> 元素内定义了要执行的SQL语句。 <variable> 元素用于设置查询参数,如上例中的 user_id 。

4.1.3 应用程序协议测试

应用程序协议测试通常涉及到特定应用程序使用的自定义协议。JMeter支持通过自定义采样器和插件来扩展协议支持,例如使用JSR223采样器通过Groovy脚本来模拟复杂的协议交互。

示例代码块:配置JSR223采样器
import org.apache.jmeter.protocol.java.sampler.ScriptedSampler;

def response = sampler.getArguments().getArgument(0).getValue();
def result = sendCustomRequest(response);

sampler.getArguments().addArgument("Response", result);
sampler.getResult().setResponseData(result);

def sendCustomRequest(response) {
    // 自定义的请求逻辑
    // ...
}

在上述代码块中,使用了Groovy脚本编写自定义的发送请求逻辑。通过 sendCustomRequest 函数,我们根据输入参数构建并发送请求,然后返回响应数据。这个采样器可以集成到JMeter的测试计划中,允许您编写复杂的请求逻辑来测试各种应用程序协议。

4.2 JMeter支持的服务类型

4.2.1 服务端测试

服务端测试是性能测试的一个重要方面,主要是模拟客户端对服务器进行的操作,以此来评估服务器的性能和稳定性。JMeter的HTTP(S)请求采样器可以用来对Web服务进行测试,评估其处理请求的能力。

示例代码块:配置HTTP请求采样器进行服务端测试
<httpSample protocol="HTTPS" method="GET" path="/api/resource" name="Server API Test"/>

4.2.2 客户端测试

客户端测试涉及模拟服务器对客户端应用的交互。这可以通过JMeter的TCP采样器或JMS采样器来完成,以测试客户端应用如何响应服务器发送的消息或数据。

示例代码块:配置TCP采样器进行客户端测试
<tcpSample serverName="localhost" port="9005" responseTimeout="10000" isClient="true">
    <message>Client message content</message>
</tcpSample>

在上述代码块中, <tcpSample> 定义了一个TCP客户端采样器,设置服务器地址、端口号、响应超时,并发送一条消息到服务器。

表格:JMeter支持的服务类型对比

| 特性 | HTTP(S)请求采样器 | JDBC请求采样器 | TCP采样器 | JMS采样器 | |-------------------|-------------------|----------------|-----------|-----------| | 协议支持 | HTTP/HTTPS | JDBC | TCP | JMS | | 应用场景 | Web服务测试 | 数据库操作测试 | 网络服务测试 | 消息队列测试 | | 配置复杂性 | 较简单 | 较复杂 | 中等 | 中等 | | 支持自定义参数 | 是 | 是 | 是 | 是 | | 支持并发测试 | 是 | 是 | 是 | 是 |

JMeter作为一个功能强大的性能测试工具,能够通过丰富的协议和测试类型支持来满足不同的测试需求。无论是在服务端还是客户端,无论是Web还是数据库,JMeter都能够提供全面的解决方案。随着应用场景的不断扩展和技术的不断进步,JMeter也在持续地推出新特性来提升测试的准确性和效率。

5. 测试元素和组件使用

5.1 测试元素的分类与功能

5.1.1 取样器(Samplers)的使用

取样器是JMeter中用于生成负载的关键组件,它模拟用户对服务器的请求。一个测试计划没有取样器,就无法进行实际的性能测试。取样器可以是HTTP、FTP、LDAP等不同类型的请求。

以HTTP请求为例,我们来看一个基本的HTTP取样器的配置和使用。在JMeter的测试计划中,添加一个取样器,选择HTTP请求。以下是添加和配置HTTP取样器的基本步骤:

  1. 右击测试计划下的线程组,选择“添加” -> “取样器” -> “HTTP请求”。
  2. 在HTTP请求取样器配置界面中,填入服务器名称或IP,端口号,协议类型(默认为http),以及请求的路径。
  3. 可以填写参数(Query String),用于GET请求;也可以设置POST数据,用于提交信息到服务器。
  4. 可以配置HTTP头部管理器,设置请求头,如User-Agent、Accept等。
  5. 如果需要对请求进行认证,可以配置HTTP基本认证管理器。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Test Request" enabled="true">
  <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
    <collectionProp name="Arguments.arguments"/>
  </elementProp>
  <stringProp name="HTTPsampler.domain">***</stringProp>
  <stringProp name="HTTPsampler.port"></stringProp>
  <stringProp name="HTTPsampler.protocol">http</stringProp>
  <stringProp name="HTTPsampler.contentEncoding"></stringProp>
  <stringProp name="HTTPsampler.path">/test</stringProp>
  <stringProp name="HTTPsampler.method">GET</stringProp>
  <boolProp name="HTTPsampler.follow_redirects">true</boolProp>
  <boolProp name="HTTPsampler.auto_redirects">false</boolProp>
  <boolProp name="HTTPsampler.use_keepalive">true</boolProp>
  <boolProp name="HTTPsampler.DO_MULTIPART_POST">false</boolProp>
  <stringProp name="HTTPsampler.embedded_url_re"></stringProp>
  <stringProp name="HTTPsampler.connect_timeout"></stringProp>
</HTTPSamplerProxy>
  • domain : 指定要请求的服务器域名。
  • port : 指定服务器端口号,默认为空时使用协议默认端口。
  • protocol : 指定使用的协议(HTTP或HTTPS)。
  • method : 指定请求的方法类型,如GET或POST。
  • follow_redirects : 指定是否自动跟随HTTP重定向。
  • auto_redirects : 指定是否自动处理服务器重定向。
  • use_keepalive : 指定是否使用持久连接。
  • DO_MULTIPART_POST : 指定是否使用多部分POST(用于文件上传)。

通过以上配置,可以对HTTP请求取样器进行详细的设置,以模拟用户的实际请求行为。

5.1.2 配置元件(Config Elements)的使用

配置元件(Config Element)用于在请求发出之前修改或添加信息,但不会生成额外的样本数据。配置元件可以用来处理请求的前置条件,比如设置变量、配置服务器信息、添加请求头等。常见的配置元件有:HTTP Cookie管理器、HTTP头部管理器、HTTP代理服务器等。

以HTTP Cookie管理器为例,来看其如何在测试中使用:

  1. 在测试计划中添加HTTP Cookie管理器,它将自动添加到线程组中的所有取样器下。
  2. 在HTTP Cookie管理器中,可以手动添加cookie,也可以通过配置来自动处理来自服务器的cookie。
  3. 在测试执行时,管理器会自动处理所有的cookie相关逻辑。
<HTTPCookieManager guiclass="HTTPCookieManagerGui" testclass="HTTPCookieManager" testname="HTTP Cookie Manager" enabled="true">
  <stringProp name="CookiePolicy">compatibility</stringProp>
</HTTPCookieManager>
  • CookiePolicy : 定义cookie的处理策略,如“compatibility”(兼容模式)会接受所有服务器发送的cookie。

使用配置元件可以确保测试请求的准确性,模拟出更加真实的用户访问情况。在性能测试中,合理配置这些元件能显著提高测试的可靠性与灵活性。

5.2 组件在测试中的应用

5.2.1 监听器(Listeners)的分析

监听器组件用于收集和展示测试结果数据。它们将测试中的样本数据进行可视化,帮助分析和诊断问题。JMeter提供了多种监听器,如聚合报告、图形结果、表格结果、查看结果树等。

以聚合报告为例,这是一个经常用于性能测试结果分析的监听器,它可以显示每个取样器的平均响应时间、最小/最大响应时间等统计信息。配置聚合报告监听器的基本步骤如下:

  1. 添加监听器,选择“聚合报告”。
  2. 运行测试计划后,可以在聚合报告的表格中看到请求的相关统计信息。
public class AggregateReport extends AbstractTestElement {
    // 代码省略,展示监听器的基本结构
}

聚合报告能够有效地帮助测试人员识别性能瓶颈和异常情况。每一条记录都是一个样本,而样本的统计数据可以反映出测试过程的性能表现。

5.2.2 断言(Assertions)的校验

断言用于验证取样器的响应内容,确保服务器返回的结果符合预期。在性能测试中,验证返回内容的正确性是不可或缺的步骤,这有助于避免因错误的测试结果导致对系统性能的误判。

要使用断言,先添加断言类型到取样器下,然后配置断言的详细参数。以响应断言为例,基本步骤如下:

  1. 添加HTTP取样器到线程组中。
  2. 在该取样器下添加“响应断言”。
  3. 配置响应断言的规则,例如期望的响应码、响应文本等。
  4. 运行测试后,JMeter会根据断言规则检查实际的响应结果,如果不符合规则,则会标记为错误。
<AssertionTestImpl guiclass="AssertionGui" testclass="AssertionTestImpl" testname="Response Assertion" enabled="true">
  <boolProp name="AssumeSuccess">false</boolProp>
  <stringProp name="AssertionTestImpl.test_field">ResponseCode</stringProp>
  <stringProp name="AssertionTestImpl.test_string">200</stringProp>
  <boolProp name="AssertionTestImpl.ignore_status">false</boolProp>
  <boolProp name="AssertionTestImpl.assume_success">false</boolProp>
</AssertionTestImpl>
  • AssumeSuccess : 在遇到任何错误时是否继续测试。
  • test_field : 指定要断言的响应字段。
  • test_string : 设置预期的响应值。
  • ignore_status : 是否忽略状态(即非200的响应码)。

断言的正确使用能够帮助测试者验证测试案例的有效性,并且确保测试结果的准确性,这是进行稳定和可信赖性能测试的一个关键因素。

6. 非侵入式测试方法

非侵入式测试方法对于现代应用来说是一个越来越重要的测试手段,它允许测试人员在不修改应用程序代码的情况下,对应用进行性能和功能评估。JMeter作为一种性能测试工具,支持多种非侵入式测试方法。在本章节中,我们将深入探讨非侵入式测试的原理、技术及其在不同类型的应用场景中的应用。

6.1 非侵入式测试的原理

6.1.1 JMeter与应用程序的交互

非侵入式测试通常不依赖于应用程序的内部实现,而是在应用程序外部与之交互。这意味着测试人员可以使用JMeter通过应用程序的公开接口(如HTTP/HTTPS接口、数据库接口、消息队列接口等)来进行测试,而无需深入应用的代码层。

在使用JMeter进行非侵入式测试时,关键在于模拟用户的行为,比如用户对Web页面的点击、数据的查询、表单的提交等。JMeter通过创建测试计划并配置不同的采样器(Samplers)来模拟这些用户行为。采样器定义了测试的类型和请求的详细信息,例如请求的URL、请求方法(GET、POST等)、发送的参数以及期望的响应格式等。

6.1.2 数据捕获和重放技术

为了进行非侵入式测试,JMeter提供了强大的数据捕获(Capturing)和数据重放(Replaying)工具。数据捕获通常涉及到监控应用程序的网络流量,并在测试中复用这些流量。JMeter允许用户通过代理服务器来捕获网络数据。代理服务器配置在浏览器和目标应用程序之间,能够拦截并记录所有发送和接收的数据包。然后,这些数据可以用于在JMeter测试计划中重放,以模拟真实用户的行为。

数据重放技术特别适用于回归测试,它允许测试人员验证应用程序在更新后是否仍然能正确响应相同的数据输入。通过比较重放响应与原始响应的差异,可以发现应用程序中可能出现的回归错误。

6.2 实际应用案例分析

6.2.1 Web应用的非侵入式测试

以Web应用测试为例,测试人员可以使用JMeter来模拟多个用户同时对Web应用发起请求,通过这种方式来分析应用的性能表现。在这个过程中,测试人员通常需要执行以下步骤:

  1. 配置浏览器代理 :将JMeter作为浏览器代理服务器,以捕获实际用户与Web应用的交互数据。
  2. 模拟用户行为 :使用JMeter的HTTP(S) Test Script Recorder采样器来记录浏览器的请求。
  3. 创建测试计划 :在JMeter中创建一个新的测试计划,并添加采样器配置,使用之前录制的数据文件。
  4. 配置参数化 :为了模拟真实环境中的不同用户行为,测试人员需要使用CSV Data Set Config来参数化测试数据。
  5. 执行测试 :运行测试计划,并监控JMeter的聚合报告和图形结果。

以下是对应的JMeter操作步骤的代码块:

<!-- JMeter HTTP(S) Test Script Recorder 配置 -->
<httpTestServer enable="true" port="8888" ssl="false" />

<!-- 测试计划结构示例 -->
<testPlan>
    <stringProp name="***ments">Web应用非侵入式测试计划</stringProp>
    <elementProp name="Thread Groups" elementType="ThreadGroup" guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组" enabled="true">
        <!-- 线程组配置 -->
    </elementProp>
    <stringProp name="***ments">变量配置</stringProp>
    <elementProp name="User Defined Variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
        <collectionProp name="Arguments.arguments"/>
    </elementProp>
    <stringProp name="***ments">JSR223 Sampler</stringProp>
    <elementProp name="JSR223 Sampler" elementType="JSR223Sampler" guiclass="TestBeanGUI" testclass="JSR223Sampler" testname="JSR223 Sampler" enabled="true">
        <stringProp name="script"/>
    </elementProp>
</testPlan>

在Web应用的非侵入式测试中,对性能指标的解读是至关重要的。通过JMeter提供的聚合报告,测试人员可以获取到响应时间、吞吐量、错误率等关键性能指标,以评估应用的性能状况。

6.2.2 移动应用的非侵入式测试

移动应用的非侵入式测试遵循类似的原理,但有其特定的挑战和需求。移动应用可能通过HTTP/HTTPS接口与后端服务进行通信,也可能使用特定的消息队列协议或其它移动特有的协议。在进行移动应用的非侵入式测试时,测试人员需要捕获移动设备与服务器之间的通信数据。

JMeter提供了HTTP(S) Test Script Recorder的扩展版本,即HTTP(S) Test Script Recorder (with mobile support),允许测试人员捕获和重放移动设备上的HTTP/HTTPS请求。

以下是对应的JMeter操作步骤的代码块:

<!-- JMeter HTTP(S) Test Script Recorder (with mobile support) 配置 -->
<httpTestServer enable="true" port="8888" ssl="false" mobile="true" />

在测试移动应用时,测试人员可能会使用JMeter的JSON Extractor或正则表达式提取器来处理响应数据中的JSON或XML格式的复杂响应。例如:

<elementProp name="Post Processors" elementType="Arguments" guiclass="HTTPTestSampleArgumentsPanel" testclass="Arguments" testname="Post Processors" enabled="true">
    <collectionProp name="Arguments.arguments">
        <elementProp name="JSON Extractor" elementType="JSON Extractor" guiclass="JsonExtractorGui" testclass="JSONExtractor" testname="JSON Extractor" enabled="true">
            <stringProp name="JSONPath expressions"/>
            <stringProp name="Match No.(0 for Random)">1</stringProp>
            <boolProp name="calculate all">false</boolProp>
            <stringProp name="Response Field">json</stringProp>
        </elementProp>
    </collectionProp>
</elementProp>

测试人员需要根据实际情况配置合适的提取器,来解析和验证移动应用的响应数据。

表格:非侵入式测试对比

| 特性 | Web应用测试 | 移动应用测试 | |--------------|-------------|--------------| | 通信协议 | HTTP/HTTPS | HTTP/HTTPS | | 数据捕获 | 浏览器代理 | 移动代理 | | 测试工具 | JMeter | JMeter | | 特殊需求 | 无 | JSON/XML解析 | | 性能指标 | 响应时间 | 响应时间 | | | 吞吐量 | 吞吐量 | | | 错误率 | 错误率 |

本章通过阐述非侵入式测试的原理和应用案例,展现了JMeter在现代应用测试中的灵活性和功能性。测试人员可以利用JMeter的非侵入式测试功能来高效地评估Web和移动应用的性能和功能。通过捕获和重放真实用户的行为,测试人员可以在无需改动应用程序代码的情况下,对应用进行全面的测试和评估。

7. 可视化界面和脚本录制

7.1 JMeter的图形界面操作

JMeter的图形界面是用户进行测试计划设计和管理的直观工具。通过图形界面,用户可以方便地添加、配置和执行测试元素,同时监控测试的运行状况。

7.1.1 界面布局和工作流程

JMeter的主界面大致可以分为以下几个部分:

  • 菜单栏 :提供文件、编辑、选项、测试计划、监听器等菜单项,用于执行各种操作。
  • 工具箱 :提供常用的测试组件,如取样器、逻辑控制器、监听器等,方便用户拖拽添加到测试计划中。
  • 测试计划树 :显示所有添加的测试组件的层次结构,便于用户理解和管理。
  • 工作区域 :进行详细配置的地方,包括设置取样器的参数、添加监听器的设置等。
  • 信息栏和状态栏 :显示当前测试计划的概要信息和状态信息,如正在运行的线程数、响应时间和错误信息等。

工作流程通常遵循以下步骤:

  1. 创建测试计划 :在主界面上创建一个新的测试计划或打开一个已有的测试计划。
  2. 添加测试元件 :从工具箱中拖拽所需的测试元件到测试计划树中,并进行相应配置。
  3. 配置取样器 :设置取样器的请求参数,如服务器名称、端口号、路径、请求方法、参数等。
  4. 添加监听器 :用于查看测试结果,记录日志或生成图表报告。
  5. 运行测试计划 :执行测试计划,并通过监听器查看结果。
  6. 分析测试结果 :根据测试结果调整测试计划,优化性能。

7.1.2 界面元素的自定义和优化

为了提高测试效率和用户体验,JMeter允许用户自定义界面元素,包括:

  • 快捷键设置 :可以通过“选项”菜单设置常用操作的快捷键,提升测试操作的便捷性。
  • 工具箱自定义 :可以添加或删除工具箱中的元素,创建自己的常用组件集合。
  • 测试树视图和表格视图的切换 :方便用户根据不同的需求选择不同的视图方式。

优化实践 :在进行性能测试时,可以通过添加逻辑控制器来控制测试的逻辑流程,例如,使用循环控制器来重复发送请求。

7.2 JMeter脚本的录制和编辑

JMeter提供录制脚本的功能,可以方便地捕获用户与Web应用之间的交互过程,并将其转换成可执行的测试脚本。

7.2.1 使用代理录制脚本

JMeter的HTTP(S) Test Script Recorder是一个代理服务器,可以用来录制浏览器和服务器之间的HTTP和HTTPS请求。

  • 配置代理 :在JMeter中启动HTTP(S) Test Script Recorder,并配置浏览器使用JMeter作为代理。
  • 录制过程 :在浏览器中进行操作,JMeter将捕获所有请求并生成对应的HTTP采样器。
  • 保存录制的脚本 :操作完成后,停止录制并将请求保存为测试计划的一部分。

7.2.2 脚本的后期编辑和维护

录制得到的脚本通常需要进一步编辑,以满足特定的测试需求或提高脚本的可维护性。

  • 修改采样器参数 :根据实际需求调整请求的参数,如修改数据、添加新的请求头等。
  • 使用变量和函数 :利用JMeter提供的变量和函数来增强脚本的灵活性。
  • 逻辑控制器的使用 :根据测试逻辑添加条件控制器、循环控制器等,以实现复杂的测试场景。
  • 脚本清理 :去除不需要的采样器,确保测试计划的整洁。

优化实践 :通过使用正则表达式提取器和JSON提取器,可以从复杂的响应数据中提取出需要的信息,供后续请求使用,如登录后的会话ID等。

JMeter的可视化界面和脚本录制功能大大降低了性能测试的门槛,让非专业的测试人员也能够参与到性能测试中来。然而,这些工具的真正威力在于其灵活性和可扩展性,高级用户可以利用它们设计出复杂的测试场景,以满足各种性能测试需求。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Apache JMeter是一个开源性能测试工具,由Java编写,支持跨平台兼容性,广泛用于服务器和应用性能评估。JMeter从Web应用测试起家,现已演化为多用途的测试框架,能对多种协议和服务执行负载和压力测试。其核心功能包括负载测试、稳定性测试、功能测试、分布式测试等,并支持丰富的协议和测试元素。本教程将指导读者安装和使用JMeter 2.13版本,涵盖JMeter的安装目录结构、主要组件介绍,以及如何运行和分析测试结果,从而让读者能够有效地构建测试计划并提升性能测试技能。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

更多推荐