JMeter-Samplers采样器

  • 翻译来自Samplers

18.1 采样器


HTTP Request


HTTP采样器可以向web服务器发送http/https请求,并且可以控制jmeter是否解析图像和其他嵌入资源的html文件,并发送http请求来检索它们。HTTP采样器检索以下类型的嵌入资源:

  • 图像
  • 小程序
  • 样式表(css)和从这些文件引用的资源
  • 外部脚本
  • frames,iframes
  • 背景图像(正文、表格、TD、TR)
  • 背景声音

默认解析器是org.apache.jmeter.protocol.http.parser.lagartobasedhmlparser,可以通过属性htmlparser.className进行更改。
如果要向同一个web服务器发送多个请求,最好使用http请求默认配置元素,这样就不必为每个http请求输入相同的信息。
或者,使用jmeter的HTTP Request Defaults来帮助我们快速创建带有参数的http请求。
有两种不同的测试元素用于定义采样器:
AJP/1.3 Sampler
HTTP请求
Java请求
HTTPClient4
Java HTTP实现有一些局限性:

  • 无法控制如何重连。当jmeter释放连接时,它可能被同一个线程重用,也可能不被同一个线程重用。
  • API最适合单线程使用-通过系统属性定义各种设置,因此适用于所有连接。
  • 不支持kerberos身份验证
  • 它不支持使用密钥库配置进行基于客户端的证书测试。
  • 更好地控制重试机制
  • 不支持虚拟机
  • 它只支持以下方法,get、post、head、options、put、delete和trace。
  • 使用dns缓存管理器更好地控制dns缓存。

如果请求需要服务器或代理登录授权,则还必须添加http authorization manager配置元素。对于正常登录(即用户在表单中输入登录信息),需要使用适当的方法(通常是post)和表单定义中的适当参数创建http请求。如果页面使用http,则可以使用jmeter代理来捕获登录序列。

每个线程使用单独的SSL上下文。如果要使用单个SSL上下文(不是浏览器的标准行为),请设置jmeter属性:

https.sessioncontext.shared=true

自5.0版以来,默认情况下,SSL上下文在线程组迭代期间保留,并为每个测试迭代重置。如果在测试计划中,同一个用户重复多次,那么应该将其设置为false。这个配置不适用于Java的HTTP实现。

httpclient.reset_state_on_thread_group_iteration=true

jmeter默认为SSL协议级别TLS。如果服务器需要不同的级别,例如SSLv3,请更改jmeter属性,例如:

https.default.protocol=SSLv3

jmeter还允许通过更改属性https.socket.protocols启用其他协议。
如果请求使用cookies,那么还需要一个http cookie管理器,可以将这些元素添加到线程组或http请求中。如果有多个需要授权或cookie的http请求,请将元素添加到线程组。这样,所有http请求控制器都将共享相同的授权管理器和cookie管理器元素。
如果请求使用名为“url重写”的技术来维护会话,可能还需要使用其他配置 6.1 Handling User Sessions With URL Rewriting

Java Request


这个采样器允许我们使用自定义Java类控制多个线程、输入参数和数据收集,首先该类必须实现org.apache.jmeter.protocol.java.sampler.javasamplerclient接口。


Java请求控制面板.png

如果方法teardownTest没有被AbstractJavaSamplerClient的子类重写,则不会调用teardownTest方法。这样做是为了减少了JMeter内存需求,但并不会对现有的测试计划产生任何影响。

Add/Delete按钮目前没有任何作用。

  • Parameters
Attribute Description Required
Name 采样器名称 NO
Classname 需要采样的JavaSamplerClient接口的具体实现类 YES
Send Parameters with Request 采样类的参数列表。所有参数都作为字符串发送。具体设置见下文。 NO

以下参数适用于SleepTestJavaTest实现:

  • Parameters
Attribute Description Required
Sleep_time 休眠时间 YES
Sleep_mask 总的休眠时间计算如下:totalSleepTime = SleepTime + (System.currentTimeMillis() % SleepMask) YES

此外,JavaTest的实现还用到以下参数:

  • Parameters
Attribute Description Required
Label 如果使用该属性,则会自动替换Name属性 NO
ResponseCode 该属性用于设置SampleResult的响应码 NO
ResponseMessage 该属性用于设置SampleResult的响应正文 NO
Status 用于设置SampleResult的状态,如果该项设为“OK”(忽略大小写),则认为该Sample成功,否则失败 NO
SamplerData 设置SampleResult的SamplerData NO
ResultData 设置SampleResult的ResultData NO

JSR223 Sampler


JSR223采样器允许使用JSR223脚本代码执行创建或更新变量所需的采样器或某些计算。

如果不希望在运行此采样器时生成采样器结果(Sample Result),需要调用以下方法:
sampleResult.setIgnore();

JSR223有一个可以显著提高性能的特性,受益于该特性:

  • JSR223采用Script files的方式而不是代码嵌入,这样JMeter可以编译并缓存脚本;
  • 或者使用Script Text+检查属性Cache compiled script if available的方式。

1.使用此功能时,需要保证脚本代码不会直接使用JMeter变量,而是使用脚本参数,因为缓存只会缓存第一个替换项。
2.为了从缓存和编译中获益,用于脚本编写的语言引擎必须实现JSR223可编译接口(Groovy支持此功能,java、beanshell和javascript都不支持)。
3.当使用Groovy作为脚本语言并且不检查Cache compiled script if available属性(建议使用缓存)时,应添加一条JVM属性-Dgroovy.use.classvalue=true,如果不这样设置,2.4.6版以后的Groovy有可能内存泄漏,请参阅:

  • GROOVY-7683
  • GROOVY-7591
  • JDK-8136353

如下的JMeter属性可以控制缓存大小:

jsr223.compiled_scripts_cache_size=100

在脚本引擎支持的情况下,JSR223测试元素使用Script files或Script Text+检查Cache compiled script if available属性的方式都会被编译,这将使性能得到极大的增强。

JSR223采样器控制面板.png

JMeter在将脚本字段传递给解释器之前处理函数和变量引用,因此这些引用只解析一次。脚本文件中的变量和函数引用将逐字传递给解释器,可能会导致语法错误。因此,为了使用运行时变量,请使用适当的props方法,例如。

props.get("START.HMS");
props.put("PROP1","1234");

  • Parameters
Attribute Description Required
Name 采样器名字 NO
Scripting Language 使用的JSR223脚本语言的名称,这是一个下拉框。 YES
Script File JSR223脚本的文件名,如果使用相对文件路径,则它将相对于“user.dir”系统属性引用的目录。 NO
Parameters 传给脚本文件或脚本的参数列表。 NO
Cache compiled script if available 如果选中该属性(推荐选中),并且所使用的语言支持可编译接口(Groovy支持,java、beanshell和java script不支持),JMeter将编译脚本并使用其md5散列作为唯一的缓存键来缓存它。 NO
Script 脚本名,与Script File二者必须有一个存在 YES

如果提供了Script File,则将使用该文件,否则将使用Script。
在调用脚本之前,会设置一些JSR223变量,它们可以直接在脚本中使用。

  • log - Logger
  • Label - the Sampler label
  • FileName
  • Parameters
  • args - 参数,如上所述
  • SampleResult - 指针指向当前的SampleResult
  • sampler - (Sampler)指针指向当前的Sampler
  • ctx - JMeterContext
  • vars - JMeterVariables,例如:

vars.get("VAR1");
vars.put("VAR2","value");
vars.remove("VAR3");
vars.putObject("OBJ1",new Object());

  • props - JMeterProperties (class java.util.Properties),例如:

props.get("START.HMS");
props.put("PROP1","1234");

  • OUT - System.out,例如:

OUT.println("message")

SampleResult的ResponseData是从脚本的返回值里设置的。如果脚本返回null,则可以使用SampleResult.setResponseData(data)方法直接设置响应,其中的数据可以是字符串或字节数组。数据类型默认为“文本”,但也可以使用方法SampleResult.setDataType(sampleResult.binary)将其设置为二进制。
SampleResult变量使脚本可以完全访问SampleResult中的所有字段和方法。例如,脚本可以访问方法setStopThread(boolean)和setStopTest(boolean)。
与BeanShell采样器不同,JSR223采样器不通过脚本变量设置ResponseCode、ResponseMessage和sample的状态。目前改变这些变量的唯一方法是通过SampleResult方法:

  • SampleResult.setSuccessful(true/false)
  • SampleResult.setResponseCode("code")
  • SampleResult.setResponseMessage("message")

你可能感兴趣的:(JMeter-Samplers采样器)