- 翻译来自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请求
<font color=#A52A2A>Java请求</font>
<font color=#A52A2A>HTTPClient4</font>
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接口。
如果方法teardownTest没有被AbstractJavaSamplerClient的子类重写,则不会调用teardownTest方法。这样做是为了减少了JMeter内存需求,但并不会对现有的测试计划产生任何影响。
Add/Delete按钮目前没有任何作用。
- Parameters
Attribute | Description | Required |
---|---|---|
Name | 采样器名称 | NO |
Classname | 需要采样的JavaSamplerClient接口的具体实现类 | YES |
Send Parameters with Request | 采样类的参数列表。所有参数都作为字符串发送。具体设置见下文。 | NO |
以下参数适用于SleepTest和JavaTest实现:
- 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有可能内存泄漏,请参阅:
如下的JMeter属性可以控制缓存大小:
jsr223.compiled_scripts_cache_size=100
在脚本引擎支持的情况下,JSR223测试元素使用Script files或Script Text+检查Cache compiled script if available属性的方式都会被编译,这将使性能得到极大的增强。
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")