首页 > 生活百态 > 社会热点 / 性能测试 【测试】性能测试最佳实践之 JMeter

性能测试 【测试】性能测试最佳实践之 JMeter

继续使用最新版本

JMeter经常被推荐用来测试性能,鼓励用户使用最新版本。

请务必阅读中的新功能和模块。你不应该再使用3.0之前的版本了。

使用正确数量的线程

硬件和测试计划的能力将影响JMeter可以运行的线程数量。数量也取决于你的服务有多快(一个能快速响应的服务能让JMeter变得更强大)。和其他性能测试工具一样,如果没有正确的线程数,就会面临不合作或者错误结果的问题。如果需要大规模的压力测试,可以考虑使用分布式模式在多台机器上运行不带GUI的JMeter实例。当使用分布式模式时,结果将聚集在控制器的结果中。如果使用多个自己的实例,可以将结果文件聚合起来进行可持续性分析。至于如何在给定平台上使用JMeter测试,JavaTest Sampler可以考虑使用。它可以以最大吞吐量返回一些信息,而无需任何网络请求。

JMeter可以选择延迟线程的创建,直到线程正常启动,例如在其他线程组延迟和线程本身的启动时间之后。这允许非常大量的线程,并且不需要太多的线程同时并发。

Cookie管理器的位置

可以在中查看

授权管理器的位置

可以在中查看

使用超文本传输协议测试记录器进行记录

关于的细节在建议的录音机里。最重要的是剔除那些你不感兴趣的。比如我不在乎录制过程中的图片请求(JMeter可以下载一页中的所有图片——详细查看)。这些内容会让你的考试计划一团糟。大多数人都会这样。所有文件集都有一个扩展名,例如。jsp,。asp,。php,。html或其他。您可以通过输入将这些内容引入包含模式。*.jsp。

或者,您可以通过输入来拒绝图片。*.排除模式中的gif。根据您的应用,您可以选择更好的方案来实施。您也可以拒绝样式表、javascritpt文件和其他文件类型。测试您的配置以验证您的条目是否符合您的要求,然后清除内容并开始刷新页面。

HTTP(S)测试记录器预期使用记录控制器将HTTP请求记录的元素发现到线程组元素中。这使得您可以轻松地将所有样本直接打包到一个控制器下,当然您也可以给出一个可以描述测试用例的名称。

现在,执行测试用例的步骤。如果您有任何预步骤测试用例,使用JMeter来记录您的操作并定义您的测试用例。一旦您完成了一系列特定的操作,将整个测试用例保存到一个合适的文件名中。然后,清理记录,开始新的测试用例。通过这样做,可以快速记录大量粗糙的测试用例。

HTTP(S) Test Recorder最有用的特性就是可以通过记录的样本来抽象出共同的元素。通过在测试计划级别或元素中定义,您可以用JMeter自动替换记录样本中的值。例如,如果您测试一个为xxx.example.com服务的应用程序,您可以将变量服务器的值定义为xxx.example.com,然后录音样本中的所有值都将被${server}替换

匹配时注意区分大小写

如果JMeter没有记录任何请求,请检查您的浏览器是否启用了代理设置。如果在JMeter未启动时浏览器可以正常使用,则浏览器一定不能使用代理设置。有些浏览器忽略代理设置localhost或127.0.0.1,请改用原生名称或IP。

未知错误可能是您试图进入HTTPS,并且浏览器没有收到JMeter的代理服务证书。

用户变量

一些测试计划需要为不同的用户/线程使用不同的值。例如,您希望在每个用户登录后测试一系列步骤。使用JMeter很容易实现这一点。

例如:

创建一个包含用逗号分隔的用户名和密码的文件。将其保存在与测试计划相同的文件夹中。

将CSV数据集配置元素添加到您的测试计划中。将变量名定义为USER和PASS。

替换登录名为${USER},密码为${PASS}

CSV数据集元素将为每个线程读取一个新行。

减少资源的使用

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

使用无图形用户界面模式

尽可能少地使用监听器;如果您使用上面的-l标记,它们都可以被删除或禁用

在压力测试过程中,不要使用监听器查看结果树或查看表中的结果,而只在脚本调试阶段使用它

与使用大量相似样本相比,在一个循环中使用相同的样本并使用变量(CSV数据集)来实现样本的差异。[包含控制器在此步骤中没有用,它将所有测试元素添加到文件中的测试计划中]

不要使用功能模式

CSV格式的输出比XML好

只保存您需要的数据

使用尽可能少的断言

使用最好的脚本语言(参见JSR223)

如果您的测试需要大量数据——尤其是如果您需要随机化——在可读的CSV文件中创建测试数据。这将避免在运行时浪费资源。

BeanShell服务

BeanShell解释器有一个非常有用的特性——当它可以用作服务器时,可以通过telnet或http访问。

没有安全感。任何可以连接到该端口的人都可以发出任何BeanShell命令。这些可以提供对JMeter程序和目标的无限制访问。除非对端口的访问受到限制,例如受到防火墙的限制,否则不要启用服务。

如果要使用该服务,请在jmeter.properties中定义以下内容:

bean shell . server . port = 9000 bean shell . server . file =../extras/startup.bsh

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

启动运行启动完成启动开始于端口:9001

有一个示例脚本(extras/remote.bsh)可以用来测试该服务。[看看它是如何工作的]

当在JMeterbin目录中启动时(调整目录,如果您在另一个位置),输出将如下所示:

$ java -jar../lib/bsh client . jar localhost 9000../extras/remote . bsh连接到BSH服务器onlocalhost:9000从服务器读取响应…BeanShell 2.0 b5-by PaT Niemeyer (pat@pat.net)bsh % remote . bsh starting user . home = C: Documents and settings user . dir = D: eclipse workspaces main JMeter _ trunk binlog _ level . JMeter = INFOlog _ level . JOR phan = info setting property ' EXAMPLE ' to ' 0 '。将属性“示例”设置为“1”。将属性“示例”设置为“2”。将属性“示例”设置为“3”。将属性“示例”设置为“4”。将属性“示例”设置为“5”。将属性“示例”设置为“6”。正在将属性“EXA MPLE”设置为“7”。将属性“示例”设置为“8”。将属性“示例”设置为“9”。EXAMPLE = 9remote.bsh endedbsh % …与服务器断开连接。

例如,假设您有一个长时间运行的非GUI运行模式测试,并且您希望测试期间的吞吐量不同。测试计划包括由常数贯穿计时器定义的属性,例如$ {_ _ p(吞吐量)}。以下BeanShell可用于更改测试:

printprop("吞吐量");curr = Integer . decode(args[0]);//Start value Inc = integer . decode(args[1]);//增量end = integer . decode(args[2]);//Final value secs = integer . decode(args[3]);//当(curr & lt= end){ set prop(" through ",curr . ToString());//这里需要是string thread . sleep(secs * 1000);curr+= Inc;}printprop("吞吐量");

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

Java-jar概述../lib/bsh client . jar localhost 900 throughput . bshbeanstall脚本

每个BeanShell测试元素在解释器的每个线程中都有自己的副本。如果测试元素被重复调用,例如,在循环中,该元素将由解释器存储在消息中,除非resetbsh。检查每个调用选项之前的解释器。对于扩展压力测试,建议使用与可编译JSR223脚本语言集成的脚本引擎,详情可以在JSR223中查看。

有些长时间运行的测试会导致解释器占用大量内存;如果您真的想这样做,请尝试使用重置选项。

您可以使用独立于JMeter的命令行解释器来测试BeanShell脚本:

$ Java-CP bsh-XXX . jar[;其他需要的罐子。解释器文件. bsh[参数]

或者

$ java -cp bsh-xxx.jar bsh。interpreter bsh % source(" file . bsh ");bsh % exit();//或者使用键的e(例如z或d)来共享变量

变量可以在启动(安装)脚本中定义。除非使用重置选项,否则这些数据将存储在测试元素的消息中。

脚本还可以通过使用get()和put()方法读取JMeter变量,例如:

瓦尔斯。get(" HOST ");vars.put( "MSG "," Successful

Get()和put()方法只支持字符串变量,但是getObject()和putObject()方法可以处理其他类型。JMeter变量是线程本地的,但是可以被所有测试元素使用(不适用于BeanShell)。

如果需要在线程之间共享变量,可以使用JMeter属性:

import org . Apache . jmeter . util . jmeterutils;string value = jmeterutils . GetPropDefault(" name "," ");JMeterUtils.setProperty( "name "," value ");

样本。bshrc文件包括sample getprop()和setprop()的方法定义。

其他可以用来共享变量的方法使用bsh.shared来共享名称空。参考:

如果(bsh.shared.myObj == void){ //尚未定义,那么创建它:myObj = NewanyObject();} bsh . shared . myobj . process();

与在测试元素中创建对象相比,它可以通过JMeter的属性beanshell.init.file文件在启动时创建。这只会执行一次。

使用BeanShellJavaJexl脚本开发函数

像函数这样的脚本很难编写和测试。不过,JMeter有JSR223、BSF和BeanShell可以试试。

创建一个简单的测试计划,包括JSR223或BSF样本和结果树监听器。在示例部分编写一个脚本,并通过运行测试来测试它。如果有许多错误,这些结果将显示在结果树中。同时运行脚本的结果将显示为返回的内容。

一旦调试好脚本,就可以在测试计划中存储一个变量。脚本变量可以用来创建函数调用。例如,支持BeanShell脚本存储在变量RANDOM _ NAME中。函数调用可以写成$ { _ _ BeanShell($ RANDAY _ NAME)}。脚本中不需要其他逗号,因为在添加变量值之前已经转换了函数调用。

参数化测试

在不同的配置中重复运行测试通常很有用。例如,更改线程/循环的数量/更改地址名称。

一种方法是在测试计划中定义一个变量集,并在测试元素中使用这些变量。例如,可以定义变量LOOPS=10,并将${LOOPS}与线程组相关联。为了运行测试周期20次,只需要调整测试计划中LOOPS的值。

如果你想在非GUI模式下运行,情况会更糟。一种解决方案是在属性中定义测试计划变量,比如LOOPS=${__P(loop,10)}。如果找不到,使用属性循环的值将默认为10。循环属性也可以由JMeter控制台命令定义:

测试工具...-Jloops= 12...

如果一次更改大量属性,一种方法是使用属性文件。属性文件可以通过使用-q在命令行模式下传递给JMeter。

JSR223元素

为了扩展压力测试,推荐的脚本语言是脚本引擎实现编译器接口的脚本语言。Groovy脚本引擎可以编译。但是在JMeter版本中,既没有实现BeanShell,也没有实现Java,所以最好不要用它们来扩展压力测试。

提醒:BeanShell继承了可编译接口但尚未实现,方法会抛出异常。JMeter对这个问题有明确的解释。

当使用JSR223元素时,如果语言支持,它通常被设置为在唯一的变量中存储一个值。确保脚本不使用变量${varName}来存储将获得第一个值,并将获得${varName}的第一个值。替换为:

瓦尔斯。获取(“varName”)

您也可以像参数一样将它们传递给脚本,并像这样使用它们。

在线程组之间共享变量

变量是线程的本地变量;一个线程中设置的变量不能被其他线程读取。设计是这样的。对于变量,您可以在测试开始前指定并检查它们。如果在测试开始前数值未知,则有以下选项可用:

存储变量在属性中——属性对于JMter实例是全局的

将变量写入文件,然后再次读取它们

使用bsh.shared命令空-检查

编写自己的Java类

属性配制管理

当您需要修改JMeter属性时,请确保不要修改jmeter.properties文件。替换jmter.properties中的copy属性,并修改user.properties中的值

通过这样做,将很容易合并到下一个JMeter版本中。

请注意,jmeter.properties文件通常涉及但被理解为“从jmeter.properties到user.properties要修改和执行的属性”。

用户的过时元素。properties file supersedetheproperties sdefinidinmeter . properties

建议不要使用过时的元素(以这种方式标记),如果可以的话,结合新的元素,或者新的方法来实现同样的事情。

在版本n中,过时的元素从菜单中删除,但可以通过修改user.properties中not_in_menu中的属性来启用,并从那里删除完整的类名。

请注意,过滤过程中的元素版本“N”将在确定的版本“N+ 1”中删除,因此请确保您不会尽快使用它。

本文转自:开发者头条

微信号:概念

点击展开全文

QR code