Apache JMeter 教程

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

想要对您的 Web 应用程序进行负载测试?那么你应该了解 apache jmeter

这个 jmeter 教程解释了基本概念以及如何创建测试计划以及如何执行它以对您的应用程序进行基准测试。

这是 我在 disy 的技术博客上的文章 的交叉发布——谢谢你让我在上班时间写这篇文章,伙计们!还要感谢我的同事 boris terzic 和 karsten schnitter 指出了有问题和遗漏的部分。尽管如此,所有的错误当然都是我的。


了解jmeter

使用 jmeter,您可以创建和执行 测试计划 ,这些计划被组织为树状结构。

基本要素

计划执行的入口点是 线程组 ,其中每个线程代表一个单独的用户。 控制器 是测试的核心。它们是线程组或其他控制器的子级,有两种变体,定义发生了什么以及如何发生:

  • 采样器 关心会发生 什么 ,它们发送请求(http、ftp、jdbc,你有什么)并等待响应。每个单独的交换(即请求、响应、响应时间……)都被记录下来并称为 样本
  • 逻辑控制器 决定采样器的执行 方式 ,它们提供通用的控制结构,如分支和循环。

一个非常基本的 jmeter 测试计划

虽然可以运行仅包含这些元素的基准测试,但除了最琐碎的测试计划之外,还需要其他元素。

高级元素

与线程组一样, 测试片段 是测试计划的子项,并且包含构成测试一部分的子树。与线程组不同,它们不会直接执行。相反,它们包含在 模块控制器 中。这种结构可以重用。

配置 存储控制器引用的变量、管理 cookie、在测试执行期间充当缓存等。 处理器和 后处理器 附加到采样器,并在采样器之前或之后执行。他们可以修改样本将要使用的变量或解析响应以存储一些信息。您可以使用 断言 来验证正在运行的测试的属性,例如响应的主体是否为空。

人类在浏览网站时会暂停,您可以使用 计时器 模拟这种情况。计划可以在有或没有计时器的情况下执行。

最后,使用 监听器 来收集和可视化样本。

更高级的 jmeter 测试计划

您可以在大多数节点的上下文菜单中的 add 下找到这些项目。它们是构建测试计划的基石。

他们的互动非常直观,但我仍然建议您阅读 范围规则 。如果你使用计时器,一定要这样做,因为这里存在几种直观的解释,只有一种是正确的。 ;-)

创建测试计划

我发现通过记录与站点的交互然后编辑和构建记录的请求来开始创建测试计划很有用。

记录

jmeter 可以充当代理,然后将所有请求记录为采样器。设置很简单:

  1. 向工作台添加记录器 :您将在 非测试元素 下找到 http(s) 测试脚本记录器
  2. 选择在何处收集采样器 :可以选择测试计划的大多数子项作为 目标控制器 (例如线程组、片段、控制器)。

现在您只需要编辑浏览器的代理设置,将其指向 jmeter,在记录器上点击 开始 后,所有请求都将变成采样器。

熟悉之后,尝试这些功能。

限制录音

您应该通过指定 url patterns to include url patterns to exclude 来限制记录的内容。如果定义了至少一个包含模式,则只有匹配这些正则表达式的请求才会被记录。如果请求至少匹配一个排除模式,则不会记录该请求。

您可能希望 添加建议的排除 并改进它们以仅记录相关请求。 (有关如何让 jmeter 获取嵌入式资源的信息,请参见下面的配置。)

重用请求

基准测试应用程序可能不会在固定 url 下运行,例如,当另一个开发人员在她的机器上运行它时。因此,使请求可重用很重要。

为此,记录器创建的采样器不得包含硬编码的连接详细信息。这可以通过将配置节点 http 请求默认 添加到将包含记录采样器的节点并输入与本地配置匹配的值来实现。然后 jmeter 会将这些字段留空。

记录暂停

为了记录真实的暂停,jmeter 可以使用您在与站点交互时所做的暂停时间自动创建计时器。向记录器添加一个计时器,但不要对延迟进行硬编码,而是输入 ${t} 。该变量将替换为自上次响应以来经过的挂钟时间。

(第一个记录的请求的值可能很长。请务必检查!)。

组采样器

将采样器分组为逻辑组件可以帮助您掌握一切。在 分组 下,我通常选择 将每个组放在一个新的事务控制器中 ;请参阅下面的组为什么。

根据测试站点的结构,您认为属于同一类的请求可能会被分成不同的组。同样独立的请求可能会以相同的方式结束。两者都可以在编辑时修复。但是为了将请求分成不同的组,我发现快速重启记录器更实用。然后 jmeter 会将新请求添加到新组中。

编辑

根据我的经验,手动编辑录制的采样器通常是必要的,或者至少是非常有益的。

您经常会在编辑测试计划时运行它。请注意,所有单独的节点都可以从它们的上下文菜单或按钮栏中激活和停用。添加一些侦听器以查看 jmeter 正在测量什么——从 查看结果树 开始并 在表中查看结果

不同的凭据

如果您的应用程序允许用户登录,您可能希望您的测试计划也这样做。并使用不同的用户帐户。您可以通过告诉 jmeter 用 csv 文件中的数据填充登录请求来实现这一点,其中包含用户名、密码和您需要的任何其他内容。

首先,更改您记录的登录请求以使用 ${username} ${password} 等变量而不是硬编码值。

然后将 csv 数据集配置 添加到包含登录请求的节点。根据文件结构在配置上设置 变量名 ,例如 username,password

使用不同的凭据登录

动态请求

请求可能必须包含来自先前响应的一些信息并且不适用于硬编码值。要识别这些情况,可能需要重新启动应用程序,使用 jmeter 执行采样器,并观察是否所有请求都按预期得到响应。还要查看应用程序的日志,看它是否显示出问题的迹象。

如何创建动态响应本身就是一个主题,但这可能会帮助您入门:

  • 后处理器 xpath 提取器 可用于将部分响应存储在变量中。
  • ${var_name} 几乎可以在任何地方使用变量。
  • 如果值在可用之前需要进一步处理,请考虑让您在 rhino 中执行 java 或 javascript 代码的 beanshell 后处理器

beanshell 脚本可以访问多个参数。变量存储在 map<string, string> vars 中,并且还可以使用名为 log 的 log4j-logger。可以通过 选项 ~> 日志查看器 或右上角的黄色三角形激活日志来检查输出。

使用后处理器从响应中提取变量

团体

我认为将可以在不同上下文中重复的部分隔离开来是一种很好的做法。最好的例子是登录和注销,它们应该放在它们自己的组中。

这里我指的不是线程组,而是“一堆控制器”。这可以通过将所有控制器移动到一个 简单 事务 控制器中来实现。这些不会改变执行但通过收集属于一起的控制器提供有用的抽象。给它一个好名字,它自己会说话!

我总是为此使用事务控制器,以便我可以获得包含的采样器执行所花费的总时间的样本。为此,您需要在事务控制器中激活复选框 生成父样本

在我确认一组正在做我想要的事情之后,我通常将它移到一个正确命名的测试片段中,这样我就可以轻松地从测试计划的不同部分使用它,而无需复制粘贴它。

构成

正确测试计划的最后一步是组合您录制、编辑和构建的不同部分。如果您将各个组封装在测试片段中,请记住 模块控制器 用于引用它们。

请记住,线程组中的每个线程都代表一个用户,因此请从创建一些线程组开始。如果您的应用程序需要登录,这应该是第一个要执行的实际操作。

然后你可能想添加一些逻辑控制器,让你安排记录的片段,以便它们模拟真实的用户行为。可能包括一些随机元素,如 随机顺序控制器 。如果这样做,请确保您的样本量足够大,不会被一些异常值所影响。

配置

阅读这篇超短文章,了解 如何使 jmeter 的行为更像一个真正的浏览器

要让 jmeter 自动并行检索嵌入式资源,您必须在 html 文件的嵌入式资源 下更改每个 http 请求的 设置。这应该执行您在录制期间排除的所有请求。

似乎没有必要首先排除请求,然后配置 jmeter 自动执行它们。不同之处在于,这种方式 jmeter 将使用缓存来避免不必要的请求,并使用池来并行而不是连续执行所需的请求。这模拟了浏览器的行为方式并导致更真实的测量。

wplynn cc-by-nd 2.0 发布

基准测试

只要您正在编辑您的测试计划,您几乎可以以任何您喜欢的方式执行您的测试。但是如果你想真正开始基准测试,还有一些额外的细节需要考虑。

阅读这两个最佳实践列表,了解该做什么和不该做什么:

那里没有提到但也是绝对必要的是增加 jmeter 可用的堆空间。实现这一点的一种简单方法是将 jvm_args="-xms2g -xmx2g" (或任何有意义的堆大小)添加到 jmeter.sh 的开头。请务必监视日志以发现 outofmemoryexception s。

下一步

官方文档 如预期的那样详尽无遗。您可能想要查看的重要介绍性主题是:

如何编写和执行基准在很大程度上取决于您想要实现的目标。比较同一应用程序的不同变体(例如,使用不同的垃圾收集设置运行)与尝试获取绝对数字(例如,对于 sla)有很大不同——而且比这容易得多。

本教程只是为了让你开始。如果业务决策将基于基准测试结果,请务必阅读此主题。

相关文章