jmeter之最佳实践(代码片段)

zhengna zhengna     2022-12-24     558

关键词:

官方文档:

http://jmeter.apache.org/usermanual/best-practices.html

 

翻译:

16.最佳实践

16.1 始终使用最新版本的JMeter

JMeter的性能正在不断提高,因此强烈建议用户使用最新版本。
确保始终阅读更改列表以了解新的改进和组件。一定要避免使用与最新版本相差3个版本以上的版本。

16.2 使用正确的线程数

您的硬件功能以及测试计划设计都会影响您可以使用JMeter有效运行的线程数。这个数字还取决于服务器的速度(更快的服务器使JMeter运行更好,因为它可以更快地返回响应)。与任何负载测试工具一样,如果您没有正确调整线程数,您将面临“Coordinated Omission(协调省略?)”问题,这可能会给您错误或不准确的结果。如果需要进行大规模负载测试,请考虑使用分布式模式(或不使用)在多台计算机上运行多个非GUI JMeter实例。使用分布式模式时,结果文件将组合在Controller节点上,如果使用多个自发实例,则可以组合样本结果文件以进行后续分析。可以使用JavaTest采样器来测试JMeter在给定平台上的执行方式。它可以在没有任何网络访问的情况下测试得到最大吞吐量。

JMeter可以选择延迟线程创建,直到线程开始采样。即在任何线程组延迟和线程本身的加速时间之后。这允许非常大的线程总数,前提是不会有太多并发的线程。

16.3 Cookie管理器的放置位置

有关信息,请参阅构建Web测试。

16.4 授权管理器的放置位置

有关信息,请参阅构建高级Web测试。

16.5 使用HTTP代理服务器(HTTP(S) Test Script Recorder)

有关HTTP代理服务器的详细信息,请参阅HTTP代理服务器。最重要的是过滤掉您不感兴趣的所有请求。例如,录制图像请求没有意义(可以让JMeter下载页面上的所有图像 - 请参阅HTTP请求)。这些只会使您的测试计划变得混乱。最有可能的是,所有文件都有一个扩展名,例如.jsp,.asp,.php,.html等。这些你应该通过输入“.*.jsp”作为“包含模式”来“包含”。

或者,您可以输入“.*.gif”作为“排除模式”来排除图像。根据您的应用程序,这可能是(也可能不是)更好的方法。您还可能要排除样式表,javascript文件或其他包含的文件。通过每次去除一些非必须的请求并重新开始测试您的设置,以最终确认您正在录制您想要的内容。

HTTP代理服务器期望在其下面找到一个带有录制控制器的ThreadGroup元素,它将录制HTTP请求。这样可以方便地将所有取样器打包在一个控制器下,并给该控制器取一个名字来描述测试用例。

现在,您可以根据步骤来完成测试用例了。如果您没有预定义的测试用例,请使用JMeter来录制您的操作以定义测试用例。完成一系列明确的步骤后,将整个测试用例保存在适当命名的文件中。然后,擦拭干净并开始一个新的测试用例。通过这样做,您可以快速记录大量的测试用例“粗略草稿”。

HTTP代理服务器最有用的功能之一是您可以从录制的samples中抽象出某些常见元素。通过在“测试计划”或“用户自定义变量”元素中定义一些用户定义的变量,您可以让JMeter自动替换录制的sample中的值。例如,如果您正在服务器“xxx.example.com”上测试应用程序,那么您可以定义一个名为“server”的变量,其值为“xxx.example.com”,并且可以在您录制的任何sample中找到该值将替换为“$server”。

请注意,匹配区分大小写。

如果JMeter没有录制任何samples,请检查浏览器是否确实在使用代理。如果浏览器在JMeter未运行的情况下也能正常运行,说明浏览器没有在使用代理。某些浏览器会忽略localhost或127.0.0.1的代理设置,尝试使用本地主机名或IP。

错误“unknown_ca”可能意味着您正在尝试录制HTTPS请求,并且浏览器尚未接受JMeter代理服务器证书。

16.6 用户变量

某些测试计划需要为不同的用户/线程使用不同的值。例如,您可能希望测试需要为每个用户进行唯一登录的序列。使用JMeter提供的工具很容易实现。

例如:

创建一个包含用逗号分隔的用户名和密码的文本文件。将它放在与测试计划相同的目录中。
将CSV DataSet configuration添加到测试计划中。将变量命名为USER和PASS。
在适当的取样器上用$USER替换登录名,用$PASS替换密码。
CSV Data Set element将为每个线程读取一个新行。

16.7 减少资源需求

关于减少资源使用的一些建议。

使用非GUI模式:jmeter -n -t test.jmx -l test.jtl
使用尽可能少的监听器:如果使用上面的-l标志,则可以删除或禁用它们。
在负载测试期间,请勿使用“查看结果树”或“View Results in Table”监听器,仅在脚本编写阶段使用它们来调试脚本。
在循环中对于相似的请求最好使用同一个采样器并使用变量(CSV Data Set)来区分,而不是使用多个相似的取样器。 [使用控制器在这里没有帮助,因为它会将文件中的所有测试元素添加到测试计划中。]
不要使用功能模式。
使用CSV输出而不是XML。
仅保存您需要的数据。
使用尽可能少的断言。
使用性能最佳的脚本语言(参见JSR223部分)。
如果您的测试需要大量数据 - 特别是如果需要随机化 - 请在可以用 CSV Dataset 读取的文件中创建测试数据。这可以避免在运行时浪费资源。

16.8 BeanShell服务器

BeanShell interpreter有一个非常有用的功能 - 它可以充当服务器,可以通过telnet或http访问。

没有安全性。任何可以连接到端口的人都可以发出任何BeanShell命令。这些可以提供对JMeter应用程序和主机的无限制访问。除非端口受到访问保护(例如通过防火墙),否则不要启用服务器。

如果您确实希望使用服务器,请在jmeter.properties中定义以下内容:

beanshell.server.port=9000
beanshell.server.file=../extras/startup.bsh

在上面的示例中,服务器将启动,并将侦听端口9000和9001。端口9000将用于http访问,端口9001将用于telnet访问。 startup.bsh文件将由服务器处理,可用于定义各种函数和设置变量。启动文件定义了设置和打印JMeter和系统属性的方法。这是您应该在JMeter控制台中看到的内容:

Startup script running
Startup script completed
Httpd started on port: 9000
Session started on port: 9001

您可以使用示例脚本(extras / remote.bsh)来测试服务器(看看它是如何工作的)。
在JMeter bin目录中启动它(如果从其他地方运行,根据需要调整路径),输出应如下所示:

$ java -jar ../lib/bshclient.jar localhost 9000 ../extras/remote.bsh
Connecting to BSH server on localhost:9000
Reading responses from server …
BeanShell 2.0b5 - by Pat Niemeyer ([email protected])
bsh % remote.bsh starting
user.home = C:Documents and SettingsUser
user.dir = D:eclipseworkspacesmainJMeter_trunkin
Setting property EXAMPLE to 0.
Setting property EXAMPLE to 1.
Setting property EXAMPLE to 2.
Setting property EXAMPLE to 3.
Setting property EXAMPLE to 4.
Setting property EXAMPLE to 5.
Setting property EXAMPLE to 6.
Setting property EXAMPLE to 7.
Setting property EXAMPLE to 8.
Setting property EXAMPLE to 9.
EXAMPLE = 9
remote.bsh ended
bsh % … disconnected from server.

作为一个实际示例,假设您在非GUI模式下运行了长时间的JMeter测试,并且您希望在测试期间的不同时间更改吞吐量。测试计划应包括一个根据属性(例如$__P(throughput))来定义的Constant Throughput Timer。以下BeanShell命令可用于更改测试:

printprop("throughput");
curr = Integer.decode(args[0]);  // Start value
inc  = Integer.decode(args[1]);  // Increment
end  = Integer.decode(args[2]);  // Final value
secs = Integer.decode(args[3]);  // Wait between changes
while(curr <= end) 
  setprop("throughput",curr.toString()); // Needs to be a string here
  Thread.sleep(secs*1000);
  curr += inc;

printprop("throughput");

该脚本可以存储在一个文件中(例如throughput.bsh),并使用bshclient.jar发送到服务器。例如:

java -jar ../lib/bshclient.jar localhost 9000 throughput.bsh 70 5 100 60

16.9 BeanShell脚本

从JMeter 3.1开始,我们建议从BeanShell切换到JSR223测试元素(有关更多详细信息,请参阅下面的JSR223部分),并从__Beanshell函数切换到__groovy函数。

16.9.1 概述

每个BeanShell测试元素都有自己的解释器副本(对于每个线程)。如果重复调用测试元素,例如在循环内,除非选择“在每次调用之前重置bsh.Interpreter(Reset bsh.Interpreter before each call)”选项,否则解释器将保留在调用之间。

一些长时间运行的测试可能会导致解释器使用大量内存;如果是这种情况,请尝试使用重置选项。

您可以使用命令行在JMeter外部测试BeanShell脚本:

$ java -cp bsh-xxx.jar[;other jars as needed] bsh.Interpreter file.bsh [parameters]

或者

$ java -cp bsh-xxx.jar bsh.Interpreter
bsh% source("file.bsh");
bsh% exit(); // or use EOF key (e.g. ^Z or ^D)

16.9.2 共享变量

可以在启动(初始化)脚本中定义变量。除非使用重置选项,否则这些将在测试元素的调用中保留。

脚本还可以使用“vars”变量的get()和put()方法访问JMeter变量,例如:

vars.get("HOST");
vars.put("MSG","Successful");

get()和put()方法仅支持具有String值的变量,但也有getObject()和putObject()方法可取任意对象。 JMeter变量是线程的本地变量,但可以被所有测试元素(不仅仅是Beanshell)使用。
如果需要在线程之间共享变量,则可以使用JMeter属性:

import org.apache.jmeter.util.JMeterUtils;
String value = JMeterUtils.getPropDefault("name","");
JMeterUtils.setProperty("name", "value");

示例.bshrc文件包含getprop()和setprop()方法的示例定义。
共享变量的另一种可能方法是使用“bsh.shared”共享命名空间。例如:

if (bsh.shared.myObj == void)
    // not yet defined, so create it:
    myObj = new AnyObject();

bsh.shared.myObj.process();

它可以在JMeter启动文件中通过定义属性“beanshell.init.file”来创建,而不是在test元素中创建对象。这只处理一次。

16.10 在Groovy或Jexl3等中开发脚本函数

作为函数编写和测试脚本非常困难。但是JMeter有JSR223采样器,可以使用任何支持它的语言。我们建议使用Apache Groovy或任何支持JSR223的Compilable接口的语言。

创建一个包含JSR223 Sampler和Tree View Listener的简单测试计划。对sampler脚本窗格中的脚本进行编码,并通过运行测试对其进行测试。如果有任何错误,这些错误将显示在Tree View和jmeter.log文件中。此外,运行脚本的结果将显示为响应。

一旦脚本正常工作,它就可以作为变量存储在测试计划中。然后可以使用脚本变量来创建函数调用。例如,假设Groovy脚本存储在变量RANDOM_NAME中。然后,函数调用可以编码为$__groovy($RANDOM_NAME)。不需要在脚本中转义任何逗号,因为在插入变量值之前函数调用已被解析。

16.11 参数化测试

通常,如果能够使用不同的设置重复运行同一个测试是有用的。例如,更改线程或循环的数量,或更改主机名。

一种方法是在测试计划中定义一组变量,然后在测试元素中使用这些变量。例如,可以定义变量LOOPS = 10,并将线程组中的变量称为$ LOOPS。要使用20个循环运行测试,只需更改测试计划上的LOOPS变量的值。

如果您想在非GUI模式下运行大量测试,这很快就会变得乏味。对此的一个解决方案是根据属性定义测试计划变量,例如LOOPS=$__P(loops,10))。这使用属性“loops”的值,如果找不到属性,则默认为10。然后可以在JMeter命令行上定义“loops”属性:

jmeter … -Jloops=12

如果有许多属性需要一起更改,那么实现此目的的一种方法是使用一组属性文件。可以使用-q命令行选项将相应的属性文件传递给JMeter。

16.12 JSR223元素

对于密集负载测试,推荐的脚本语言是ScriptingEngine实现可编译接口的语言。 Groovy脚本引擎实现了可编译。但是,在JMeter 3.1发布时,Beanshell和Javascript都没有这样做,因此建议不要使用它们进行密集负载测试。

注意:Beanshell实现了可编译接口,但它尚未编码 - 该方法只会抛出异常。 JMeter为这个bug做了明确的工作。
使用JSR 223元素时,建议检查Cache编译脚本(如果可用)属性,以确保在基础语言支持时缓存脚本编译。在这种情况下,请确保脚本不使用$ varName的任何变量,因为缓存只需要$ varName的第一个值。而不是使用:

vars.get("varName")

您也可以将它们作为参数传递给脚本并以这种方式使用它们。

16.13 在线程和线程组之间共享变量

变量是线程的本地变量,在一个线程中设置的变量不能在另一个线程中读取。这是设计的。对于可在测试开始前确定的变量,请参阅参数化测试(上文)。如果在测试开始之前未知该值,则有多种选择:

将变量存储为属性 - 属性对JMeter实例是全局的
将变量写入文件并重新读取
使用bsh.shared命名空间 - 见上文
编写自己的Java类

16.14 管理属性

当您需要修改jmeter属性时,请确保不要修改jmeter.properties文件,而是从jmeter.properties复制该属性并在user.properties文件中修改其值。
这样做可以简化您迁移到下一版JMeter的过程。
请注意,在文档中经常提到jmeter.properties,但这应理解为“从jmeter.properties复制到user.properties要修改的属性,并在后一个文件中执行此操作”。

user.properties文件取代jmeter.properties中定义的属性。

16.15 不推荐使用的元素

建议不要使用已弃用的元素(在更改列表和组件引用中标记为已删除的元素)并迁移到新的建议元素(如果可用)或执行相同操作的新方法。
从版本N的菜单中删除不推荐使用的元素,但可以通过修改user.properties文件中的not_in_menu属性并从中删除元素的完整类名来启用迁移。
请注意,版本N中的弃用元素将在版本N + 1中被删除,因此请确保尽快停止使用它们。

智能合约最佳实践之solidity编码规范(代码片段)

每一门语言都有其相应的编码规范,Solidity也一样,下面官方推荐的规范及我的总结,供大家参考,希望可以帮助大家写出更好规范的智能合约。命名规范避免使用小写的l,大写的I,大写的O应该避免在命名中单独出现,因为很... 查看详情

ansible最佳实践之委派任务和事实(代码片段)

写在前面分享一些Ansible委派任务和事实委派的笔记博文内容涉及:Ploybook任务委派DemoPloybook事实委派Demo理解不足小伙伴帮忙指正傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的... 查看详情

elasticsearch最佳实践之核心概念与原理(代码片段)

  每一个系统都拥有很多概念,这些概念是作者在设计与实现时为不同的模块或功能做的定义。概念本身只是一个名词,往往会跟随作者的喜好不同而不同,重要的是理解其设计的初衷以及要表达的实际内容,... 查看详情

ansible最佳实践之playbook执行速度优化(代码片段)

写在前面今天和小伙伴们分享一些Ansible中Playbook执行速度优化的笔记博文通过7种不同的优化方式,合理利用可配置项,从而提高Playbook的执行速度个人感觉如果受控机数量很少,其实没必要速度调优所谓的执行速度调... 查看详情

ansible最佳实践之playbook执行速度优化(代码片段)

写在前面今天和小伙伴们分享一些Ansible中Playbook执行速度优化的笔记博文通过7种不同的优化方式,合理利用可配置项,从而提高Playbook的执行速度个人感觉如果受控机数量很少,其实没必要速度调优所谓的执行速度调... 查看详情

ansible最佳实践之playbook控制任务的执行(代码片段)

写在前面今天和小伙伴们分享一些Ansible中如何控制剧本任务执行的笔记博文内容分为两部分,控制任务执行,和控制主机执行顺序,涉及内容:剧本默认执行顺序分析Demo,先角色后任务import或include导入角色... 查看详情

elasticsearchelasticsearch日志场景最佳实践(代码片段)

1.概述转载:Day12-Elasticsearch日志场景最佳实践相似文章:【Elasticsearch】Elasticsearch最佳实践系列之分片恢复并发故障Elasticsearch可广泛应用于日志分析、全文检索、结构化数据分析等多种场景,大幅度降低维护多套专用... 查看详情

ansible最佳实践之awx作业创建和启动(代码片段)

写在前面分享一些AWX作业创建和启动的笔记博文内容涉及:创建作业模板涉及相关参数,作业模板角色配置介绍运行作业模板并测试的Demo食用方式:需要了解Ansible理解不足小伙伴帮忙指正傍晚时分,你坐在屋檐... 查看详情

ansible最佳实践之playbook高级循环任务如何操作(代码片段)

写在前面今天和小伙伴分享一些ansible剧本中数据迭代的笔记博文内容比较简单主要介绍的常见的迭代对比使用过滤器和查找插件在复杂数据结构上实施迭代循环食用方式:了解Ansible基础语法理解不足小伙伴帮忙指正傍晚时... 查看详情

ansible最佳实践之awx使用ansible与api通信(代码片段)

写在前面分享一些AWX使用Ansible与API通信的笔记博文内容涉及:curl方式调用AWXAPI浏览器接口文档方式调用AWXAPI使用API调用方式启动AWX中作业模板Ansible模块uri的简单介绍Ansible剧本方式调用API启动作业模板理解不足小伙伴帮忙指... 查看详情

jmeter使用中最佳实践方法

官方文档(BestPractices-最佳实践部分摘选):https://jmeter.apache.org/usermanual/best-practices.html一、线程组UsethecorrectNumberofThreads(使用正确的线程数)硬件能力以及测试计划设计都将影响使用JMeter有效运行的线程数量,这个数字还取决... 查看详情

ansible最佳实践之playbook不同上下文提权demo(代码片段)

写在前面生活加油,今天和小伙伴们分享一些Ansible提权的笔记博文内容涉及如何选择Ansible的提权方式提权策略有哪些提权策略具体的Demo食用方式:需要有Ansible基础,了解Ansible变量的使用理解不足小伙伴帮忙指正近... 查看详情

ansible最佳实践之awx启用facts缓存和模板问卷调查(代码片段)

写在前面分享一些AWX启用facts缓存和模板问卷调查的笔记博文内容涉及:启动facts缓存相关配置Demo启用模板调查来设置变量demo食用方式:需要了解Ansible理解不足小伙伴帮忙指正傍晚时分,你坐在屋檐下,看着天慢... 查看详情

jmeter十四:最佳实践

参考:http://jmeter.apache.org/usermanual/best-practices.html1.总是使用最新版本的JMeter2.使用合适数目的ThreadThread数目取决于:硬件环境、TestPlan的设计、以及服务器的运行速度。不合适数目的Thread,可能会造成测试结果不正确或者不精确... 查看详情

ansible最佳实践之awx构建高级作业工作流的创建和调度(代码片段)

写在前面分享一些AWX启构建高级作业工作流的创建和调度的笔记博文内容涉及:创建和启动工作流模板Demo工作流调度和通知的相关介绍食用方式:需要了解Ansible理解不足小伙伴帮忙指正傍晚时分,你坐在屋檐下,... 查看详情

salesforce开发整理代码开发最佳实践(代码片段)

  在Salesforce项目实施过程中,对项目代码的维护可以说占据极大的精力,无论是因为项目的迭代,还是需求的变更,甚至是项目组成员的变动,都不可避免的需要维护之前的老代码,而事实上,几乎没有任何一个项目的整个... 查看详情

shell编程之代码规范(代码片段)

...的代码编写规范,主要包括两部分,代码风格和最佳工程实践。在代码风格上,没有一种代码编写风格是最好的,更重要的是与已有项目代码风格保持一致,以提高项目团队整体对代码的可读性。在工程实践... 查看详情

shell编程之代码规范(代码片段)

...的代码编写规范,主要包括两部分,代码风格和最佳工程实践。在代码风格上,没有一种代码编写风格是最好的,更重要的是与已有项目代码风格保持一致,以提高项目团队整体对代码的可读性。在工程实践... 查看详情