要负载测试您的Web应用程序吗? 然后,您应该了解Apache JMeter !
该JMeter教程介绍了基本概念以及如何创建测试计划以及如何执行它以对应用程序进行基准测试。
这是我在Disy的Tech-Blog上的文章的交叉张贴 -谢谢您让我在公司时间写文章! 同时还要感谢我的同事Boris Terzic和Karsten Schnitter指出了有问题和遗漏的位。 尽管如此,所有错误当然都是我的。
认识JMeter
使用JMeter,您可以创建和执行测试计划 ,这些计划被组织为树。
基本要素
计划执行的入口点是线程组 ,其中每个线程代表一个用户。 控制器是测试的关键。 它们是线程组或其他控制器的子级,有两个变体,定义发生了什么以及如何发生:
- 取样关心的是会发生什么 ,他们发送请求(HTTP,FTP,JDBC,你有什么),并等待响应。 记录每个单独的交换(即请求,响应,响应时间等),并将其称为样本 。
- 逻辑控制器确定采样器是如何执行的,它们提供像分支和循环常见的控制结构。
虽然可以运行仅包含这些要素的基准,但除最琐碎的测试计划外,其他任何要素都需要其他基准。
进阶元素
像线程组一样, 测试片段是测试计划的子代,并且包含构成测试一部分的子树。 与线程组不同,它们不直接执行。 相反,它们包含在模块控制器中 。 这种结构可以重用。
配置存储控制器要引用的变量,管理cookie,在测试执行期间充当缓存等。 预 处理器和后处理器连接到采样器,并在采样器之前或之后执行。 他们可以修改样本将要使用的变量或解析响应以存储一些信息。 您可以使用断言来验证正在运行的测试的属性,例如,响应的主体不为空。
人类在浏览网站时会暂停,您可以使用计时器进行模拟。 计划可以在有或没有计时器的情况下执行。
最后,使用侦听器收集和可视化样本。
您可以在大多数节点的上下文菜单中的添加下找到这些项目。 它们是构建测试计划的基础。
他们的交互非常直观,但是我仍然建议您仔细阅读作用域规则 。 如果您使用计时器,一定要这样做,因为这里存在几种直观的解释,只有一种是正确的。 ;-)
制定测试计划
我发现通过记录与站点的交互来开始创建测试计划,然后编辑和构造记录的请求非常有用。
记录
JMeter可以充当代理,然后将所有请求记录为采样器。 设置很简单:
- 将记录器添加到工作台 :您将在“ 非测试元素”下找到HTTP(S)测试脚本记录器 。
- 选择在哪里收集采样器 :可以选择测试计划的大多数子级作为目标控制器 (例如线程组,片段,控制器)。
现在,您只需要编辑浏览器的代理设置即可将其指向JMeter,并在记录器上单击“开始 ”后,所有请求都将转换为采样器。
熟悉了自己之后,请尝试这些功能。
极限记录
您应该通过指定要包括的 URL模式和要排除的URL模式来限制将要记录的内容。 如果定义了至少一个包含模式,则仅记录与这些正则表达式匹配的请求。 如果一个请求至少与一个排除模式匹配,则不会记录该请求。
您可能想要添加建议的排除项并对其进行改进以仅记录相关请求。 (有关如何使JMeter获取嵌入式资源的信息,请参见下面的“配置”。)
重用请求
基准测试的应用程序可能不会在固定的URL下运行,例如,当另一个开发人员在其计算机上运行它时。 因此,使请求可重用很重要。
为此,记录仪创建的采样器不得包含硬编码的连接详细信息。 这可以通过将配置节点HTTP Request Defaults添加到将包含记录的采样器的节点并输入与本地配置匹配的值来实现。 然后,JMeter将这些字段留空。
记录暂停
为了记录实际的暂停,JMeter可以使用您在与网站进行交互时所做的暂停时间自动创建计时器。 将一个计时器添加到记录器,但不要对延迟进行硬编码,请输入$ {T}。 该变量将替换为自上次响应以来经过的挂钟时间。
(第一个记录的请求的值可能很长。请务必检查一下!)
小组采样器
将采样器分组为逻辑组件可帮助您掌握最新信息。 在“ 分组”下,我通常选择“ 将每个组放入新的事务控制器中” ; 请参阅下面的组为什么。
根据测试站点的结构,您认为属于一起的请求可能会分为不同的组。 同样,独立的请求可能会以相同的结果结束。 两者都可以在编辑时固定。 但是将请求分为不同的组,我发现快速重新启动记录器更为实用。 然后,JMeter会将新请求添加到新组中。
编辑中
以我的经验,手动编辑记录的采样器通常是必要的,或者至少是非常有益的。
在编辑测试计划时,通常会运行它。 请注意,所有单个节点都可以从其上下文菜单或按钮栏中激活和停用。 添加一些侦听器以查看JMeter正在测量的内容–从查看结果树开始,然后在table中查看结果 。
凭据变化
如果您的应用程序允许用户登录,则您可能希望测试计划执行相同的操作。 并使用不同的用户帐户。 您可以通过告诉JMeter用用户名,密码和其他所需的CSV文件中的数据填充登录请求来实现此目的。
首先,更改记录的登录请求,以使用$ {username}和$ {password}之类的变量,而不是硬编码的值。
然后将CSV数据集配置添加到包含登录请求的节点。 在配置中,根据文件结构设置变量名 ,例如用户名,密码。
动态请求
请求可能必须包含来自先前响应的某些信息,并且不能与硬编码值一起使用。 为了识别这些情况,可能需要重新启动应用程序,使用JMeter执行采样器,并观察是否所有请求都按预期得到了答复。 还要查看应用程序的日志,以查看它是否显示问题迹象。
如何创建动态响应本身就是一个主题,但这可以帮助您入门:
- 后处理器XPath提取器可用于将响应的一部分存储在变量中。
- 使用$ {var_name},变量几乎可以在任何地方使用。
- 如果需要对值进行进一步处理才能使其可用,请考虑使用BeanShell PostProcessor ,它将使您能够在Rhino中执行Java或JavaScript代码。
BeanShell脚本可以访问几个参数。 变量存储在Map <String,String> vars中,还可以使用名为log的log4j-Logger。 可以通过选项 〜> 日志查看器或右上角的黄色三角形激活日志来检查输出。
团体
我认为隔离在不同情况下可以重复的部分是一种很好的做法。 主要示例是登录和注销,应将它们放在自己的组中。
这里我不是指线程组,而只是“一堆控制器”。 这可以通过将所有控制器移动到简单控制器或事务控制器中来实现。 这些不会更改执行,而是通过收集属于一起的控制器来提供有用的抽象。 给它起一个好名字,这说明一切!
我总是为此使用事务控制器,以便可以获取所包含的采样器执行所需的总时间。 为此,您需要激活事务控制器中的生成父样本复选框。
在我确认一个小组完全按照我的要求做之后,我通常将其移动到一个正确命名的测试片段中,这样我就可以轻松地从测试计划的不同部分使用它,而无需复制粘贴它。
构成
正确的测试计划的最后一步是组成您记录,编辑和结构化的不同部分。 如果将各个组封装在测试片段中,请回想起使用模块控制器来引用它们。
请记住,线程组中的每个线程代表一个用户,因此从创建一些线程组开始。 如果您的应用程序需要登录,则这应该是要执行的第一个实际操作。
然后,您可能想要添加一些逻辑控制器,使您可以排列记录的片段,以便它们对真实的用户行为进行建模。 可能包括一些随机元素,例如随机顺序控制器 。 如果这样做,请确保样本大小足够大,不会被一些异常值所歪曲。
配置中
阅读这篇超短篇文章,了解如何使JMeter的行为更像真实的浏览器 。
为了让JMeter自动并行地检索嵌入式资源,您必须在“ 来自HTML文件的嵌入式资源”下更改每个HTTP请求的设置。 这将执行您在记录期间排除的所有请求。
似乎没有必要先排除请求,然后将JMeter配置为自动执行它们。 区别在于,JMeter通过这种方式将使用缓存来避免不必要的请求,并使用池并行而不是连续地执行所需的请求。 这可以模拟浏览器的行为方式并带来更实际的测量结果。
标杆管理
只要您正在编辑测试计划,就可以按照自己喜欢的任何方式执行测试。 但是,如果您想真正开始进行基准测试,则需要考虑一些其他细节。
阅读以下两个最佳实践列表,以了解该做什么和不该做什么:
- 最佳实践-JMeter文档 (至少17.7)
- JMeter最佳实践– BlazeMeter
此处未提及,但绝对必要的是增加JMeter可用的堆空间。 一种简单的实现方法是在jmeter.sh的开头添加JVM_ARGS =”-Xms2g -Xmx2g”(或任何有意义的堆大小)。 确保监视日志以发现OutOfMemoryExceptions。
下一步
官方文档详尽无遗。 您可能要检查的重要入门主题是:
- 测试计划的要素
- 组件参考
- 帮帮我! 我的老板要我对我们的应用程序进行负载测试!
如何编写和执行基准测试很大程度上取决于您要实现的目标。 比较同一应用程序的不同变体(例如,以不同的垃圾收集设置运行)与试图获取绝对数(例如,对于SLA)非常不同,并且比其容易得多。
本教程只是为了帮助您入门。 如果业务决策将基于基准结果,请务必阅读本主题。
- Stack Exchange上的资源列表 :软件质量保证和测试
- JMeter负载测试博客和 BlazeMeter上的 资源
- 贝莫·艾琳(Jacko Erinle)的JMeter Cookbook
- Gil Tene 如何不测量延迟
翻译自: https://www.javacodegeeks.com/2015/10/apache-jmeter-tutorial.html