18 简介¶
18.1 采样器¶
采样器执行 JMeter 的实际工作。每个采样器(Flow Control Action除外)都会生成一个或多个采样结果。示例结果具有各种属性(成功/失败、经过时间、数据大小等),可以在各种侦听器中查看。
FTP 请求¶
延迟设置为登录所需的时间。
参数 ¶
HTTP 请求¶
此采样器允许您向 Web 服务器发送 HTTP/HTTPS 请求。它还允许您控制 JMeter 是否解析 HTML 文件以获取图像和其他嵌入式资源并发送 HTTP 请求以检索它们。检索以下类型的嵌入资源:
- 图片
- 小程序
- 样式表 (CSS) 和从这些文件中引用的资源
- 外部脚本
- 框架,iframe
- 背景图像(正文、表格、TD、TR)
- 背景声音
默认解析器是org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser。这可以通过使用属性“ htmlparser.className ”来更改 - 有关详细信息,请参阅jmeter.properties。
如果您要向同一个 Web 服务器发送多个请求,请考虑使用HTTP 请求默认 配置元素,这样您就不必为每个 HTTP 请求输入相同的信息。
或者,您可能希望使用 JMeter 的HTTP(S) 测试脚本记录器来创建它们,而不是手动添加 HTTP 请求。如果您有大量 HTTP 请求或带有许多参数的请求,这可以节省您的时间。
有三种不同的测试元素用于定义采样器:
- AJP/1.3 采样器
- 使用 Tomcat mod_jk 协议(允许在 AJP 模式下测试 Tomcat,无需 Apache httpd) AJP Sampler 不支持多文件上传;只会使用第一个文件。
- HTTP 请求
- 这有一个实现下拉框,用于选择要使用的 HTTP 协议实现:
- 爪哇
- 使用 JVM 提供的 HTTP 实现。与 HttpClient 实现相比,这有一些限制 - 见下文。
- HTTP客户端4
- 使用 Apache HttpComponents HttpClient 4.x。
- 空白值
- 没有在 HTTP 采样器上设置实现,因此依赖于 HTTP 请求默认值(如果存在)或jmeter.properties中定义的jmeter.httpsampler属性
- GraphQL HTTP 请求
- 这是HTTP 请求的 GUI 变体,提供更方便的 UI 元素来查看或编辑 GraphQL查询、变量和操作名称,同时使用相同的采样器在后台自动将它们转换为 HTTP 参数。这会隐藏或自定义以下 UI 元素,因为它们对于通过 HTTP/HTTPS 请求的 GraphQL 不太方便或不相关:
- 方法:只有 POST 和 GET 方法可用,符合 GraphQL over HTTP 规范。默认选择 POST 方法。
- 参数和帖子正文选项卡:您可以改为通过查询、变量和操作名称 UI 元素查看或编辑参数内容。
- 文件上传选项卡:与 GraphQL 查询无关。
- 高级选项卡中来自 HTML 文件的嵌入式资源部分:与 GraphQL JSON 响应无关。
Java HTTP 实现有一些限制:
- 无法控制如何重新使用连接。当 JMeter 释放连接时,它可能会或可能不会被同一线程重用。
- API 最适合单线程使用 - 各种设置是通过系统属性定义的,因此适用于所有连接。
- 不支持 Kerberos 身份验证
- 它不支持使用 Keystore Config 进行基于客户端的证书测试。
- 更好地控制重试机制
- 它不支持虚拟主机。
- 它仅支持以下方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE
- 使用DNS 缓存管理器更好地控制 DNS 缓存
如果请求需要服务器或代理登录授权(即浏览器会在其中创建弹出对话框),您还必须添加HTTP 授权管理器配置元素。对于普通登录(即用户在表单中输入登录信息),您需要确定表单提交按钮的作用,并使用适当的方法(通常是POST)和表单定义中的适当参数创建一个 HTTP 请求. 如果页面使用 HTTP,您可以使用 JMeter 代理来捕获登录序列。
每个线程使用一个单独的 SSL 上下文。如果要使用单个 SSL 上下文(不是浏览器的标准行为),请设置 JMeter 属性:
https.sessioncontext.shared=true默认情况下,从 5.0 版开始,SSL 上下文在线程组迭代期间保留,并在每次测试迭代时重置。如果在您的测试计划中同一用户迭代多次,那么您应该将其设置为 false。
httpclient.reset_state_on_thread_group_iteration=true
https.default.protocol=SSLv3
JMeter 还允许通过更改属性https.socket.protocols来启用其他协议。
如果请求使用 cookie,那么您还需要一个 HTTP Cookie 管理器。您可以将这些元素中的任何一个添加到线程组或 HTTP 请求。如果您有多个 HTTP 请求需要授权或 cookie,则将元素添加到线程组。这样,所有 HTTP 请求控制器将共享相同的授权管理器和 Cookie 管理器元素。
如果请求使用一种称为“URL 重写”的技术来维护会话,那么请参阅第 6.1 节使用 URL 重写处理用户会话以 了解其他配置步骤。
参数 ¶
- 它由HTTP 请求默认值提供
- 或在路径字段中设置包含方案、主机和端口 ( scheme://host:port )的完整 URL
可以使用 JMeter 属性 httpsampler.user_defined_methods为 HttpClient4 预定义更多方法。
"Redirect requested but followRedirects is disabled"这可以忽略。
JMeter 将在绝对和相对重定向 URL 中折叠“ /../segment ”形式的路径。例如http://host/one/../two将被折叠成http://host/two。如有必要,可以通过设置 JMeter 属性httpsampler.redirect.removeslashdotdot=false来抑制此行为
此外,您可以指定每个参数是否应进行 URL 编码。如果您不确定这意味着什么,最好选择它。如果您的值包含如下字符,则通常需要编码:
- ASCII 控制字符
- 非 ASCII 字符
- 保留字符:URL 使用一些特殊字符来定义它们的语法。当这些字符在 URL 中没有作为特殊角色使用时,需要对其进行编码,例如:' $ '、' & '、' + '、' 、 '、' / '、' : '、' ;', ' = ', ' ? ',' @ '
- 不安全字符:某些字符可能由于各种原因在 URL 中被误解。这些字符也应始终进行编码,例如:' '、' < '、' > '、' # '、' % '、...
如果它是一个POST或PUT或PATCH请求,并且有一个文件的“参数名称”属性(如下)被省略,则该文件作为请求的整个主体发送,即不添加任何包装器。这允许发送任意正文。此功能适用于POST请求,也适用于PUT请求。 有关参数处理的更多信息,请参见下文。
要区分源地址值,请选择以下类型:
- 选择IP/主机名以使用特定 IP 地址或(本地)主机名
- 选择设备以选择该接口的第一个可用地址,这可能是 IPv4 或 IPv6
- 选择Device IPv4选择设备名称的 IPv4 地址(如eth0、lo、em0等)
- 选择Device IPv6选择设备名称的 IPv6 地址(如eth0、lo、em0等)
此属性用于启用 IP 欺骗。它会覆盖此示例的默认本地 IP 地址。JMeter 主机必须有多个IP 地址(即IP 别名、网络接口、设备)。该值可以是主机名、IP 地址或网络接口设备,例如“ eth0 ”或“ lo ”或“ wlan0 ”。
如果定义了属性httpclient.localaddress,则该属性用于所有 HttpClient 请求。
以下参数仅适用于GraphQL HTTP Request:
参数 ¶
参数处理:
对于POST和PUT方法,如果没有要发送的文件,并且省略了参数的名称,则通过连接所有参数的值来创建正文。请注意,这些值是在不添加任何行尾字符的情况下连接起来的。这些可以通过在值字段中使用__char()函数来添加。这允许发送任意正文。如果设置了编码标志,则对这些值进行编码。另请参阅上面的 MIME 类型,您可以如何控制发送的内容类型请求标头。
对于其他方法,如果缺少参数名称,则忽略该参数。这允许使用由变量定义的可选参数。
当请求只有未命名的参数(或根本没有参数)时,您可以选择切换到正文数据选项卡。此选项在以下情况下很有用(其中包括):
- GWT RPC HTTP 请求
- JSON REST HTTP 请求
- XML REST HTTP 请求
- SOAP HTTP 请求
在正文数据模式下,除了最后一行之外,每行都将附加CRLF 。要在最后一行数据之后发送CRLF,只需确保后面有一个空行。(这看不到,除非注意光标是否可以放在下一行。)
方法处理:
GET , DELETE , POST , PUT和PATCH请求方法的工作方式类似,除了从 3.1 开始,只有POST方法支持多部分请求或文件上传。PUT和PATCH方法主体必须提供为以下之一:
- 将正文定义为具有空参数名称字段的文件;在这种情况下,MIME 类型用作 Content-Type
- 将主体定义为没有名称的参数值
- 使用“身体数据”选项卡
GET、DELETE和POST方法还有另一种使用“参数”选项卡传递参数 的方法。 GET、DELETE、PUT和PATCH需要 Content-Type。如果不使用文件,请将 Header Manager 附加到采样器并在那里定义 Content-Type。
JMeter 扫描来自嵌入式资源的响应。它使用属性HTTPResponse.parsers,它是解析器 ID 的列表,例如htmlParser、cssParser和wmlParser。对于找到的每个 id,JMeter 会检查另外两个属性:
- id.types - 内容类型列表
- id.className - 用于提取嵌入资源的解析器
有关设置的详细信息,请参见jmeter.properties文件。如果未设置HTTPResponse.parser属性,JMeter 将恢复到以前的行为,即仅扫描文本/html响应
模拟慢速连接:HttpClient4和Java Sampler 支持模拟慢速连接;请参阅jmeter.properties中的以下条目:
# Define characters per second > 0 to emulate slow connections #httpclient.socket.http.cps=0 #httpclient.socket.https.cps=0然而,Java采样器仅支持慢速 HTTPS 连接。
响应大小计算
实现确实包含响应正文大小 的开销,因此该值可能大于响应内容中的字节数。
重试处理
默认情况下,HttpClient4 和 Java 实现的重试都设置为 0,这意味着不会尝试重试。
对于 HttpClient4,可以通过设置相关的 JMeter 属性来覆盖重试计数,例如:
httpclient4.retrycount=3
httpclient4.request_sent_retry_enabled=true
http.java.sampler.retries=3
注意:证书不符合算法约束
您可能会遇到以下错误:java.security.cert.CertificateException:
如果您在具有 SSL 证书(本身或其中之一)的网站上运行 HTTPS 请求,证书不符合算法约束信任链中的 SSL 证书)带有使用 MD2 的签名算法(如md2WithRSAEncryption)或大小小于 1024 位的 SSL 证书。
此错误与 Java 8 中提高的安全性有关。
要允许您执行 HTTPS 请求,您可以通过编辑 Java jdk.certpath.disabledAlgorithms属性来降低 Java 安装的安全性。根据您的情况,删除 MD2 值或大小约束。
此属性在此文件中:
JAVA_HOME/jre/lib/security/java.security
有关详细信息,请参阅 错误 56357。
JDBC 请求¶
此采样器允许您将 JDBC 请求(SQL 查询)发送到数据库。
在使用它之前,您需要设置一个 JDBC 连接配置配置元素
如果提供了变量名称列表,那么对于 Select 语句返回的每一行,变量都设置为对应列的值(如果提供了变量名称),并且还设置了行数。例如,如果 Select 语句返回 2 行 3 列,并且变量列表为A,,C,则将设置以下变量:
A_#=2 (number of rows) A_1=column 1, row 1 A_2=column 1, row 2 C_#=2 (number of rows) C_1=column 3, row 1 C_2=column 3, row 2
如果 Select 语句返回零行,则A_#和C_#变量将设置为0,并且不会设置其他变量。
如有必要,旧变量会被清除 - 例如,如果第一次选择检索六行而第二次选择仅返回三行,则将删除第四、五和第六行的附加变量。
参数 ¶
- 选择语句
- 更新语句 - 也将其用于插入和删除
- 可调用语句
- 准备好的选择语句
- Prepared Update Statement - 也用于插入和删除
- 犯罪
- 回滚
- 自动提交(假)
- 自动提交(真)
- 编辑 - 这应该是一个变量引用,评估为上述之一
- 从 t_customers 中选择 *,其中 id=23
-
CALL SYSCS_UTIL.SYSCS_EXPORT_TABLE (null, ?, ?, null, null, null)
- 参数值:表名,文件名
- 参数类型: VARCHAR,VARCHAR
如果任何值包含逗号或双引号,则列表必须用双引号括起来,并且任何嵌入的双引号必须加倍,例如:
"Dbl-Quote: "" and Comma: ,"
这些被定义为类java.sql.Types中的字段,例如参见:
Javadoc for java.sql.Types。
如果未指定,则假定为“ IN ”,即“ DATE ”与“ IN DATE ”相同。
如果类型不是java.sql.Types中的字段之一,JMeter 也接受相应的整数,例如,由于OracleTypes.CURSOR == -10,您可以使用“ INOUT -10 ”。
语句中的类型必须与占位符一样多。
columnValue = vars.getObject("resultObject").get(0).get("Column Name");
- 存储为字符串(默认)- 变量名称列表中的所有变量都存储为字符串,当列表中存在时不会遍历ResultSet。CLOB将被转换为字符串。BLOB将被转换为字符串,就好像它们是 UTF-8 编码的字节数组一样。CLOB和BLOB都将在jdbcsampler.max_retain_result_size字节之后被切断。
- 存储为对象- 变量名称列表上的ResultSet类型的变量将存储为对象,并且可以在后续测试/脚本中访问并进行迭代,不会遍历ResultSet。CLOB将被处理,就像选择了Store As String一样。BLOB将存储为字节数组。CLOB和BLOB都将在jdbcsampler.max_retain_result_size字节之后被切断。
- 计数记录- ResultSet类型的变量将通过将记录计数显示为结果进行迭代。变量将存储为字符串。对于BLOB,将存储对象的大小。
Java 请求¶
此采样器允许您控制实现 org.apache.jmeter.protocol.java.sampler.JavaSamplerClient接口的 java 类。通过编写您自己的此接口实现,您可以使用 JMeter 来利用多个线程、输入参数控制和数据收集。
下拉菜单提供了 JMeter 在其类路径中找到的所有此类实现的列表。然后可以在下表中指定参数 - 由您的实现定义。提供了两个简单的示例(JavaTest和SleepTest)。
JavaTest示例采样 器可用于检查测试计划,因为它允许在几乎所有字段中设置值。然后这些可以被断言等使用。这些字段允许使用变量,因此可以很容易地看到这些值。
参数 ¶
以下参数适用于SleepTest和JavaTest实现:
参数 ¶
睡眠时间计算如下:
totalSleepTime = SleepTime + (System.currentTimeMillis() % SleepMask)
以下参数还适用于JavaTest实现:
参数 ¶
LDAP 请求¶
如果您要向同一个 LDAP 服务器发送多个请求,请考虑使用LDAP 请求默认 配置元素,这样您就不必为每个 LDAP 请求输入相同的信息。
登录配置元素也用于登录和密码 的方式相同。有两种方法可以创建用于测试 LDAP 服务器的测试用例。
- 内置测试用例。
- 用户定义的测试用例。
测试 LDAP 有四种测试场景。测试如下:
- 添加测试
- 内置测试:
这将在 LDAP 服务器中添加一个预定义的条目并计算执行时间。执行测试后,创建的条目将从 LDAP 服务器中删除。
- 用户定义测试:
这将在 LDAP 服务器中添加条目。用户必须输入表中的所有属性。条目是从表中收集来添加的。计算执行时间。测试后创建的条目不会被删除。
- 内置测试:
- 修改测试
- 内置测试:
这将首先创建一个预定义的条目,然后会在 LDAP 服务器中修改创建的条目。并计算执行时间。执行测试后,创建的条目将从 LDAP 服务器中删除。
- 用户定义测试:
这将修改 LDAP 服务器中的条目。用户必须输入表中的所有属性。从表中收集条目以进行修改。计算执行时间。该条目不会从 LDAP 服务器中删除。
- 内置测试:
- 搜索测试
- 内置测试:
这将首先创建条目,然后搜索属性是否可用。它计算搜索查询的执行时间。在执行结束时,创建的条目将从 LDAP 服务器中删除。
- 用户定义测试:
这将在搜索库(同样,由用户定义)中搜索用户定义的条目(搜索过滤器)。这些条目应该在 LDAP 服务器中可用。计算执行时间。
- 内置测试:
- 删除测试
- 内置测试:
这将首先创建一个预定义条目,然后将其从 LDAP 服务器中删除。计算执行时间。
- 用户定义测试:
这将删除 LDAP 服务器中的用户定义条目。这些条目应该在 LDAP 服务器中可用。计算执行时间。
- 内置测试:
参数 ¶
LDAP 扩展请求¶
如果您要向同一个 LDAP 服务器发送多个请求,请考虑使用LDAP 扩展请求默认 配置元素,这样您就不必为每个 LDAP 请求输入相同的信息。
定义了九个测试操作。这些操作如下所示:
- 线程绑定
-
任何 LDAP 请求都是 LDAP 会话的一部分,因此应该做的第一件事是启动与 LDAP 服务器的会话。为了启动这个会话,使用了一个线程绑定,它等同于 LDAP“绑定”操作。要求用户提供用户名(专有名称)和密码,用于启动会话。当没有密码或指定了错误的密码时,将启动一个匿名会话。请注意,省略密码不会使此测试失败,错误的密码会失败。(注意,这是在测试计划中未加密存储的)
参数
属性描述必需的姓名树中显示的此采样器的描述性名称。不服务器名称LDAP 服务器的名称(或 IP 地址)。是的港口LDAP 服务器正在侦听的端口号。如果省略,JMeter 假定 LDAP 服务器正在侦听默认端口 (389)。不DN将用于任何后续操作的基础对象的可分辨名称。它可以作为所有操作的起点。您不能在高于此 DN 的级别上启动任何操作!不用户名要绑定的用户的完整专有名称。不密码上述用户的密码。如果省略它将导致匿名绑定。如果不正确,采样器将返回错误并恢复为匿名绑定。(注意,这是在测试计划中未加密存储的)不连接超时(以毫秒为单位)连接超时,如果超过将中止连接不使用安全 LDAP 协议使用ldaps://方案而不是ldap://不信任所有证书信任所有证书,仅在选中使用安全 LDAP 协议时使用不 - 线程解绑
-
这只是结束会话的操作。它相当于 LDAP 的“解除绑定”操作。
参数
属性描述必需的姓名树中显示的此采样器的描述性名称。不 - 单一绑定/解除绑定
-
这是 LDAP“绑定”和“取消绑定”操作的组合。它可用于任何用户的身份验证请求/密码检查。它将打开一个新会话,只是为了检查用户/密码组合的有效性,然后再次结束会话。
参数
属性描述必需的姓名树中显示的此采样器的描述性名称。不用户名要绑定的用户的完整专有名称。是的密码上述用户的密码。如果省略它将导致匿名绑定。如果不正确,采样器将返回错误。(注意,这是在测试计划中未加密存储的)不 - 重命名条目
-
这是 LDAP“ moddn ”操作。它可用于重命名条目,也可用于将条目或完整子树移动到 LDAP 树中的不同位置。
参数
属性描述必需的姓名树中显示的此采样器的描述性名称。不旧条目名称您要重命名或移动的对象的当前专有名称,相对于线程绑定操作中的给定 DN。是的新的专有名称要重命名或移动的对象的新专有名称,相对于线程绑定操作中的给定 DN。是的 - 添加测试
-
这是 LDAP“添加”操作。它可用于向 LDAP 服务器添加任何类型的对象。
参数
属性描述必需的姓名树中显示的此采样器的描述性名称。不条目 DN要添加的对象的可分辨名称,相对于线程绑定操作中的给定 DN。是的添加测试要用于对象的属性及其值的列表。如果需要添加多值属性,则需要将具有各自值的相同属性多次添加到列表中。是的 - 删除测试
-
这是 LDAP “删除”操作,它可以用来从 LDAP 树中删除一个对象
参数
属性描述必需的姓名树中显示的此采样器的描述性名称。不删除要删除的对象的可分辨名称,相对于线程绑定操作中的给定 DN。是的 - 搜索测试
-
这是 LDAP“搜索”操作,将用于定义搜索。
参数
属性描述必需的姓名树中显示的此采样器的描述性名称。不搜索库您希望搜索查找的子树的可分辨名称,相对于线程绑定操作中的给定 DN。不搜索过滤器searchfilter,必须在 LDAP 语法中指定。是的范围使用0表示 baseobject-,1表示 onelevel-,2表示子树搜索。(默认= 0)不尺寸限制指定您希望从服务器返回的最大结果数。(默认= 0,表示没有限制。)当采样器达到最大结果数时,它将失败,错误代码为4不时限指定服务器可以在搜索上花费的最大 (cpu) 时间(以毫秒为单位)。请注意,这并没有说明响应时间。(默认为0,表示没有限制)不属性指定要返回的属性,用分号分隔。空字段将返回所有属性不返回对象对象是否将被返回 ( true ) 或不 ( false )。默认=假不取消引用别名如果为true,它将取消引用别名,如果为false,它将不跟随它们(默认 = false)不解析搜索结果?如果为true,则搜索结果将添加到响应数据中。如果为false,则将标记(无论是否找到结果)添加到响应数据中。不 - 改装测试
-
这是 LDAP“修改”操作。它可用于修改对象。它可用于添加、删除或替换属性的值。
参数
属性描述必需的姓名树中显示的此采样器的描述性名称。不条目名称要修改的对象的可分辨名称,相对于线程绑定操作中的给定 DN是的改装测试属性值操作码三倍。操作码可以是任何有效
的LDAP 操作码(添加、删除、删除或替换)。 如果您不使用删除操作指定值,则将删除给定属性的所有值。 如果您确实在删除操作中指定了值,则只会删除给定的值。 如果此值不存在,则采样器将无法通过测试。是的 - 比较
-
这是 LDAP“比较”操作。它可用于将给定属性的值与某个已知值进行比较。实际上,这主要用于检查给定的人是否是某个组的成员。在这种情况下,您可以将用户的 DN 作为给定值与groupOfNames类型的对象的“成员”属性中的值进行比较。如果比较操作失败,则此测试失败,错误代码为49。
参数
属性描述必需的姓名树中显示的此采样器的描述性名称。不条目 DN您要比较其属性的对象的当前专有名称,相对于线程绑定操作中的给定 DN。是的比较过滤器形式为“属性=值”是的
访问日志采样器¶
AccessLogSampler 旨在读取访问日志并生成 http 请求。对于那些不熟悉访问日志的人,它是网络服务器维护它接受的每个请求的日志。这意味着每个图像、CSS 文件、JavaScript 文件、html 文件……
Tomcat 使用通用格式来记录访问日志。这意味着任何使用通用日志格式的网络服务器都可以使用 AccessLogSampler。使用常见日志格式的服务器包括:Tomcat、Resin、Weblogic 和 SunOne。常见的日志格式如下所示:
127.0.0.1 - - [21/Oct/2003:05:37:21 -0500] "GET /index.jsp?%2Findex.jsp= HTTP/1.1" 200 8343
将来,过滤掉响应代码不为200的条目可能会更好。扩展采样器应该相当简单。您必须实现两个接口:
- org.apache.jmeter.protocol.http.util.accesslog.LogParser
- org.apache.jmeter.protocol.http.util.accesslog.Generator
AccessLogSampler 的当前实现使用生成器来创建新的 HTTPSampler。服务器名称、端口和获取图像由 AccessLogSampler 设置。接下来,使用整数1调用解析器,告诉它解析一个条目。之后, 调用 HTTPSampler.sample()来发出请求。
samp = (HTTPSampler) GENERATOR.generateRequest(); samp.setDomain(this.getDomain()); samp.setPort(this.getPort()); samp.setImageParser(this.isImageParser()); PARSER.parse(1); res = samp.sample(); res.setSampleLabel(samp.toString());LogParser中 所需的方法是:
- 集合生成器(生成器)
- 解析(整数)
实现Generator接口的类应该为所有方法提供具体的实现。有关如何实现任一接口的示例,请参阅 StandardGenerator和TCLogParser。
(测试代码)
参数 ¶
TCLogParser为每个线程独立处理访问日志。SharedTCLogParser和OrderPreservingLogParser共享对文件的访问权限,即每个线程获取日志中的下一个条目 。
SessionFilter旨在跨线程处理 Cookie。它不会过滤掉任何条目,但会修改 cookie 管理器,以便给定 IP 的 cookie 一次由单个线程处理。如果两个线程尝试处理来自同一个客户端 IP 地址的样本,那么一个线程将被迫等待,直到另一个线程完成。
LogFilter旨在允许通过文件名和正则表达式过滤访问日志条目,并允许替换文件扩展名。但是,目前无法通过 GUI 进行配置,因此无法真正使用。
BeanShell 采样器¶
该采样器允许您使用 BeanShell 脚本语言编写采样器。
有关使用 BeanShell 的完整详细信息,请参阅BeanShell 网站。
测试元素支持ThreadListener和TestListener接口方法。这些必须在初始化文件中定义。有关示例定义,请参见文件BeanShellListeners.bshrc。
BeanShell 采样器还支持Interruptible接口。可以在脚本或 init 文件中定义 interrupt ()方法。
参数 ¶
- 参数
- 包含作为单个变量的参数的字符串
- bsh.args
- 包含参数的字符串数组,在空白处拆分
如果定义了属性“ beanshell.sampler.init ”,它将作为源文件的名称传递给解释器。这可用于定义常用方法和变量。bin 目录中有一个示例初始化文件:BeanShellSampler.bshrc。
如果提供了脚本文件,则将使用该文件,否则将使用该脚本。
BeanShell 目前不支持 Java 5 语法,例如泛型和增强的 for 循环。
在调用脚本之前,在 BeanShell 解释器中设置了一些变量:
参数字段的内容被放入变量“参数”中。字符串也使用单个空格作为分隔符拆分为单独的标记,结果列表存储在字符串数组bsh.args中。
设置的 BeanShell 变量的完整列表如下:
- log -记录器
- 标签- 采样器标签
- FileName - 文件名,如果有的话
- 参数- 参数字段中的文本
- bsh.args - 参数,如上所述拆分
- SampleResult - 指向当前SampleResult的指针
- 响应代码默认为200
- ResponseMessage默认为“ OK ”
- IsSuccess默认为true
- ctx - JMeterContext
-
vars - JMeterVariables - 例如
vars.get("VAR1"); vars.put("VAR2","value"); vars.remove("VAR3"); vars.putObject("OBJ1",new Object());
-
道具- JMeterProperties(类java.util.Properties) - 例如
props.get("START.HMS"); props.put("PROP1","1234");
脚本完成后,控制权返回给 Sampler,并将以下脚本变量的内容复制到SampleResult中的相应变量中:
- 响应代码- 例如200
- ResponseMessage - 例如“ OK ”
- IsSuccess -真或假
SampleResult ResponseData 是根据脚本的返回值设置的。如果脚本返回 null,它可以通过使用方法 SampleResult.setResponseData(data)直接设置响应,其中 data 是字符串或字节数组。数据类型默认为“文本”,但可以使用方法 SampleResult.setDataType(SampleResult.BINARY)设置为二进制。
SampleResult变量使脚本可以完全访问 SampleResult 中的所有字段和方法。例如,脚本可以访问方法 setStopThread(boolean)和setStopTest(boolean)。这是一个简单的(不是很有用!)示例脚本:
if (bsh.args[0].equalsIgnoreCase("StopThread")) { log.info("Stop Thread detected!"); SampleResult.setStopThread(true); } return "Data from sample with Label "+Label; //or SampleResult.setResponseData("My data"); return null;
另一个例子:
确保属性beanshell.sampler.init=BeanShellSampler.bshrc在jmeter.properties中定义。以下脚本将显示ResponseData字段中所有变量的值:
return getVariables();
有关各种类(JMeterVariables、SampleResult等)可用方法的详细信息,请查看 Javadoc 或源代码。但请注意,任何方法的滥用都可能导致难以发现的细微故障。
JSR223 采样器¶
JSR223 采样器允许使用 JSR223 脚本代码来执行创建/更新变量所需的示例或某些计算。
SampleResult.setIgnore();此调用将产生以下影响:
- SampleResult 将不会传递给 SampleListener,例如 View Results Tree、Summariser ...
- SampleResult 不会在 Assertions 或 PostProcessors 中进行评估
- SampleResult 将被评估以计算最后一个样本状态(${JMeterThread.last_sample_ok})和 ThreadGroup “在采样器错误后采取的行动”(自 JMeter 5.4 起)
JSR223 测试元素具有可以显着提高性能的特性(编译)。要从此功能中受益:
- 使用脚本文件而不是内联它们。如果此功能在 ScriptEngine 上可用,这将使 JMeter 编译它们并缓存它们。
- 或使用脚本文本并检查缓存已编译的脚本(如果有可用的属性)。
使用此功能时,请确保您的脚本代码不直接在脚本代码中使用 JMeter 变量或 JMeter 函数调用,因为缓存只会缓存第一个替换。而是使用脚本参数。要从缓存和编译中受益,用于脚本的语言引擎必须实现 JSR223 Compilable接口(Groovy 是其中之一,java、beanshell 和 javascript 不是)当使用 Groovy 作为脚本语言并且不检查缓存已编译脚本(如果可用)时(建议使用缓存),您应该设置此 JVM 属性-Dgroovy.use.classvalue=true ,因为从版本 2.4.6 开始出现 Groovy 内存泄漏,请参阅:
jsr223.compiled_scripts_cache_size=100
props.get("START.HMS"); props.put("PROP1","1234");
参数 ¶
请注意,某些语言(例如 Velocity)可能对 JSR223 变量使用不同的语法,例如
$log.debug("Hello " + $vars.get("a"));为速度。
如果提供了脚本文件,则将使用该文件,否则将使用该脚本。
在调用脚本之前,会设置一些变量。请注意,这些是 JSR223 变量 - 即它们可以直接在脚本中使用。
- log -记录器
- 标签- 采样器标签
- FileName - 文件名,如果有的话
- 参数- 参数字段中的文本
- 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());
-
道具- JMeterProperties(类java.util.Properties) - 例如
props.get("START.HMS"); props.put("PROP1","1234");
- OUT - System.out - 例如OUT.println("message")
SampleResult ResponseData 是 根据脚本的返回值设置的。如果脚本返回null,它可以通过使用方法 SampleResult.setResponseData(data)直接设置响应,其中 data 是字符串或字节数组。数据类型默认为“文本”,但可以使用方法 SampleResult.setDataType(SampleResult.BINARY)设置为二进制。
SampleResult 变量使脚本可以完全访问 SampleResult 中的所有字段和方法。例如,脚本可以访问方法 setStopThread(boolean)和setStopTest(boolean)。
与 BeanShell 采样器不同,JSR223 采样器不通过脚本变量设置ResponseCode、ResponseMessage和示例状态。目前,改变这些的唯一方法是通过SampleResult方法:
- SampleResult.setSuccessful(true/false)
- SampleResult.setResponseCode("代码")
- SampleResult.setResponseMessage("消息")
TCP 采样器¶
TCP 采样器打开与指定服务器的 TCP/IP 连接。然后它发送文本,并等待响应。
如果选择“重用连接”,则在同一线程中的采样器之间共享连接,前提是使用完全相同的主机名字符串和端口。不同的主机/端口组合将使用不同的连接,不同的线程也是如此。如果同时选择了“重用连接”和“关闭连接”,则在运行采样器后将关闭套接字。在下一个采样器上,将创建另一个套接字。您可能希望在每个线程循环结束时关闭一个套接字。
如果检测到错误 - 或未选择“重用连接” - 套接字将关闭。另一个套接字将在下一个示例中重新打开。
以下属性可用于控制其操作:
- tcp.status.prefix
- 状态编号之前的文本
- tcp.status.suffix
- 状态编号后面的文本
- tcp.status.properties
- 将状态代码转换为消息的属性文件的名称
- tcp.handler
- TCP 处理程序类的名称(默认TCPClientImpl) - 仅在 GUI 上未指定时使用
用户可以提供自己的实现。该类必须扩展org.apache.jmeter.protocol.tcp.sampler.TCPClient。
当前提供了以下实现。
- TCPClientImpl
- BinaryTCPClientImpl
- LengthPrefixedBinaryTCPClientImpl
- TCPClientImpl
- 这个实现是相当基本的。读取响应时,如果通过设置属性tcp.eolByte定义,它将一直读取到行字节的末尾,否则直到输入流的末尾。您可以通过设置tcp.charset来控制字符集编码,这将默认为平台默认编码。
- BinaryTCPClientImpl
- 此实现将必须是十六进制编码字符串的 GUI 输入转换为二进制,并在读取响应时执行相反的操作。读取响应时,它会一直读取到消息字节的结尾,如果这是通过设置属性tcp.BinaryTCPClient.eomByte定义的,否则直到输入流的结尾。
- LengthPrefixedBinaryTCPClientImpl
- 此实现通过在二进制消息数据前加上二进制长度字节来扩展 BinaryTCPClientImpl。长度前缀默认为 2 个字节。这可以通过设置属性tcp.binarylength.prefix.length来改变。
- 超时处理
- 如果设置了超时,读取将在超时时终止。因此,如果您使用的是eolByte / eomByte,请确保超时时间足够长,否则读取将提前终止。
- 响应处理
- 如果定义了tcp.status.prefix,则在响应消息中搜索其后一直到后缀的文本。如果找到任何此类文本,则将其用于设置响应代码。然后从属性文件(如果提供)中获取响应消息。 “ 400 ”-“ 499 ”和“ 500 ”-“ 599 ” 范围内的响应码目前视为失败;所有其他人都是成功的。[这需要可配置!]
套接字在测试运行结束时断开。
参数 ¶
JMS 发布者¶
JMS Publisher 将消息发布到给定的目的地(主题/队列)。对于那些不熟悉 JMS 的人来说,它是用于消息传递的 J2EE 规范。市场上有许多 JMS 服务器和几个开源选项。
参数 ¶
- 从文件
- 表示引用的文件将被所有样本读取和重用。如果文件名更改,则自 JMeter 3.0 起重新加载
- 下面指定的文件夹中的随机文件
- 表示将从下面指定的文件夹中选择一个随机文件,此文件夹必须包含扩展名为.dat的文件(用于字节消息)或扩展名为.txt或.obj的文件(用于对象或文本消息)
- 文本区
- 用于文本或对象消息的消息
- 原始:
- 文件不支持变量,并使用默认系统字符集加载它。
- 默认:
- 使用默认系统编码加载文件,但依赖 XML prolog 的 XML 除外。如果文件包含变量,它们将被处理。
- 标准字符集:
- 指定的编码(有效与否)用于读取文件和处理变量
对于 MapMessage 类型,JMeter 将源读取为文本行。每行必须有 3 个字段,以逗号分隔。这些字段是:
- 条目名称
- 对象类名,例如“ String ”(如果未指定,则假定为java.lang包)
- 对象字符串值
name,String,Example size,Integer,1234
- 将包含您的对象及其依赖项的 JAR 放在jmeter_home/lib/文件夹中
- 使用 XStream 将对象序列化为 XML
- 将结果放入以.txt或.obj为后缀的文件中,或将 XML 内容直接放入文本区域
下表显示了一些在配置 JMS 时可能有用的值:
Apache ActiveMQ | 值 | 评论 |
---|---|---|
上下文工厂 | org.apache.activemq.jndi.ActiveMQInitialContextFactory | . |
提供者网址 | 虚拟机://本地主机 | |
提供者网址 | vm:(经纪人:(vm://localhost)?persistent=false) | 禁用持久性 |
队列参考 | 动态队列/队列名称 | 动态定义QUEUENAME 到 JNDI |
主题参考 | 动态主题/主题名称 | 动态定义TOPICNAME 到 JNDI |
JMS 订阅者¶
JMS 订阅者将订阅给定目的地(主题或队列)中的消息。对于那些不熟悉 JMS 的人来说,它是用于消息传递的 J2EE 规范。市场上有许多 JMS 服务器和几个开源选项。
参数 ¶
- MessageConsumer.receive()
- 为每个请求的消息调用receive() 。保留样本之间的连接,但除非采样器处于活动状态,否则不会获取消息。这最适合队列订阅。
- 消息监听器.onMessage()
- 建立一个将所有传入消息存储在队列中的侦听器。采样器完成后,侦听器保持活动状态。这最适合主题订阅。
JMS 点对点¶
此采样器通过点对点连接(队列)发送和接收 JMS 消息。它与发布/订阅消息不同,通常用于处理事务。
request_only通常用于对 JMS 系统施加负载。当您想要测试处理发送到请求队列的消息的 JMS 服务的响应时间时,将使用
request_reply ,因为此模式将等待此服务发送的回复队列上的响应。
浏览返回当前队列深度,即队列中的消息数。
read从队列中读取消息(如果有)。
clear清除队列,即从队列中删除所有消息。
JMeter 在创建队列连接时使用属性java.naming.security.[principal|credentials] - 如果存在的话。如果不需要此行为,请设置 JMeter 属性 JMSSampler.useSecurity.properties=false
参数 ¶
- 仅请求
- 只会发送消息,不会监控回复。因此,它可以用来给系统增加负载。
- 请求响应
- 将发送消息并监视它收到的回复。行为取决于 JNDI 名称回复队列的值。如果 JNDI 名称回复队列有值,则此队列用于监视结果。请求和回复的匹配是通过请求的消息 id 和回复的相关 id 完成的。如果 JNDI 名称回复队列为空,则临时队列将用于请求者和服务器之间的通信。这与固定回复队列有很大不同。使用临时队列,发送线程将阻塞,直到收到回复消息。使用请求响应模式,您需要有一个服务器来侦听发送到请求队列的消息并将回复发送到message.getJMSReplyTo()引用的队列。
- 读
- 将从没有附加侦听器的传出队列中读取消息。这可以方便地进行测试。如果您需要在没有绑定文件的情况下处理队列(如果使用 jmeter-jms-skip-jndi 库),则可以使用此方法,该方法仅适用于 JMS 点对点采样器。如果使用绑定文件,还可以使用 JMS 订阅者采样器从队列中读取。
- 浏览
- 将确定当前队列深度而不从队列中删除消息,返回队列中的消息数。
- 清除
- 将清除队列,即从队列中删除所有消息。
- 使用请求消息 ID
- 如果选中,将使用请求 JMSMessageID,否则将使用请求 JMSCorrelationID。在后一种情况下,必须在请求中指定相关 ID。
- 使用响应消息 ID
- 如果选择,将使用响应 JMSMessageID,否则将使用响应 JMSCorrelationID。
- JMS 相关 ID 模式
- 即在其相关ID上匹配请求和响应=>取消选中两个复选框,并提供相关ID。
- JMS 消息 ID 模式
- 即,将请求消息 ID 与响应相关 ID 匹配 => 仅选择“使用请求消息 ID”。
JUnit 请求¶
- 它不使用 JMeter 的测试接口,而是扫描 jar 文件以查找扩展 JUnit 的TestCase类的类。这包括任何类或子类。
- JUnit 测试 jar 文件应该放在jmeter/lib/junit而不是/lib目录中。您还可以使用“ user.classpath ”属性来指定在哪里查找TestCase类。
- JUnit 采样器不使用名称/值对进行配置,如Java Request。采样器假定setUp和tearDown将正确配置测试。
- 采样器仅测量测试方法的经过时间,不包括setUp和tearDown。
- 每次调用测试方法时,JMeter 都会将结果传递给监听器。
- 对oneTimeSetUp和oneTimeTearDown的支持是作为一种方法完成的。由于 JMeter 是多线程的,我们不能像 Maven 那样调用oneTimeSetUp / oneTimeTearDown。
- 采样器将意外异常报告为错误。标准的 JUnit 测试运行器和 JMeter 的实现之间有一些重要的区别。JMeter 不是为每个测试创建一个新的类实例,而是为每个采样器创建一个实例并重用它。这可以通过复选框“为每个样本创建一个新实例”来更改。
public class myTestCase { public myTestCase() {} }字符串构造函数:
public class myTestCase { public myTestCase(String text) { super(text); } }
一般准则
如果您使用setUp和tearDown,请确保将方法声明为 public。否则,测试可能无法正常运行。以下是编写 JUnit 测试的一些通用指南,以便它们与 JMeter 一起工作。由于 JMeter 运行多线程,因此记住某些事情很重要。
- 编写setUp和tearDown方法,使它们是线程安全的。这通常意味着避免使用静态成员。
- 使测试方法成为离散的工作单元,而不是长序列的动作。通过将测试方法保持为离散操作,可以更轻松地组合测试方法来创建新的测试计划。
- 避免使测试方法相互依赖。由于 JMeter 允许对测试方法进行任意排序,因此运行时行为不同于默认的 JUnit 行为。
- 如果测试方法是可配置的,请注意属性的存储位置。建议从 Jar 文件中读取属性。
- 每个采样器都会创建一个测试类的实例,因此请编写您的测试,以便设置发生在oneTimeSetUp和oneTimeTearDown中。
参数 ¶
可识别以下 JUnit4 注释:
- @测试
- 用于查找测试方法和类。支持“预期”和“超时”属性。
- @前
- 与JUnit3中的setUp()处理相同
- @后
- 与JUnit3中的tearDown()处理相同
- @BeforeClass , @AfterClass
- 被视为测试方法,因此它们可以根据需要独立运行
邮件阅读器采样器¶
Mail Reader Sampler 可以使用 POP3(S) 或 IMAP(S) 协议读取(并可选择删除)邮件消息。
参数 ¶
如果失败,则针对包含测试脚本(JMX 文件)的目录。
消息存储为主采样器的子样本。多部分消息部分存储为消息的子样本。
“文件”协议
的特殊处理:文件JavaMail 提供程序可用于从文件中读取原始消息。服务器字段用于指定文件夹父级的路径。单个消息文件应以名称n.msg存储,其中n是消息编号。或者,服务器字段可以是包含单个消息的文件的名称。当前的实现非常基础,主要用于调试目的。
流控制动作 (原为:测试动作) ¶
这个采样器也可以与事务控制器一起使用,因为它允许在不需要生成示例的情况下包含暂停。对于可变延迟,将暂停时间设置为零,并添加一个 Timer 作为子项。
“停止”动作在完成任何正在进行的样本后停止线程或测试。“立即停止”动作停止测试,无需等待样品完成;它将中断任何活动样本。如果某些线程未能在 5 秒的时间限制内停止,则会在 GUI 模式下显示一条消息。您可以尝试使用Stop命令来查看这是否会停止线程,但如果没有,您应该退出 JMeter。在 CLI 模式下,如果某些线程未能在 5 秒的时间限制内停止,JMeter 将退出。
参数 ¶
SMTP 采样器¶
SMTP 采样器可以使用 SMTP/SMTPS 协议发送邮件消息。可以为连接设置安全协议(SSL 和 TLS)以及用户身份验证。如果使用安全协议,则会对服务器证书进行验证。
有两种方法可以处理此验证:
- 信任所有证书
- 这将忽略证书链验证
- 使用本地信任库
- 使用此选项,证书链将根据本地信任库文件进行验证。
参数 ¶
如果失败,则针对包含测试脚本(JMX 文件)的目录。
操作系统进程采样器¶
OS Process Sampler 是一个可用于在本地机器上执行命令的采样器。
它应该允许执行任何可以从命令行运行的命令。
可以启用返回码的验证,并且可以指定预期的返回码。
请注意,OS shell 通常提供命令行解析。这在操作系统之间有所不同,但通常外壳会在空白处拆分参数。一些 shell 扩展了通配符文件名;有些没有。引用机制也因操作系统而异。采样器故意不进行任何解析或引用处理。命令及其参数必须以可执行文件预期的形式提供。这意味着采样器设置不能在操作系统之间移植。
许多操作系统都有一些内置命令,这些命令不作为单独的可执行文件提供。例如,Windows DIR命令是命令解释器 ( CMD.EXE ) 的一部分。这些内置程序不能作为独立程序运行,而必须作为参数提供给适当的命令解释器。
例如,Windows 命令行:DIR C:\TEMP需要指定如下:
- 命令:
- 命令
- 参数 1:
- /C
- 参数 2:
- 目录
- 参数 3:
- C:\温度
参数 ¶
MongoDB 脚本(已弃用)¶
此采样器允许您向 MongoDB 发送请求。
在使用它之前,您需要设置一个 MongoDB Source Config Configuration 元素
参数 ¶
螺栓请求¶
该采样器允许您通过 Bolt 协议运行 Cypher 查询。
在使用它之前,您需要设置螺栓连接配置
每个请求都使用从池中获取的连接,并在采样器完成时将其返回到池中。连接池大小使用驱动程序默认值 (~100),目前不可配置。
测量的响应时间对应于“完整”查询执行,包括执行密码查询的时间和使用数据库发回的结果的时间。
参数 ¶
18.2 逻辑控制器¶
逻辑控制器确定采样器的处理顺序。
简单控制器¶
Simple Logic Controller 可让您组织采样器和其他逻辑控制器。与其他逻辑控制器不同,该控制器不提供存储设备以外的功能。
循环控制器¶
如果您将 Generative 或 Logic Controllers 添加到 Loop Controller,除了您为 Thread Group 指定的循环值之外,JMeter 还将循环通过它们一定次数。例如,如果您将一个 HTTP 请求添加到循环计数为 2 的 Loop Controller,并将 Thread Group 循环计数配置为 3,那么 JMeter 将总共发送2 * 3 = 6 个HTTP 请求。
一次控制器¶
Once Only Logic Controller 告诉 JMeter 每个线程只处理其中的控制器一次,并在通过测试计划的进一步迭代期间传递其下的任何请求。
Once Only Controller 现在将始终在任何循环父控制器的第一次迭代期间执行。因此,如果将 Once Only 控制器放置在指定循环 5 次的 Loop Controller 下,那么 Once Only 控制器将仅在通过 Loop Controller 的第一次迭代时执行(即每 5 次)。
请注意,这意味着如果放置在线程组下(每个线程的每个测试仅运行一次),Once Only 控制器仍将像以前预期的那样运行,但现在用户在使用 Once Only 控制器时具有更大的灵活性。
对于需要登录的测试,请考虑将登录请求放在此控制器中,因为每个线程只需登录一次即可建立会话。
交错控制器¶
如果您将 Generative 或 Logic Controllers 添加到 Interleave Controller,JMeter 将在每个循环迭代的每个其他控制器之间交替。
参数 ¶
下载此示例(参见图 1)。在此示例中,我们将线程组配置为有两个线程和五个循环计数,每个线程总共有十个请求。请参阅下表了解 JMeter 发送 HTTP 请求的顺序。
循环迭代 | 每个 JMeter 线程发送这些 HTTP 请求 |
---|---|
1 | 新闻页面 |
1 | 日志页面 |
2 | 常见问题页面 |
2 | 日志页面 |
3 | 阿甘正传页面 |
3 | 日志页面 |
4 | 因为控制器中没有更多请求,所以 JMeter 重新开始并发送第一个 HTTP 请求,即新闻页面。 |
4 | 日志页面 |
5 | 常见问题页面 |
5 | 日志页面 |
下载另一个示例(参见图 2)。在此示例中,我们将线程组配置为具有单个线程和 8 个循环计数。请注意,测试计划有一个外部交错控制器,其中有两个交错控制器。
外部交错控制器在两个内部交错控制器之间交替。然后,每个内部交错控制器在每个 HTTP 请求之间交替。每个 JMeter 线程将按以下顺序发送请求:主页、交错、错误页面、交错、CVS 页面、交错和常见问题页面、交错。
请注意,文件报告器配置为将结果存储在当前目录中名为“ interleave-test2.dat ”的文件中。
如果主交错控制器下的两个交错控制器是简单的控制器,那么顺序将是:主页、CVS 页面、交错、错误页面、常见问题页面、交错。
但是,如果在主交错控制器上选中“忽略子控制器块”,则顺序为:主页、交错、错误页面、交错、CVS 页面、交错和常见问题页面、交错。
随机控制器¶
随机逻辑控制器的行为类似于交错控制器,除了它不是按顺序通过其子控制器和采样器,而是在每次通过时随机选择一个。
吞吐量控制器¶
吞吐量控制器允许用户控制它的执行频率。有两种模式:
- 执行百分比
- 处决总数
- 执行百分比
- 使控制器通过测试计划执行一定百分比的迭代。
- 总处决
- 导致控制器在执行一定次数后停止执行。
参数 ¶
如果控制器¶
If 控制器允许用户控制它下面的测试元素(它的子元素)是否运行。
默认情况下,条件仅在初始输入时评估一次,但您可以选择为控制器中包含的每个可运行元素评估它。
最好的选项(默认选项)是检查将条件解释为变量表达式?,然后在条件字段中,您有 2 个选项:
- 选项 1:使用包含true或false的变量
如果要测试最后一个示例是否成功,可以使用${JMeterThread.last_sample_ok}
- 选项 2:使用函数(建议使用${__jexl3()})来评估必须返回true或false的表达式
"${myVar}" == "\${myVar}"或使用:
"${myVar}" != "\${myVar}"测试变量是否已定义且不为空。
参数 ¶
- ${COUNT} < 10
- "${VAR}" == "abcd"
使用__groovy时注意不要在字符串中使用变量替换,否则如果使用更改脚本的变量,则无法缓存。而是使用以下方法获取变量:vars.get("myVar")。 请参阅下面的 Groovy 示例。
- ${__groovy(vars.get("myVar") != "Invalid" )}(Groovy 检查 myVar 不等于 Invalid)
- ${__groovy(vars.get("myInt").toInteger() <=4 )}(Groovy 检查 myInt 是否小于或等于 4)
- ${__groovy(vars.get("myMissing") != null )}(Groovy 检查 myMissing 变量是否未设置)
- ${__jexl3(${COUNT} < 10)}
- ${结果}
- ${JMeterThread.last_sample_ok}(检查最后一个样本是否成功)
而控制器¶
While 控制器运行它的子节点,直到条件为“假”。
可能的条件值:
- 空白 - 当循环中的最后一个样本失败时退出循环
- LAST - 当循环中的最后一个样本失败时退出循环。如果循环之前的最后一个样本失败,请不要进入循环。
- 否则 - 当条件等于字符串“ false ”时退出(或不进入)循环
例如:
- ${VAR} - 其中VAR被其他一些测试元素设置为 false
- ${__jexl3(${C}==10)}
- ${__jexl3("${VAR2}"=="abcd")}
- ${_P(property)} - 其他地方的属性设置为“ false ”
切换控制器¶
Switch 控制器的作用类似于Interleave 控制器 ,因为它在每次迭代时运行一个从属元素,但控制器不是按顺序运行它们,而是运行由 switch 值定义的元素。
如果开关值超出范围,它将运行第零个元素,因此它作为数字情况的默认值。如果值为空字符串,它也会运行第零个元素。
如果该值为非数字(且非空),则 Switch Controller 将查找具有相同名称的元素(区分大小写)。如果没有一个名称匹配,则选择名为“ default ”(大小写不重要)的元素。如果没有默认值,则不选择任何元素,控制器不会运行任何东西。
ForEach 控制器¶
ForEach 控制器循环通过一组相关变量的值。当您将采样器(或控制器)添加到 ForEach 控制器时,每个样本(或控制器)都会执行一次或多次,其中在每个循环期间变量都有一个新值。输入应该由几个变量组成,每个变量都用下划线和数字扩展。每个这样的变量都必须有一个值。因此,例如,当输入变量的名称为inputVar时,应定义以下变量:
- inputVar_1 = 温迪
- inputVar_2 = 查尔斯
- inputVar_3 = 彼得
- inputVar_4 = 约翰
注意:“ _ ”分隔符现在是可选的。
当返回变量为“ returnVar ”时,ForEach 控制器下的采样器和控制器的集合将连续执行4次,返回变量具有上述各自的值,然后可以在采样器中使用。
它特别适合与正则表达式后处理器一起运行。这可以从先前请求的结果数据中“创建”必要的输入变量。通过省略“ _ ”分隔符,ForEach 控制器可用于使用输入变量refName_g循环遍历组,也可以使用格式为 refName_${C的输入变量循环遍历所有匹配项中的所有组}_g,其中C是一个计数器变量。
参数 ¶
下载此示例(参见图 7)。在这个例子中,我们创建了一个测试计划,它只发送一次特定的 HTTP 请求,并向页面上可以找到的每个链接发送另一个 HTTP 请求。
我们为单个线程和循环计数值配置了线程组。您可以看到我们向线程组添加了一个 HTTP 请求,向 ForEach 控制器添加了另一个 HTTP 请求。
在第一个 HTTP 请求之后,添加了一个正则表达式提取器,它将所有 html 链接从返回页面中提取出来,并将它们放入inputVar变量中
在 ForEach 循环中,添加了一个 HTTP 采样器,它请求从第一个返回的 HTML 页面中提取的所有链接。
这是您可以下载的另一个示例。这有两个正则表达式和 ForEach 控制器。第一个 RE 匹配,但第二个不匹配,因此第二个 ForEach 控制器不运行任何样本
线程组有一个线程和两个循环计数。
示例 1 使用 JavaTest 采样器返回字符串“ abcd ”。
Regex Extractor 使用表达式(\w)\s匹配一个字母后跟一个空格,并返回该字母(而不是空格)。任何匹配都以字符串“ inputVar ”为前缀。
ForEach 控制器提取前缀为“ inputVar_ ”的所有变量,并执行其样本,传递变量“ returnVar ”中的值。在这种情况下,它将依次将变量设置为值“ a ”、“ b ”和“ c ”。
For 1采样器是另一个 Java 采样器,它使用返回变量“ returnVar ”作为示例标签的一部分和采样器数据。
Sample 2、Regex 2和For 2几乎相同,只是 Regex 已更改为“ (\w)\sx ”,这显然不匹配。因此For 2 Sampler 将不会运行。
模块控制器¶
模块控制器提供了一种在运行时将测试计划片段替换为当前测试计划的机制。
测试计划片段由控制器和其中包含的所有测试元素(采样器等)组成。片段可以位于任何线程组中。如果片段位于线程组中,则可以禁用其控制器以防止片段在模块控制器之外运行。或者您可以将片段存储在虚拟线程组中,并禁用整个线程组。
可以有多个片段,每个片段下都有不同系列的采样器。然后,只需在其下拉框中选择适当的控制器,即可使用模块控制器轻松地在这些多个测试用例之间切换。这为快速轻松地运行许多替代测试计划提供了便利。
片段名称由控制器名称及其所有父名称组成。例如:
Test Plan / Protocol: JDBC / Control / Interleave Controller (Module1)
模块控制器使用的任何片段都必须具有唯一的名称,因为该名称用于在重新加载测试计划时查找目标控制器。出于这个原因,最好确保控制器名称从默认值更改 - 如上面的示例所示 - 否则在将新元素添加到测试计划时可能会意外创建重复项。
包含控制器¶
包含控制器旨在使用外部 JMX 文件。要使用它,请在测试计划下创建一个测试片段,并在其下方添加任何所需的采样器、控制器等。然后保存测试计划。该文件现在可以作为其他测试计划的一部分包含在内。
为方便起见,也可以在外部 JMX 文件中添加线程组以进行调试。模块控制器可用于引用测试片段。在包含过程中 线程组将被忽略。
如果测试使用 Cookie 管理器或用户定义的变量,这些应该放在顶层测试计划中,而不是包含的文件中,否则不能保证它们工作。
但是,如果定义了属性includecontroller.prefix,则内容将用作路径名的前缀。
如果在prefix + Filename 给定的位置找不到文件,则控制器尝试打开相对于 JMX 启动目录 的Filename 。
事务控制器¶
事务控制器生成一个额外的样本,该样本测量执行嵌套测试元素所花费的总时间。
有两种操作模式:
- 在嵌套样本之后添加额外的样本
- 添加附加样本作为嵌套样本的父级
生成的采样时间包括嵌套采样器的所有时间,不包括默认情况下(自 2.11 起)定时器和前置/后置处理器的处理时间,除非选中复选框“在生成的样本中包含定时器和前置后置处理器的持续时间”。根据时钟分辨率,它可能比单个采样器加上定时器的总和稍长。时钟可能会在控制器记录开始时间之后但在第一个样本开始之前滴答作响。最后也一样。
生成的样本只有在其所有子样本都成功时才被认为是成功的。
在父模式下,仍然可以在 Tree View Listener 中看到各个样本,但在其他 Listener 中不再显示为单独的条目。此外,子样本不会出现在 CSV 日志文件中,但可以保存到 XML 文件中。
参数 ¶
录音控制器¶
Recording Controller 是一个占位符,指示代理服务器应将样本记录到何处。在测试运行期间,它没有任何效果,类似于简单控制器。但是在使用HTTP(S) Test Script Recorder进行录制时,所有录制的样本将默认保存在录制控制器下。
临界区控制器¶
临界区控制器确保其子元素(采样器/控制器等)将仅由一个线程执行,因为在执行控制器的子元素之前将获取命名锁。
下图显示了一个使用临界区控制器的例子,下图中的 2 个临界区控制器确保:
- DS2-${__threadNum}一次只能由一个线程执行
- DS4-${__threadNum}一次只能由一个线程执行
18.3 监听器¶
大多数侦听器除了“侦听”测试结果外,还执行多种角色。它们还提供查看、保存和读取已保存测试结果的方法。
请注意,侦听器是在找到它们的范围的末尾处理的。
测试结果的保存和读取是通用的。各种侦听器都有一个面板,可以指定将结果写入(或从中读取)的文件。默认情况下,结果存储为 XML 文件,通常带有“ .jtl ”扩展名。存储为 CSV 是最有效的选项,但不如 XML(另一个可用选项)详细。
侦听器不会在 CLI 模式下处理示例数据,但如果配置了输出文件,则会保存原始数据。 为了分析 CLI 运行生成的数据,您需要将文件加载到适当的侦听器中。
如果要在加载新文件之前清除任何当前数据,请在加载文件之前使用菜单项
或 。结果可以从 XML 或 CSV 格式文件中读取。从 CSV 结果文件中读取时,标题(如果存在)用于确定存在哪些字段。 为了正确解释无标题的 CSV 文件,必须在jmeter.properties中设置适当的属性。
如果有很多样本,侦听器可以使用大量内存。 大多数听众目前在他们的范围内保留每个样本的副本,除了:
- 简单数据写入器
- BeanShell/JSR223 监听器
- 邮件可视化器
- 总结报告
以下侦听器不再需要保留每个样本的副本。相反,具有相同经过时间的样本会被聚合。现在需要更少的内存,特别是如果大多数样本最多只需要一两秒钟。
- 汇总报告
- 聚合图
要最小化所需的内存量,请使用简单数据写入器,并使用 CSV 格式。
有关设置要保存的默认项目的完整详细信息,请参阅侦听器默认配置文档。有关输出文件内容的详细信息,请参阅CSV 日志格式或XML 日志格式。
下图显示了结果文件配置面板的示例
参数
示例结果保存配置¶
通过使用如下所示的配置弹出窗口,可以配置侦听器以将不同的项目保存到结果日志文件 (JTL)。默认值的定义如侦听器默认配置文档中所述。名称后带有(CSV)的项目仅适用于 CSV 格式;带有 ( XML ) 的项目仅适用于 XML 格式。CSV 格式目前不能用于保存任何包含换行符的项目。
请注意,cookie、方法和查询字符串保存为“采样器数据”选项的一部分。
图表结果¶
Graph Results 侦听器生成一个简单的图形,绘制所有采样时间。沿着图表底部,当前样本(黑色)、所有样本的当前平均值(蓝色)、当前标准偏差(红色)和当前吞吐率(绿色)以毫秒为单位显示。
吞吐量数表示服务器处理的实际请求数/分钟。此计算包括您添加到测试中的任何延迟和 JMeter 自己的内部处理时间。像这样进行计算的好处是这个数字代表了一些真实的东西——你的服务器实际上每分钟处理那么多请求,你可以增加线程数和/或减少延迟来发现你的服务器的最大吞吐量。然而,如果您进行的计算排除了延迟和 JMeter 的处理,则不清楚您可以从该数字中得出什么结论。
下表简要描述了图表上的项目。有关统计术语的精确含义的更多详细信息可以在网络上找到 - 例如维基百科 - 或通过查阅有关统计的书籍。
显示屏底部的各个数字是当前值。“ Latest Sample ”是当前经过的采样时间,在图表上显示为“ Data ”。
图表左上角显示的值是响应时间的第 90个百分位的最大值。
断言结果¶
Assertion Results 可视化工具显示每个样本的标签。它还报告作为测试计划一部分的任何断言的失败。
查看结果树¶
有几种查看响应的方法,可以通过左侧面板底部的下拉框进行选择。
渲染器 | 描述 |
---|---|
CSS/JQuery 测试器 | CSS/JQuery 测试器仅适用于文本响应。它在上面板中显示纯文本。“测试”按钮允许用户将 CSS/JQuery 应用到上面板,结果将显示在下面板中。 CSS/JQuery 表达式引擎可以是 JSoup 或 Jodd,这两种实现的语法略有不同。 例如,将属性href应用于当前 JMeter 函数页面 的 Selector a[class=sectionlink]给出以下输出: Match count: 74 Match[1]=#functions Match[2]=#what_can_do Match[3]=#where Match[4]=#how Match[5]=#function_helper Match[6]=#functions Match[7]=#__regexFunction Match[8]=#__regexFunction_parms Match[9]=#__counter … and so on … |
文档 | 文档视图将显示从各种类型的文档中提取的文本,例如 Microsoft Office(Word、Excel、PowerPoint 97-2003、2007-2010 (openxml)、Apache OpenOffice(writer、calc、impress)、HTML、gzip、jar/ zip文件(内容列表),以及一些关于“多媒体”文件的元数据,如 mp3、mp4、flv 等。支持格式的完整列表可在Apache Tika 格式页面上找到。
如果文档大于 10 MB,则不会显示。要更改此限制,请设置 JMeter 属性document.max_size(单位为字节)或设置为0以移除限制。
|
HTML | HTML 视图尝试将响应呈现为 HTML。呈现的 HTML 可能与在任何 Web 浏览器中获得的视图相比很差;但是,它确实提供了有助于初始结果评估的快速近似值。 不下载图像、样式表等。 |
HTML(下载资源) | 如果选择了HTML(下载资源)视图选项,则渲染器可以下载 HTML 代码引用的图像、样式表等。
|
格式化的 HTML 源代码 | 如果选择了HTML Source formatted view选项,渲染器将显示由Jsoup格式化和清理的 HTML 源代码。
|
JSON | JSON 视图将以树形样式显示响应(也处理嵌入在 JavaScript 中的 JSON)
。 |
JSON路径测试器 | JSON Path Tester 视图将让您测试您的 JSON-PATH 表达式并查看从特定响应中提取的数据。
|
JSON JMESPath 测试器 | JSON JMESPath Tester 视图将让您测试JMESPath表达式并查看从特定响应中提取的数据。
|
正则表达式测试器 | Regexp Tester 视图仅适用于文本响应。它在上面板中显示纯文本。“测试”按钮允许用户将正则表达式应用到上面板,结果将显示在下面板中。 正则表达式引擎与正则表达式提取器中使用的引擎相同。 例如,应用于当前 JMeter 主页 的 RE (JMeter\w*).*给出以下输出: Match count: 26 Match[1][0]=JMeter - Apache JMeter</title> Match[1][1]=JMeter Match[2][0]=JMeter" title="JMeter" border="0"/></a> Match[2][1]=JMeter Match[3][0]=JMeterCommitters">Contributors</a> Match[3][1]=JMeterCommitters … and so on … []中 的第一个数字是匹配号;第二个数字是组。组[0]是与整个 RE 匹配的任何内容。组[1]是与第一个组匹配的任何内容,即( JMeter \w*)在这种情况下。参见图 9b(下)。 |
文本 |
默认文本视图显示响应中包含的所有文本。请注意,这仅在响应内容类型被视为文本时才有效。如果content-type以下列任何一种开头,则认为是二进制,否则认为是文本。
image/ audio/ video/ |
XML | XML 视图将以树形样式显示响应。任何 DTD 节点或 Prolog 节点都不会出现在树中;但是,响应可能包含这些节点。您可以右键单击任何节点并展开或折叠其下方的所有节点。
|
XPath 测试器 | XPath 测试器仅适用于文本响应。它在上面板中显示纯文本。“测试”按钮允许用户将 XPath 查询应用到上面板,结果将显示在下面板中。 |
边界提取器测试仪 | 边界提取器测试器仅适用于文本响应。它在上面板中显示纯文本。“测试”按钮允许用户将边界提取器查询应用到上面板,结果将显示在下面板中。 |
自动滚动?选项允许在树选择中显示最后一个节点
使用搜索选项,大多数视图还允许搜索显示的数据;搜索结果将在上面的显示中突出显示。例如,下面的控制面板屏幕截图显示了搜索“ Java ”的一个结果。请注意,搜索对可见文本进行操作,因此在搜索 Text 和 HTML 视图时可能会得到不同的结果。
注意:正则表达式使用 Java 引擎(不是 ORO 引擎,如正则表达式提取器或正则表达式测试器视图)。
如果没有提供内容类型,则内容将不会显示在任何响应数据面板中。在这种情况下,您可以使用将响应保存到文件来保存数据。请注意,响应数据在示例结果中仍然可用,因此仍然可以使用后处理器访问。
如果响应数据大于 200K,则不会显示。要更改此限制,请设置 JMeter 属性view.results.tree.max_size。您还可以使用 Save Responses to a file将整个响应保存到文件中。
可以创建其他渲染器。该类必须实现接口org.apache.jmeter.visualizers.ResultRenderer 和/或扩展抽象类org.apache.jmeter.visualizers.SamplerResultTab,并且编译后的代码必须对 JMeter 可用(例如,通过将其添加到lib/ ext目录)。
控制面板(上图)显示了一个 HTML 显示示例。
图 9(下)显示了一个 XML 显示示例。
图 9a(下)显示了 Regexp 测试器显示的示例。
图 9b(下)显示了文档显示的示例。
汇总报告¶
吞吐量是从采样器目标的角度计算的(例如,在 HTTP 样本的情况下是远程服务器)。JMeter 会考虑生成请求的总时间。如果其他采样器和定时器在同一个线程中,它们会增加总时间,从而降低吞吐量值。因此,两个具有不同名称的相同采样器的吞吐量将是两个具有相同名称的采样器的一半。正确选择采样器名称对于从聚合报告中获得最佳结果非常重要。
计算中位数和 90 % 线(第 90个 百分位数)值需要额外的内存。JMeter 现在将具有相同经过时间的样本组合在一起,因此使用的内存更少。但是,对于耗时超过几秒的样本,有可能更少的样本具有相同的时间,在这种情况下将需要更多的内存。请注意,之后您可以使用此侦听器重新加载 CSV 或 XML 结果文件,这是避免性能影响的推荐方法。有关不存储单个样本并因此需要恒定内存的类似侦听器, 请参阅摘要报告。
- 标签- 样本的标签。如果选择了“在标签中包含组名? ”,则添加线程组的名称作为前缀。这允许在需要时单独整理来自不同线程组的相同标签。
- # Samples - 具有相同标签的样本数
- 平均- 一组结果的平均时间
- 中位数-中位数是一组结果中间的时间。50% 的样本不超过这个时间;其余的时间至少一样长。
- 90% 线- 90% 的样本不超过这个时间。剩下的样本至少需要这个时间。(第 90个 百分位)
- 95% 线- 95% 的样本不超过这个时间。剩下的样本至少需要这个时间。(第 95个 百分位)
- 99% 线- 99% 的样本不超过这个时间。剩下的样本至少需要这个时间。(第 99个 百分位)
- Min - 相同标签样本的最短时间
- Max - 具有相同标签的样本的最长时间
- 错误 % - 有错误的请求的百分比
- 吞吐量-吞吐量以每秒/分钟/小时的请求数来衡量。选择时间单位以使显示的速率至少为 1.0。将吞吐量保存到 CSV 文件时,以请求/秒表示,即 30.0 请求/分钟保存为 0.5。
- Received KB/sec - 以每秒接收千字节为单位测量的吞吐量
- Sent KB/sec - 以每秒发送千字节为单位测量的吞吐量
时间以毫秒为单位。
下图显示了选择“包括组名”复选框的示例。
在表中查看结果¶
默认情况下,它只显示主(父)样本;它不显示子样本(子样本)。JMeter 有一个“子样本? ”复选框。如果选择此选项,则显示子样本而不是主样本。
简单数据写入器¶
聚合图¶
下图显示了绘制此图的设置示例。
参数 ¶
- 要显示的列:选择要在图表中显示的列。
- 矩形颜色:单击右侧颜色矩形打开一个弹出对话框,为列选择自定义颜色。
- 前景色允许更改值文本颜色。
- 值字体:允许为文本定义字体设置。
- 画轮廓吧?在条形图上绘制或不绘制边界线
- 显示号码分组?在 Y 轴标签中显示或不显示数字分组。
- 价值标签垂直?更改值标签的方向。(默认为水平)
-
列标签选择:按结果标签过滤。可以使用正则表达式,例如:.*Transaction.*
在显示图表之前,单击Apply filter按钮以刷新内部数据。
响应时间图¶
下图显示了绘制此图的设置示例。
参数 ¶
邮件可视化器¶
如果测试运行从服务器接收到太多失败的响应,可以设置邮件可视化器发送电子邮件。
参数 ¶
BeanShell 监听器¶
BeanShell 侦听器允许使用 BeanShell 处理样本以进行保存等。
有关使用 BeanShell 的完整详细信息,请参阅BeanShell 网站。
测试元素支持ThreadListener和TestListener方法。这些应该在初始化文件中定义。有关示例定义,请参见文件BeanShellListeners.bshrc。
参数 ¶
- 参数
- 包含作为单个变量的参数的字符串
- bsh.args
- 包含参数的字符串数组,在空白处拆分
在调用脚本之前,在 BeanShell 解释器中设置了一些变量:
- log - ( Logger ) - 可用于写入日志文件
- ctx - ( JMeterContext ) - 提供对上下文的访问
-
vars - ( JMeterVariables ) - 提供对变量的读/写访问权限:
vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object());
- props - (JMeterProperties - 类java.util.Properties ) - 例如props.get("START.HMS"); props.put("PROP1","1234");
- sampleResult , prev - ( SampleResult ) - 提供对前一个SampleResult的访问权限
- sampleEvent ( SampleEvent ) 提供对当前示例事件的访问权限
有关上述每个变量可用的所有方法的详细信息,请查看 Javadoc
如果定义了属性beanshell.listener.init,这将用于加载初始化文件,该文件可用于定义用于 BeanShell 脚本的方法等。
总结报告¶
吞吐量是从采样器目标的角度计算的(例如,在 HTTP 样本的情况下是远程服务器)。JMeter 会考虑生成请求的总时间。如果其他采样器和定时器在同一个线程中,它们会增加总时间,从而降低吞吐量值。因此,两个具有不同名称的相同采样器的吞吐量将是两个具有相同名称的采样器的一半。正确选择采样器标签以从报告中获得最佳结果非常重要。
- 标签- 样本的标签。如果选择了“在标签中包含组名? ”,则添加线程组的名称作为前缀。这允许在需要时单独整理来自不同线程组的相同标签。
- # Samples - 具有相同标签的样本数
- 平均- 一组结果的平均经过时间
- Min - 具有相同标签的样本的最短经过时间
- Max - 具有相同标签的样本的最长经过时间
- 标准。开发。-样本经过时间的标准偏差
- 错误 % - 有错误的请求的百分比
- 吞吐量-吞吐量以每秒/分钟/小时的请求数来衡量。选择时间单位以使显示的速率至少为1.0。将吞吐量保存到 CSV 文件时,以请求/秒表示,即 30.0 请求/分钟保存为0.5。
- Received KB/sec - 以每秒千字节为单位测量的吞吐量
- Sent KB/sec - 以每秒千字节为单位测量的吞吐量
- 平均 字节- 样本响应的平均大小(以字节为单位)。
时间以毫秒为单位。
下图显示了选择“包括组名”复选框的示例。
将响应保存到文件¶
此测试元素可以放置在测试计划中的任何位置。对于其范围内的每个样本,它将创建一个响应数据文件。其主要用途是创建功能测试,但在响应太大而无法在 View Results Tree Listener 中显示时也很有用。文件名是从指定的前缀加上一个数字创建的(除非它被禁用,见下文)。文件扩展名是根据文档类型创建的(如果已知)。如果未知,则文件扩展名设置为“未知”'。如果禁用编号并且禁用添加后缀,则将文件前缀作为整个文件名。如果需要,这允许生成一个固定的文件名。生成的文件名存储在示例响应中,如果需要,可以保存在测试日志输出文件中。
当前样本首先被保存,然后是任何子样本(子样本)。如果提供了变量名,则文件名将按照子样本出现的顺序保存。见下文。
参数 ¶
如果前缀中的父文件夹不存在,JMeter 将创建它们并在失败时停止测试。
JSR223 监听器¶
JSR223 侦听器允许将 JSR223 脚本代码应用于示例结果。
参数 ¶
- 参数
- 包含作为单个变量的参数的字符串
- 参数
- 包含参数的字符串数组,在空白处拆分
在调用脚本之前,会设置一些变量。请注意,这些是 JSR223 变量 - 即它们可以直接在脚本中使用。
- 日志
- ( Logger ) - 可用于写入日志文件
- 标签
- 字符串标签
- 文件名
- 脚本文件名(如果有)
- 参数
- 参数(作为字符串)
- 参数
- 参数作为字符串数组(按空格分割)
- ctx
- ( JMeterContext ) - 提供对上下文的访问
- 变量
- ( JMeterVariables ) - 提供对变量的读/写访问权限:
vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object()); vars.getObject("OBJ2");
- 道具
- (JMeterProperties - 类java.util.Properties ) - 例如props.get("START.HMS"); props.put("PROP1","1234");
- 样本结果,上一页
- ( SampleResult ) - 提供对 SampleResult 的访问权限
- 样本事件
- ( SampleEvent ) - 提供对 SampleEvent 的访问权限
- 采样器
- (采样器)- 可以访问最后一个采样器
- 出去
- System.out - 例如OUT.println("message")
有关上述每个变量可用的所有方法的详细信息,请查看 Javadoc
生成汇总结果¶
# Define the following property to automatically start a summariser with that name # (applies to CLI mode only) #summariser.name=summary # # interval between summaries (in seconds) default 3 minutes #summariser.interval=30 # # Write messages to log file #summariser.log=true # # Write messages to System.out #summariser.out=true此元素主要用于批处理 (CLI) 运行。输出如下所示:
label + 16 in 0:00:12 = 1.3/s Avg: 1608 Min: 1163 Max: 2009 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 label + 82 in 0:00:30 = 2.7/s Avg: 1518 Min: 1003 Max: 2020 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 label = 98 in 0:00:42 = 2.3/s Avg: 1533 Min: 1003 Max: 2020 Err: 0 (0.00%) label + 85 in 0:00:30 = 2.8/s Avg: 1505 Min: 1008 Max: 2005 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 label = 183 in 0:01:13 = 2.5/s Avg: 1520 Min: 1003 Max: 2020 Err: 0 (0.00%) label + 79 in 0:00:30 = 2.7/s Avg: 1578 Min: 1089 Max: 2012 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 label = 262 in 0:01:43 = 2.6/s Avg: 1538 Min: 1003 Max: 2020 Err: 0 (0.00%) label + 80 in 0:00:30 = 2.7/s Avg: 1531 Min: 1013 Max: 2014 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 label = 342 in 0:02:12 = 2.6/s Avg: 1536 Min: 1003 Max: 2020 Err: 0 (0.00%) label + 83 in 0:00:31 = 2.7/s Avg: 1512 Min: 1003 Max: 1982 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 label = 425 in 0:02:43 = 2.6/s Avg: 1531 Min: 1003 Max: 2020 Err: 0 (0.00%) label + 83 in 0:00:29 = 2.8/s Avg: 1487 Min: 1023 Max: 2013 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 label = 508 in 0:03:12 = 2.6/s Avg: 1524 Min: 1003 Max: 2020 Err: 0 (0.00%) label + 78 in 0:00:30 = 2.6/s Avg: 1594 Min: 1013 Max: 2016 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 label = 586 in 0:03:43 = 2.6/s Avg: 1533 Min: 1003 Max: 2020 Err: 0 (0.00%) label + 80 in 0:00:30 = 2.7/s Avg: 1516 Min: 1013 Max: 2005 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 label = 666 in 0:04:12 = 2.6/s Avg: 1531 Min: 1003 Max: 2020 Err: 0 (0.00%) label + 86 in 0:00:30 = 2.9/s Avg: 1449 Min: 1004 Max: 2017 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 label = 752 in 0:04:43 = 2.7/s Avg: 1522 Min: 1003 Max: 2020 Err: 0 (0.00%) label + 65 in 0:00:24 = 2.7/s Avg: 1579 Min: 1007 Max: 2003 Err: 0 (0.00%) Active: 0 Started: 5 Finished: 5 label = 817 in 0:05:07 = 2.7/s Avg: 1526 Min: 1003 Max: 2020 Err: 0 (0.00%)“标签”是元素的名称。“ +”表示这条线是一条增量线,即显示自上次输出以来的变化。
“ =”表示该行为合计行,即显示累计。
JMeter 日志文件中的条目还包括时间戳。示例“ 817 in 0:05:07 = 2.7/s ”表示在 5 分 7 秒内记录了 817 个样本,计算结果为每秒 2.7 个样本。Avg(平均)、
Min (最小)和Max(最大)时间以毫秒为单位。 “ Err ” 表示错误数(也显示为百分比)。
最后两行将出现在测试结束时。它们不会同步到适当的时间边界。请注意,初始和最终增量可能小于间隔(在上面的示例中为 30 秒)。第一个增量通常会较低,因为 JMeter 会同步到区间边界。最后一个增量会更低,因为测试通常不会在精确的区间边界上完成。
标签用于将样本结果分组在一起。因此,如果您有多个线程组并希望对它们进行汇总,请使用相同的标签 - 或将汇总器添加到测试计划(因此所有线程组都在范围内)。通过使用合适的标签并将汇总器添加到测试计划的适当部分,可以实现不同的汇总分组。
这不是错误,而是允许跨线程组进行汇总的设计选择。
后端监听器¶
参数 ¶
以下参数适用于GraphiteBackendListenerClient实现:
参数 ¶
有关更多详细信息,另请参阅实时结果。
从 JMeter 3.2 开始,一个允许直接在 InfluxDB 中使用自定义模式编写的实现。它被称为InfluxdbBackendListenerClient。以下参数适用于 InfluxdbBackendListenerClient实现:
参数 ¶
有关更多详细信息,另请参阅Grafana 中的实时结果和Influxdb 注释。还有一个关于为 InfluxDB v2 配置监听器的小节。
从 JMeter 5.4 开始,将所有示例结果写入 InfluxDB 的实现。它被称为InfluxDBRawBackendListenerClient。值得注意的是, 由于数据和个人写入的增加,JMeter 和 InfluxDB 都将使用比InfluxdbBackendListenerClient更多的资源。以下参数适用于 InfluxDBRawBackendListenerClient 实现:
参数 ¶
18.4 配置元素¶
配置元素可用于设置默认值和变量以供采样器稍后使用。请注意,这些元素是在找到它们的范围的开始处处理的,即在同一范围内的任何采样器之前。
CSV 数据集配置¶
CSV Data Set Config 用于从文件中读取行,并将它们拆分为变量。它比__CSVRead()和__StringFromFile()函数更易于使用。它非常适合处理大量变量,并且对于使用“随机”和唯一值进行测试也很有用。
在运行时生成唯一的随机值在 CPU 和内存方面是昂贵的,因此只需在测试之前创建数据。如有必要,文件中的“随机”数据可以与运行时参数一起使用,以从每次运行中创建不同的值集 - 例如使用连接 - 这比在运行时生成所有内容要便宜得多。
JMeter 允许引用值;这允许值包含分隔符。如果启用了“允许引用数据”,则可以将值括在双引号中。这些被删除。要在带引号的字段中包含双引号,请使用两个双引号。例如:
1,"2,3","4""5" => 1 2,3 4"5
JMeter 支持 CSV 文件,该文件具有定义列名的标题行。要启用此功能,请将“变量名称”字段留空。必须提供正确的分隔符。
JMeter 支持带有包含换行符的引用数据的 CSV 文件。
默认情况下,文件只打开一次,每个线程将使用文件中不同的行。但是,将行传递给线程的顺序取决于它们的执行顺序,这可能在迭代之间有所不同。在每次测试迭代开始时读取行。文件名和模式在第一次迭代中被解析。
有关其他选项,请参阅下面的共享模式说明。如果您希望每个线程都有自己的一组值,那么您将需要创建一组文件,每个线程一个文件。例如test1.csv , test2.csv , ..., test n .csv。使用文件名 test${__threadNum}.csv并将“共享模式”设置为“当前线程”。
作为一种特殊情况,分隔符字段中的字符串“ \t ”(不带引号)被视为制表符。
当到达文件结尾(EOF)并且 recycle 选项为true时,读取从文件的第一行重新开始。
如果 recycle 选项为false,并且 stopThread 为false ,则当到达文件末尾时,所有变量都设置为<EOF> 。可以通过设置 JMeter 属性csvdataset.eofstring来更改此值。
如果 Recycle 选项为false且 Stop Thread 为true,则到达EOF将导致线程停止。
参数 ¶
- 所有线程-(默认)文件在所有线程之间共享。
- 当前线程组- 每个文件为元素出现的每个线程组打开一次
- 当前线程- 为每个线程单独打开每个文件
- 标识符- 共享相同标识符的所有线程共享同一个文件。因此,例如,如果您有 4 个线程组,您可以为两个或更多组使用一个公共 ID,以便在它们之间共享文件。或者您可以使用线程号在不同线程组中的相同线程号之间共享文件。
DNS缓存管理器¶
当用户从不同的 IP 接收内容时,DNS 缓存管理器元素允许测试在负载平衡器(CDN 等)后面有多个服务器的应用程序。默认情况下,JMeter 使用 JVM DNS 缓存。这就是为什么集群中只有一台服务器接收负载的原因。DNS 缓存管理器在每次迭代中分别为每个线程解析名称,并将解析结果保存到其内部 DNS 缓存,该缓存独立于 JVM 和 OS DNS 缓存。
静态主机的映射可用于模拟/etc/hosts文件之类的内容。这些条目将优先于自定义解析器。如果要使用此映射,则必须启用 使用自定义 DNS 解析器。
假设您有一个测试服务器,您想使用一个名称访问该服务器,但该名称尚未(尚未)设置在您的 DNS 服务器中。对于我们的示例,这将是www.example.com作为服务器名称,您希望通过服务器a123.another.example.org的 IP 访问该名称。
您可以更改您的工作站并向您的/etc/hosts文件添加一个条目 - 或您的操作系统的等效文件,或者向 DNS 缓存管理器的静态主机表添加一个条目。
您可以在第一列 ( Host ) 中输入www.example.com ,在第二列 ( Hostname or IP address ) 中输入 a123.another.example.org。正如第二列的名称所暗示的那样,您甚至可以在那里使用测试服务器的 IP 地址。
将使用自定义 DNS 解析器查找测试服务器的 IP 地址。如果没有给出,将使用系统 DNS 解析器。
现在您可以在您的 HTTPClient4 采样器中使用www.example.com,并且将针对 a123.another.example.org 发出请求,并将所有标头设置为www.example.com。
参数 ¶
HTTP 授权管理器¶
授权管理器允许您为使用服务器身份验证限制的网页指定一个或多个用户登录。当您使用浏览器访问受限页面时,您会看到这种类型的身份验证,并且您的浏览器会显示一个登录对话框。JMeter 在遇到此类页面时会传输登录信息。
授权标头可能不会显示在树视图侦听器“请求”选项卡中。Java 实现会进行抢先式身份验证,但在 JMeter 获取标头时它不会返回 Authorization 标头。自 3.2 起,HttpComponents (HC 4.5.X) 实现默认为抢占式,并且将显示标头。要禁用此功能,请按以下方式设置值,在这种情况下,将仅在响应质询时执行身份验证。
在文件jmeter.properties 中设置httpclient4.auth.preemptive=false
参数 ¶
- 爪哇
- 基本的
- HttpClient 4
- 基本、摘要和Kerberos
Kerberos 配置:
要配置 Kerberos,您需要设置至少两个 JVM 系统属性:
- -Djava.security.krb5.conf=krb5.conf
- -Djava.security.auth.login.config=jaas.conf
您还可以在文件bin/system.properties中配置这两个属性。查看位于 JMeter bin文件夹中的两个示例配置文件( krb5.conf和jaas.conf )以获取更多文档的参考,并调整它们以匹配您的 Kerberos 配置。
SPNEGO 默认禁用凭证委派。如果要启用它,可以通过将属性kerberos.spnego.delegate_cred设置为true来实现。
为 Kerberos SPNEGO 身份验证生成 SPN 时,IE 和 Firefox 将省略 URL 中的端口号。如果端口号与标准端口号(80和443 )不同, Chrome 有一个选项(--enable-auth-negotiate-port )来包含端口号。可以通过设置以下 JMeter 属性来模拟该行为,如下所示。
在jmeter.properties或user.properties中,设置:
- kerberos.spnego.strip_port=false
控制:
- 添加按钮 - 将条目添加到授权表。
- 删除按钮 - 删除当前选定的表格条目。
- 加载按钮 - 加载以前保存的授权表并将条目添加到现有授权表条目中。
- 另存为按钮 - 将当前授权表保存到文件中。
下载这个例子。在此示例中,我们在本地服务器上创建了一个测试计划,该计划发送三个 HTTP 请求,其中两个需要登录,另一个对所有人开放。请参见图 10,了解我们的测试计划的构成。在我们的服务器上,我们有一个名为“ secret ”的受限目录,其中包含两个文件,“ index.html ”和“ index2.html ”。我们创建了一个名为“ kevin ”的登录 ID,其密码为“ spot ”。因此,在我们的授权管理器中,我们为受限目录以及用户名和密码创建了一个条目(参见图 11)。名为“ SecretPage1 ”和“ SecretPage2 ”的两个 HTTP 请求/secret/index.html ”和“ /secret/index2.html ”。另一个名为“ NoSecretPage ”的HTTP请求向“ /index.html ”发出请求。
当我们运行测试计划时,JMeter 在授权表中查找它所请求的 URL。如果 Base URL 与 URL 匹配,则 JMeter 将此信息与请求一起传递。
HTTP缓存管理器¶
HTTP 缓存管理器用于在其范围内为 HTTP 请求添加缓存功能,以模拟浏览器缓存功能。每个虚拟用户线程都有自己的缓存。默认情况下,缓存管理器将使用 LRU 算法在每个虚拟用户线程的缓存中存储多达 5000 个项目。使用属性“ maxSize ”来修改这个值。请注意,该值增加得越多,HTTP 缓存管理器消耗的内存就越多,因此请务必相应地调整-Xmx JVM 选项。
如果样本成功(即具有响应代码2xx),则为 URL 保存Last-Modified和Etag(以及Expired ,如果相关)值。在执行下一个示例之前,采样器会检查缓存中是否有条目,如果有,则为请求设置If-Last-Modified和If-None-Match条件标头。
此外,如果选择了“使用 Cache-Control/Expires 标头”选项,则会根据当前时间检查Cache-Control / Expires值。如果请求是GET请求,并且时间戳在将来,则采样器立即返回,而不向远程服务器请求 URL。这是为了模拟浏览器的行为。请注意,如果Cache-Control标头为“ no-cache ”,则响应将存储在缓存中作为预过期,因此将生成条件GET请求。如果Cache-Control有任何其他值,“ max-age" expiry 选项被处理以计算条目的生命周期,如果缺少则将使用 expire 标头,如果还缺少条目,将按照RFC 2616 第 13.2.4 节中的指定使用Last-Modified时间和响应日期进行缓存。
参数 ¶
HTTP Cookie 管理器¶
Cookie Manager 元素有两个功能:
首先,它像 Web 浏览器一样存储和发送 cookie。如果您有一个 HTTP 请求并且响应包含一个 cookie,则 Cookie 管理器会自动存储该 cookie 并将其用于该特定网站的所有未来请求。每个 JMeter 线程都有自己的“cookie 存储区”。因此,如果您正在测试一个使用 cookie 存储会话信息的网站,则每个 JMeter 线程都会有自己的会话。请注意,此类 cookie 不会出现在 Cookie 管理器显示屏上,但可以使用查看结果树侦听器查看。
JMeter 检查接收到的 cookie 对于 URL 是否有效。这意味着不存储跨域 cookie。如果您有错误行为或希望使用跨域 cookie,请定义 JMeter 属性“ CookieManager.check.cookies=false ”。
接收到的 Cookie 可以存储为 JMeter 线程变量。要将 cookie 保存为变量,请定义属性“ CookieManager.save.cookies=true ”。此外,cookie 名称在存储之前以“ COOKIE_ ”为前缀(这避免了局部变量的意外损坏)要恢复到原始行为,请定义属性“ CookieManager.name.prefix= ”(一个或多个空格)。如果启用,名称为TEST的 cookie 的值可以称为${COOKIE_TEST}。
其次,您可以手动将 cookie 添加到 Cookie 管理器。但是,如果您这样做,cookie 将由所有 JMeter 线程共享。
请注意,此类 Cookie 的过期时间是在很远的将来创建的
默认情况下会忽略具有空值的 Cookie 。这可以通过设置 JMeter 属性来更改:CookieManager.delete_null_cookies=false。请注意,这也适用于手动定义的 cookie - 任何此类 cookie 将在更新时从显示中删除。另请注意,cookie 名称必须是唯一的 - 如果使用相同名称定义了第二个 cookie,它将替换第一个。
参数 ¶
[注意:如果您有一个网站要使用 IPv6 地址进行测试,请选择HC4CookieHandler (IPv6 compliant)]
“域”是服务器的主机名(没有http://);该端口当前被忽略。
HTTP 请求默认值¶
此元素允许您设置 HTTP 请求控制器使用的默认值。例如,如果您正在创建一个包含 25 个 HTTP 请求控制器的测试计划,并且所有请求都发送到同一台服务器,您可以添加一个 HTTP 请求默认值元素,并填写“服务器名称或 IP ”字段。然后,当您添加 25 个 HTTP 请求控制器时,将“服务器名称或 IP ”字段留空。控制器将从 HTTP 请求默认值元素继承此字段值。
参数 ¶
HTTP 头管理器¶
标头管理器允许您添加或覆盖 HTTP 请求标头。
JMeter 现在支持多个 Header Managers。合并标题条目以形成采样器的列表。如果要合并的条目与现有标题名称匹配,则它将替换先前的条目。这允许您设置一组默认标题,并将调整应用于特定的采样器。请注意,标头的空值不会删除现有标头,它只是替换其值。
参数 ¶
JDBC 连接配置¶
参数 ¶
如果您真的想使用共享池(为什么?),请将最大计数设置为与线程数相同,以确保线程不会相互等待。
验证查询列表可以使用jdbc.config.check.query属性进行配置,默认情况下为:
- 数据库
- 从 INFORMATION_SCHEMA.SYSTEM_USERS 中选择 1
- 甲骨文
- 从双选1
- DB2
- 从 sysibm.sysdummy1 中选择 1
- MySQL 或 MariaDB
- 选择 1
- Microsoft SQL Server(MS JDBC 驱动程序)
- 选择 1
- PostgreSQL
- 选择 1
- 安格尔
- 选择 1
- 德比
- 值 1
- H2
- 选择 1
- 火鸟
- 从 rdb$database 中选择 1
- Exasol
- 选择 1
预配置的 jdbc 驱动程序类列表可以使用jdbc.config.jdbc.driver.class属性进行配置,默认情况下为:
- 数据库
- org.hsqldb.jdbc.JDBCDriver
- 甲骨文
- oracle.jdbc.OracleDriver
- DB2
- com.ibm.db2.jcc.DB2Driver
- MySQL
- com.mysql.jdbc.Driver
- Microsoft SQL Server(MS JDBC 驱动程序)
- com.microsoft.sqlserver.jdbc.SQLServerDriver 或 com.microsoft.jdbc.sqlserver.SQLServerDriver
- PostgreSQL
- org.postgresql.Driver
- 安格尔
- com.ingres.jdbc.IngresDriver
- 德比
- org.apache.derby.jdbc.ClientDriver
- H2
- org.h2.Driver
- 火鸟
- org.firebirdsql.jdbc.FBDriver
- Apache 德比
- org.apache.derby.jdbc.ClientDriver
- 玛丽亚数据库
- org.mariadb.jdbc.Driver
- SQLite
- org.sqlite.JDBC
- 赛贝斯 AES
- net.sourceforge.jtds.jdbc.Driver
- Exasol
- com.exasol.jdbc.EXADriver
不同的数据库和 JDBC 驱动程序需要不同的 JDBC 设置。Database URL 和 JDBC Driver 类由 JDBC 实现的提供者定义。
一些可能的设置如下所示。请查看 JDBC 驱动程序文档中的确切详细信息。
如果 JMeter 报告没有合适的驱动程序,那么这可能意味着:
- 找不到驱动程序类。在这种情况下,会有一条日志消息,例如DataSourceElement: Could not load driver: {classname} java.lang.ClassNotFoundException: {classname}
- 已找到驱动程序类,但该类不支持连接字符串。这可能是因为连接字符串中的语法错误,或者因为使用了错误的类名。
如果数据库服务器未运行或不可访问,则 JMeter 将报告java.net.ConnectException。
下面给出了数据库及其参数的一些示例。
- MySQL
-
- 驱动类
- com.mysql.jdbc.Driver
- 数据库网址
- jdbc:mysql://host[:port]/dbname
- PostgreSQL
-
- 驱动类
- org.postgresql.Driver
- 数据库网址
- jdbc:postgresql:{dbname}
- 甲骨文
-
- 驱动类
- oracle.jdbc.OracleDriver
- 数据库网址
- jdbc:oracle:thin:@//host:port/service OR jdbc:oracle:thin:@(description=(address=(host={mc-name})(protocol=tcp)(port={port-no} ))(connect_data=(sid={sid})))
- 入口 (2006)
-
- 驱动类
- ingres.jdbc.IngresDriver
- 数据库网址
- jdbc:ingres://host:port/db[;attr=value]
- Microsoft SQL Server(MS JDBC 驱动程序)
-
- 驱动类
- com.microsoft.sqlserver.jdbc.SQLServerDriver
- 数据库网址
- jdbc:sqlserver://host:port;DatabaseName=dbname
- Apache 德比
-
- 驱动类
- org.apache.derby.jdbc.ClientDriver
- 数据库网址
- jdbc:derby://server[:port]/databaseName[;URLAttributes=value[;…]]
- 玛丽亚数据库
-
- 驱动类
- org.mariadb.jdbc.Driver
- 数据库网址
- jdbc:mariadb://host[:port]/dbname[;URLAttributes=value[;…]]
- Exasol(另请参阅JDBC 驱动程序文档)
-
- 驱动类
- com.exasol.jdbc.EXADriver
- 数据库网址
- jdbc:exa:host[:port][;schema=SCHEMA_NAME][;prop_x=value_x]
密钥库配置¶
Keystore Config Element 允许您配置 Keystore 将如何加载以及它将使用哪些密钥。此组件通常用于 HTTPS 场景中,您不想在响应时间中考虑密钥库初始化。
要使用此元素,您需要首先使用要测试的客户端证书设置 Java 密钥库,以执行此操作:
- 使用 Java keytool实用程序或通过 PKI创建证书
- 如果由 PKI 创建,请将您的密钥转换为 JKS 可接受的格式,从而将您的密钥导入 Java Key Store
- 然后通过两个 JVM 属性引用 keystore 文件(或者在system.properties中添加):
- -Djavax.net.ssl.keyStore=path_to_keystore
- -Djavax.net.ssl.keyStorePassword=password_of_keystore
要将 PKCS11 用作存储的源,您需要将javax.net.ssl.keyStoreType设置为PKCS11 并将javax.net.ssl.keyStore设置为NONE。
参数 ¶
- https.use.cached.ssl.context=false在jmeter.properties或user.properties中设置
- 您对 HTTP 请求使用 HTTPClient 4 实现
TCP 采样器配置¶
TCP 采样器配置为 TCP 采样器提供默认数据
参数 ¶
用户定义变量¶
用户定义变量元素允许您定义一组初始变量,就像在测试计划中一样。
UDV 不应与每次调用时生成不同结果的函数一起使用。只有第一个函数调用的结果会保存在变量中。 但是,UDV 可以与__P()等函数一起使用,例如:
HOST ${__P(host,localhost)}
它将定义变量“ HOST ”以具有 JMeter 属性“ host ”的值,如果未定义 ,则默认为“ localhost ”。
如需在测试运行期间定义变量,请参阅用户参数。UDV 按照它们在计划中出现的顺序从上到下进行处理。
为简单起见,建议仅将 UDV 放置在线程组的开头(或者可能在测试计划本身下)。
处理完测试计划和所有 UDV 后,将生成的变量集复制到每个线程以提供初始变量集。
如果运行时元素(例如用户参数预处理器或正则表达式提取器)定义了一个与 UDV 变量之一同名的变量,那么这将替换初始值,并且线程中的所有其他测试元素将看到更新的价值。
参数 ¶
随机变量¶
随机变量配置元素用于生成随机数字字符串并将它们存储在变量中以备后用。它比使用用户定义的变量和__Random()函数更简单。
使用随机数生成器构造输出变量,然后使用格式字符串对结果数进行格式化。该数字使用公式minimum+Random.nextInt(maximum-minimum+1)计算。 Random.nextInt()需要一个正整数。这意味着最大值 - 最小值- 即范围 - 必须小于2147483647,但是只要范围可以,最小值和最大值可以是任何长值。
参数 ¶
计数器¶
允许用户创建一个可以在线程组中的任何位置引用的计数器。计数器配置允许用户配置起点、最大值和增量。计数器将从开始循环到最大值,然后从开始重新开始,继续这样直到测试结束。
计数器使用 long 来存储值,因此范围从-2^63到2^63-1。
参数 ¶
简单配置元素¶
Simple Config Element 允许您在采样器中添加或覆盖任意值。您可以选择值的名称和值本身。尽管一些喜欢冒险的用户可能会发现此元素的用途,但它主要是为开发人员提供的,作为他们在开发新 JMeter 组件时可以使用的基本 GUI。
参数 ¶
MongoDB 源配置(已弃用)¶
然后,您可以 使用此代码通过元素MongoDBHolder访问 Beanshell 或 JSR223 测试元素中的com.mongodb.DB对象
import com.mongodb.DB; import org.apache.jmeter.protocol.mongodb.config.MongoDBHolder; DB db = MongoDBHolder.getDBFromSource("value of property MongoDB Source", "value of property Database Name"); …
参数 ¶
持续重试的最长时间,默认为 15 秒。
这对于通过阻止操作来避免在服务器暂时关闭时引发一些异常很有用。
平滑过渡到新的主节点也很有用(以便在重试时间内选出新的主节点)。
- 对于副本集,驱动程序将尝试连接到旧的主节点,而不是立即故障转移到新的主节点
- 这不会阻止在套接字上的读/写操作中引发异常,该异常必须由应用程序处理。
仅在建立新连接时使用Socket.connect(java.net.SocketAddress, int)
默认为0,表示无超时。
默认为0,这意味着如果autoConnectRetry 开启,则使用默认的 15 秒。
默认值为120,000。
默认为0,表示无超时。
默认为false。
所有其他线程将立即获得异常。
例如,如果connectionsPerHost是10并且threadsAllowedToBlockForConnectionMultiplier是5,那么最多 50 个线程可以等待连接。
默认值为5。
如果指定了w、wtimeout、fsync或j,则忽略此设置。
默认为false。
18.5 断言¶
断言用于对采样器执行额外的检查,并 在同一范围内的每个采样器之后处理。为确保断言仅应用于特定采样器,请将其添加为采样器的子级。
断言可以应用于主样本、子样本或两者。默认情况下仅将断言应用于主样本。如果断言支持此选项,那么 GUI 上将有一个条目,如下所示:
或以下如果子采样器失败而主样本成功,则将主样本设置为失败状态并添加断言结果。如果使用 JMeter 变量选项,则假定它与主样本相关,并且任何失败都将仅应用于主样本。
响应断言¶
响应断言控制面板允许您添加要与请求或响应的各个字段进行比较的模式字符串。模式字符串是:
- 包含,匹配:Perl5 风格的正则表达式
- Equals , Substring : 纯文本,区分大小写
可以在ORO Perl5 正则表达式中找到模式匹配字符的摘要。
您还可以选择是否期望字符串与整个响应匹配,或者是否期望响应仅包含模式。您可以将多个断言附加到任何控制器以获得额外的灵活性。
请注意,模式字符串不应包含封闭分隔符,即使用Price: \d+而不是/Price: \d+/。
默认情况下,模式是多行模式,这意味着“ . ”元字符不匹配换行符。在多行模式中,“ ^ ”和“ $ ”匹配字符串中任何位置的任何行的开始或结束 - 而不仅仅是整个字符串的开始和结束。请注意,\s确实匹配换行符。案例也很重要。要覆盖这些设置,可以使用扩展的正则表达式语法。例如:
- (?一世)
- 忽略大小写
- (?s)
- 将目标视为单行,即“ . ”匹配换行符
- (?是)
- 以上两者
- (?i)苹果(?-i)馅饼
- 匹配“ Apple Pie ”,但不匹配“ AppPLe pIe ”
- (?s)Apple.+?Pie
- 匹配Apple后跟Pie,可能在后续行。
- 苹果(?s).+?Pie
- 与上面相同,但在开始时使用(?s)可能更清楚。
参数 ¶
- 仅主要样本- 仅适用于主要样本
- 仅子样本- 仅适用于子样本
- 主样本和子样本- 适用于两者。
- 要使用的 JMeter 变量名称- 断言将应用于命名变量的内容
- 文本响应- 来自服务器的响应文本,即正文,不包括任何 HTTP 标头。
- 请求数据- 发送到服务器的请求文本,即正文,不包括任何 HTTP 标头。
- 响应代码- 例如200
- 响应消息- 例如OK
- 响应标头,包括 Set-Cookie 标头(如果有)
- 请求标头
- 网址抽样
- 文档(文本) - 通过 Apache Tika 从各种类型的文档中提取文本(请参阅查看结果树文档视图部分)。
样本的整体成功是通过将断言的结果与现有的响应状态相结合来确定的。When the Ignore Status checkbox is selected, the Response status is forced to successful before evaluating the Assertion.
状态在4xx和5xx范围内的 HTTP 响应通常被视为不成功。“忽略状态”复选框可用于在执行进一步检查之前将状态设置为成功。请注意,这将具有清除任何先前断言失败的效果,因此请确保仅在第一个断言上设置它。- 包含- 如果文本包含正则表达式模式,则为 true
- Matches - 如果整个文本与正则表达式模式匹配,则为 true
- Equals - 如果整个文本等于模式字符串则为真(区分大小写)
- Substring - 如果文本包含模式字符串,则为 true(区分大小写)
该模式是 Perl5 风格的正则表达式,但没有括号。
尺寸断言¶
Size Assertion 测试每个响应是否包含正确的字节数。您可以指定大小等于、大于、小于或不等于给定的字节数。
参数 ¶
- 仅主样本- 断言仅适用于主样本
- 仅子样本- 断言仅适用于子样本
- 主样本和子样本- 断言适用于两者。
- 要使用的 JMeter 变量名称- 断言将应用于命名变量的内容
BeanShell 断言¶
BeanShell 断言允许用户使用 BeanShell 脚本执行断言检查。
有关使用 BeanShell 的完整详细信息,请参阅BeanShell 网站。
请注意,不同的解释器用于测试脚本中每个线程中断言的每次独立出现,但相同的解释器用于后续调用。这意味着变量在对断言的调用中持续存在。
所有断言都是从与采样器相同的线程调用的。
如果定义了属性“ beanshell.assertion.init ”,它将作为源文件的名称传递给解释器。这可用于定义常用方法和变量。在bin目录中有一个示例 init 文件:BeanShellAssertion.bshrc
测试元素支持ThreadListener和TestListener方法。这些应该在初始化文件中定义。有关示例定义,请参见文件BeanShellListeners.bshrc。
参数 ¶
- 参数- 包含作为单个变量的参数的字符串
- bsh.args - 包含参数的字符串数组,在空白处分割
您可以尝试一个示例脚本。
在调用脚本之前,在 BeanShell 解释器中设置了一些变量。除非另有说明,否则这些都是字符串:
- log -记录器对象。(例如) log.warn("Message"[,Throwable])
- SampleResult , prev - SampleResult对象;读写
- Response - 响应对象;读写
- 失败- 布尔值;读写;用于设置断言状态
- 失败消息- 字符串;读写;用于设置断言消息
- ResponseData - 响应正文(字节 [])
- 响应代码- 例如200
- ResponseMessage - 例如确定
- ResponseHeaders - 包含 HTTP 标头
- RequestHeaders - 包含发送到服务器的 HTTP 标头
- 样品标签
- SamplerData - 发送到服务器的数据
- ctx - JMeterContext
-
vars - JMeterVariables - 例如
vars.get("VAR1"); vars.put("VAR2","value"); vars.putObject("OBJ1",new Object());
-
道具- JMeterProperties(类java.util.Properties) - 例如
props.get("START.HMS"); props.put("PROP1","1234");
Response 对象的以下方法可能有用:
- setStopThread(布尔值)
- setStopTest(布尔值)
- 字符串 getSampleLabel()
- setSampleLabel(字符串)
HTML 断言¶
HTML 断言允许用户使用 JTidy 检查响应数据的 HTML 语法。
参数 ¶
XPath 断言¶
XPath 断言测试文档的格式是否正确,可以选择根据 DTD 进行验证,或者将文档放入 JTidy 并测试 XPath。如果该 XPath 存在,则断言为真。使用“ / ”将匹配任何格式正确的文档,并且是默认的 XPath 表达式。该断言还支持布尔表达式,例如“ count(//*error)=2 ”。有关 XPath 的更多信息,请参见http://www.w3.org/TR/xpath。
一些示例表达式:- //title[text()='Text to match'] - 匹配响应中任意位置的<title>Text to match</title>
- /title[text()='Text to match'] - 匹配响应中根级别的<title>Text to match</title>
参数 ¶
作为 Xalan XPath 解析器(JMeter 所基于的实现)的命名空间限制的解决方法,您需要:
- 提供一个包含命名空间前缀映射
的属性文件(例如,如果您的文件名为namespaces.properties ):
prefix1=http\://foo.apache.org prefix2=http\://toto.apache.org …
- 使用属性
在user.properties文件中引用此文件:
xpath.namespace.config=namespaces.properties
XPath2 断言¶
XPath2 断言测试文档的格式是否正确。使用“ / ”将匹配任何格式正确的文档,并且是默认的 XPath2 表达式。该断言还支持布尔表达式,例如“ count(//*error)=2 ”。
一些示例表达式:- //title[text()='Text to match'] - 匹配响应中任意位置的<title>Text to match</title>
- /title[text()='Text to match'] - 匹配响应中根级别的<title>Text to match</title>
参数 ¶
JSR223 断言¶
JSR223 断言允许使用 JSR223 脚本代码检查上一个示例的状态。
参数 ¶
- 参数- 包含作为单个变量的参数的字符串
- args - 包含参数的字符串数组,在空白处拆分
设置了以下变量以供脚本使用:
- log - ( Logger ) - 可用于写入日志文件
- 标签- 字符串标签
- Filename - 脚本文件名(如果有)
- 参数- 参数(作为字符串)
- args - 作为字符串数组的参数(按空格分割)
- ctx - ( JMeterContext ) - 提供对上下文的访问
-
vars - ( JMeterVariables ) - 提供对变量的读/写访问权限:
vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object()); vars.getObject("OBJ2");
-
道具- (JMeterProperties - 类java.util.Properties) - 例如
props.get("START.HMS"); props.put("PROP1","1234");
- SampleResult , prev - ( SampleResult ) - 可以访问之前的 SampleResult (如果有的话)
- sampler - ( Sampler ) - 提供对当前采样器的访问权限
- OUT - System.out - 例如OUT.println("message")
- AssertionResult - ( AssertionResult ) - 断言结果
该脚本可以检查SampleResult 的各个方面。如果检测到错误,脚本应使用AssertionResult.setFailureMessage("message")和AssertionResult.setFailure(true)。
有关上述每个变量可用的所有方法的更多详细信息,请查看 Javadoc
比较断言¶
参数 ¶
SMIME 断言¶
- bcmail-xxx.jar (BouncyCastle SMIME/CMS)
- bcprov-xxx.jar(BouncyCastle 提供者)
如果使用Mail Reader Sampler,请确保选择“使用 MIME (raw) 存储邮件”,否则断言将无法正确处理邮件。
参数 ¶
JSON 断言¶
该组件允许您执行 JSON 文档的验证。首先,如果数据不是 JSON,它将解析 JSON 并失败。其次,它将使用Jayway JsonPath 1.2.0中的语法搜索指定的路径。如果找不到路径,它将失败。第三,如果在文档中找到 JSON 路径,并且请求对预期值进行验证,它将执行验证。对于空值,GUI 中有一个特殊的复选框。请注意,如果路径将返回数组对象,则会对其进行迭代,如果找到预期值,则断言将成功。要验证空数组,请使用[]细绳。另外,如果 patch 将返回字典对象,它会在比较之前转换为字符串。
参数 ¶
JSON JMESPath 断言¶
该组件允许您使用JMESPath
对 JSON 文档内容执行断言。首先,如果数据不是 JSON,它将解析 JSON 并失败。
其次,它将使用 JMESPath 语法搜索指定的路径。
如果找不到路径,它将失败。
第三,如果在文档中找到 JMES 路径,并且请求对预期值进行验证,它将执行此附加检查。如果要检查是否为 null,请使用Expect null复选框。
请注意,路径不能为空,因为表达式 JMESPath 不会被编译并且会发生错误。即使您期望一个空或空响应,您也必须放置一个有效的 JMESPath 表达式。
参数 ¶
18.6 定时器¶
对 Random 计时器计算的睡眠延迟应用乘法因子,其中浮点数是十进制正数。 JMeter 会将此因子乘以计算出的睡眠延迟。此功能可用于:
定时器仅与采样器一起处理。与采样器不在同一范围内的计时器根本不会被处理。
要将计时器应用于单个采样器,请将计时器添加为采样器的子元素。计时器将在采样器执行之前应用。要在采样器之后应用计时器,请将其添加到下一个采样器,或将其添加为流控制动作采样器的子级。
高斯随机定时器¶
此计时器将每个线程请求暂停一段时间,其中大部分时间间隔发生在特定值附近。总延迟是高斯分布值(平均值为0.0和标准差为1.0)乘以您指定的偏差值和偏移值的总和。另一种解释方式是,在高斯随机定时器中,围绕恒定偏移的变化具有高斯曲线分布。
恒定吞吐量定时器¶
此计时器引入了可变暂停,计算以使总吞吐量(以每分钟的样本数计)尽可能接近给定数字。当然,如果服务器无法处理它,或者如果其他计时器或耗时的测试元素阻止它,吞吐量将会降低。
NB 虽然 Timer 被称为 Constant Throughput 定时器,但吞吐量值不需要是恒定的。它可以根据变量或函数调用来定义,并且可以在测试期间更改值。该值可以通过多种方式更改:
- 使用计数器变量
- 使用__jexl3,__groovy函数来提供变化的值
- 使用远程 BeanShell 服务器更改 JMeter 属性
有关详细信息,请参阅最佳实践。
参数 ¶
- 仅此线程- 每个线程将尝试保持目标吞吐量。总吞吐量将与活动线程的数量成正比。
- 当前线程组中的所有活动线程 - 目标吞吐量在组中的所有活动线程中分配。每个线程将根据需要延迟,基于它上次运行的时间。
- 所有活动线程- 目标吞吐量在所有线程组中的所有活动线程中分配。每个线程将根据需要延迟,基于它上次运行的时间。在这种情况下,每个其他线程组都需要一个具有相同设置的恒定吞吐量计时器。
- 当前线程组中的所有活动线程(共享) - 如上所述,但每个线程都会根据组中任何线程上次运行的时间而延迟。
- 所有活动线程(共享) - 如上所述;每个线程都会根据任何线程上次运行的时间而延迟。
共享和非共享算法都旨在产生所需的吞吐量,并将产生相似的结果。
共享算法应生成更准确的整体交易率。
非共享算法应该在线程之间产生更均匀的事务分布。
精确的吞吐量定时器¶
该计时器引入了可变暂停,计算以使总吞吐量(例如,每分钟的样本数)尽可能接近给定数字。当然,如果服务器无法处理它,或者其他计时器,或者没有足够的线程,或者耗时的测试元素阻止它,吞吐量将会降低。
尽管计时器被称为精确吞吐量计时器,但它的目标并不是在测试期间在一秒的时间间隔内产生完全相同数量的样本。
计时器最适用于 36000 次请求/小时以下的速率,但是您的里程可能会有所不同(如果您的目标大不相同,请参阅下面的监控部分)。
精确吞吐量计时器在测试计划中的最佳位置
您可能知道,计时器由所有兄弟元素及其子元素继承。这就是为什么精确吞吐量计时器的最佳位置之一 是在测试循环的第一个元素下。例如,您可以在开头添加一个虚拟采样器,然后将计时器放在该虚拟采样器下方
制作时间表
精确的吞吐量计时器模型泊松到达时间表。该计划经常发生在现实生活中,因此将其用于负载测试是有意义的。例如,它自然可能会生成靠近在一起的样本,因此它可能会揭示并发问题。即使您设法使用Poisson Random Timer生成泊松到达,它也容易受到下面列出的问题的影响。例如,真正的泊松到达可能有无限长的停顿,这对于负载测试是不切实际的。例如,每秒 1 个速率的“常规”泊松到达可能会在 60 秒长的测试中得到 50 个样本。
恒定吞吐量计时器收敛到指定的速率,但它倾向于以均匀的间隔产生样本。
加速和启动峰值
您可能会使用“加速”或类似方法来避免测试开始时出现尖峰。例如,如果您将Thread Group配置为具有 100 个线程,并将Ramp-up Period设置为0(或较小的数字),那么所有线程将同时启动,并且会产生不必要的负载峰值. 最重要的是,如果您将Ramp-up Period设置得太高,可能会导致一开始可用的线程“太少”,无法达到所需的负载。
Precise Throughput Timer以随机方式调度执行,因此可用于生成恒定负载,建议将 Ramp-up Period和Delay都设置为0。
多个线程组同时启动
当Test Plan包含多个Thread Group时,可能会出现Ramp-up问题的变体。为了缓解这个问题,通常会为每个线程组添加“随机”延迟,以便线程在不同时间启动。
Precise Throughput Timer避免了这个问题,因为它以随机方式安排执行。您不需要添加额外的随机延迟来减轻启动峰值
每小时迭代次数
基本要求之一是每 M 分钟发出 N 个样本。让它每小时迭代 60 次。如果您报告 57 次执行的负载测试结果“仅仅因为随机是随机的”,企业客户将无法理解。为了每小时生成 60 次迭代,您需要进行如下配置(其他参数可以保留其默认值)
- 目标吞吐量(样本):60
- 吞吐周期(秒):3600
- 测试持续时间(秒):3600
前两个选项设置吞吐量。尽管 60/3600、30/1800 和 120/7200 代表完全相同的负载水平,但请选择更能代表业务需求的那个。例如,如果要求测试“每小时 60 个样本”,则设置为 60/3600。如果要求测试“每分钟 1 个样本”,则设置为 1/60。
测试持续时间(秒)在那里,因此计时器可确保给定测试持续时间的准确样本数。Precise Throughput Timer在测试启动时为样本创建一个时间表。例如,如果您希望以每小时 60 次吞吐量执行 5 分钟测试,您可以将测试持续时间(秒)设置为 300。这可以以一种业务友好的方式配置吞吐量。注意:测试持续时间(秒)不限制测试持续时间。这只是对计时器的提示。
线程数和思考时间
常见的陷阱之一是调整线程数量和思考时间,以便最终获得所需的吞吐量。即使它可能有效,但这种方法会导致在测试运行上花费大量时间。当新的应用程序版本到来时,可能需要再次调整线程和延迟。
精确的吞吐量计时器可以设置吞吐量目标并实现它,无论应用程序执行得多么好。为了做到这一点,Precise Throughput Timer 在测试启动时创建一个计划,然后它使用该计划来释放线程。思考时间和线程数量的主要驱动力应该是业务需求,而不是以某种方式匹配吞吐量的愿望。
例如,如果您的应用程序被呼叫中心的支持工程师使用。假设呼叫中心有 2 名工程师,目标吞吐量为每分钟 1 人。假设工程师阅读和审查网页需要 4 分钟。对于这种情况,您应该在组中设置 2 个线程,使用 4 分钟作为思考时间延迟,并在Precise Throughput Timer中指定每分钟 1 个。当然,它会导致大约 2samples/4minutes=0.5 每分钟,并且这样的测试结果意味着“您需要更多的呼叫中心支持工程师”或“您需要减少工程师完成任务所需的时间”。
测试低速率和可重复测试
以低速率(例如每小时 60 次)进行测试需要了解所需的测试配置文件。例如,如果您需要以均匀的间隔(例如 60 秒之间)注入负载,那么您最好使用Constant Throughput Timer。但是,如果您需要随机调度(例如,为执行报告的真实用户建模),那么Precise Throughput Timer是您的朋友。
在比较多个负载测试的结果时,能够重复完全相同的测试配置文件很有用。例如,如果在测试开始 5 分钟后调用操作 X(例如“利润报告”),那么最好复制该模式以用于后续测试执行。复制相同的负载模式可以简化对测试结果的分析(例如 CPU% 图表)。
随机种子(从 0 变为随机)可以控制精确吞吐量计时器使用的种子值。默认情况下,它初始化为0,这意味着每次测试执行都使用随机种子。如果您需要具有可重复的负载模式,请更改 随机种子以便一些随机值。一般建议是使用非零种子,“默认为 0”是实现限制。
注意:当使用具有相同吞吐率和相同非零种子的多个线程组时,可能会导致不必要的同时触发样本。
测试高速率和/或长测试持续时间
精确吞吐量计时器生成计划并将其保存在内存中。在大多数情况下,这应该不是问题,但是请记住,您可能希望将时间表保持在 1'000'000 个样本以内。为 1'000'000 个样本生成一个计划大约需要 200 毫秒,并且该计划在堆中消耗 8 兆字节。构建 1000 万个条目的计划需要 1-2 秒,并且在堆中消耗 80 兆字节。
例如,如果您想以每小时 5'000 个的速率执行为期 2 周的测试,那么您可能希望每小时恰好有 5'000 个样本。您可以将计时器的计时器的测试持续时间(秒)属性设置为1小时。然后计时器会为一个小时创建一个包含 5'000 个样本的计划,当计划用完时,计时器将生成下一小时的计划。
同时,您可以将测试持续时间(秒)设置为 2 周,计时器将生成一个包含 168'000 个样本 = 2 周 * 5'000 个样本/小时 = 2*7*24*500的时间表。生成时间表大约需要 30 毫秒,并且会消耗超过 1 兆字节。
突发负载
在某些情况下,所有样本都应该成对、三组等出现。某些情况可以通过Synchronizing Timer解决,但是 Precise Throughput Timer具有以包形式发出请求的本机方式。默认情况下禁用此行为,并通过“批量出发”设置进行控制
- 批处理中的线程数(线程)。指定批次中的样本数。请注意,样本总数仍将符合目标吞吐量
- 批处理中线程之间的延迟(毫秒)。例如,如果设置为 42,批量大小为 3,那么线程将在 x、x+42ms、x+84ms 离开
可变负载率
尽管可以通过表达式定义属性值(例如吞吐量),但建议通过测试保持该值或多或少相同,因为重新计算新计划以适应新值需要时间。
监控
生成下一个计划时,精确吞吐量计时器会向jmeter.log记录一条消息: 2018-01-04 17:34:03,635 信息 oajtConstantPoissonProcessGenerator:生成 21 个计时(... 20 需要,速率 1.0,持续时间 20,精确 lim 20000, i21) 在 0 毫秒内。First 15 events will be fired at: 1.1869653574244292 (+1.1869653574244292), 1.4691340403043207 (+0.2821686828798915), 3.638151706179226 (+2.169017665874905), 3.836357090410566 (+0.19820538423134026), 4.709330071408575 (+0.8729729809980085), 5.61330076999953 (+0.903970698590955), ... 这表明调度生成花费了 0 毫秒,并以秒为单位显示绝对时间戳。在上述情况下,速率设置为每秒 1,实际时间戳变为 1.2 秒、1.5 秒、3.6 秒、3.8 秒、4.7 秒等。
参数 ¶
同步定时器¶
SyncTimer 的目的是阻塞线程,直到 X 个线程被阻塞,然后它们立即被释放。因此,SyncTimer 可以在测试计划的各个点创建大量即时负载。
参数 ¶
豆壳定时器¶
BeanShell Timer 可用于产生延迟。
有关使用 BeanShell 的完整详细信息,请参阅BeanShell 网站。
测试元素支持ThreadListener和TestListener方法。这些应该在初始化文件中定义。有关示例定义,请参见文件BeanShellListeners.bshrc。
参数 ¶
- 参数- 包含作为单个变量的参数的字符串
- bsh.args - 包含参数的字符串数组,在空白处分割
在调用脚本之前,在 BeanShell 解释器中设置了一些变量:
- log - ( Logger ) - 可用于写入日志文件
- ctx - ( JMeterContext ) - 提供对上下文的访问
-
vars - ( JMeterVariables ) - 提供对变量的读/写访问权限:
vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object());
- props - (JMeterProperties - class java.util.Properties) - 例如props.get("START.HMS"); props.put("PROP1","1234");
- prev - ( SampleResult ) - 提供对前一个SampleResult的访问权限(如果有)
有关上述每个变量可用的所有方法的详细信息,请查看 Javadoc
如果定义了属性beanshell.timer.init,这将用于加载初始化文件,该文件可用于定义用于 BeanShell 脚本的方法等。
JSR223 定时器¶
JSR223 Timer 可用于使用 JSR223 脚本语言生成延迟,
参数 ¶
- 参数- 包含作为单个变量的参数的字符串
- args - 包含参数的字符串数组,在空白处拆分
在调用脚本之前,在脚本解释器中设置了一些变量:
- log - ( Logger ) - 可用于写入日志文件
- ctx - ( JMeterContext ) - 提供对上下文的访问
-
vars - ( JMeterVariables ) - 提供对变量的读/写访问权限:
vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object());
- props - (JMeterProperties - class java.util.Properties) - 例如props.get("START.HMS"); props.put("PROP1","1234");
- sampler - ( Sampler ) - 当前的 Sampler
- 标签- 定时器的名称
- FileName - 文件名(如果有)
- OUT - System.out
有关上述每个变量可用的所有方法的详细信息,请查看 Javadoc
18.7 预处理器¶
预处理器用于修改其范围内的采样器。
HTML 链接解析器¶
此修饰符解析来自服务器的 HTML 响应并提取链接和表单。将检查通过此修饰符的 URL 测试样本,看它是否“匹配”从前一个响应中提取的任何链接或表单。然后它将用匹配链接或表单中的适当值替换 URL 测试样本中的值。Perl 类型的正则表达式用于查找匹配项。
考虑一个简单的示例:假设您希望 JMeter 通过您的站点“蜘蛛”,从您的服务器返回的 HTML 解析链接后点击链接(这实际上不是最有用的事情,但它是一个很好的例子) . 您将创建一个Simple Controller,并向其中添加“HTML Link Parser”。然后,创建一个 HTTP 请求,并将域设置为“ .* ”,路径也一样。这将使您的测试样本与返回页面上的任何链接相匹配。如果您想将爬取限制到特定域,则将域值更改为您想要的值。然后,将只跟踪指向该域的链接。
一个更有用的示例:给定一个 Web 投票应用程序,您可能有一个页面,其中包含多个投票选项作为单选按钮供用户选择。假设轮询选项的值是非常动态的——可能是用户生成的。如果您希望 JMeter 测试投票,您可以创建选择硬编码值的测试样本,或者您可以让 HTML Link Parser 解析表单,并将随机投票选项插入到您的 URL 测试样本中。为此,请按照上面的示例进行操作,除了在配置 Web 测试控制器的 URL 选项时,请务必选择“ POST ”作为方法。为domain、path和任何其他表单参数输入硬编码值。然后,对于实际的单选按钮参数,输入名称(假设它'poll_choice "),然后是 " .* " 作为该参数的值。当修饰符检查这个 URL 测试样本时,它会发现它“匹配”投票表单(并且它不应该匹配任何其他表单,因为您已经指定了 URL 测试示例的所有其他方面),它会将您的表单参数替换为表单中的匹配参数。由于正则表达式“ .* ”将匹配任何内容,修饰符可能会有一个列表可供选择的单选按钮。它将随机选择,并替换您的 URL 测试示例中的值。每次通过测试,都会选择一个新的随机值。
HTTP URL 重写修饰符¶
此修饰符的工作方式与 HTML Link Parser 类似,不同之处在于它有一个特定用途,它比 HTML Link Parser 更易于使用且更高效。对于使用 URL 重写来存储会话 id 而不是 cookie 的 Web 应用程序,可以在 ThreadGroup 级别附加此元素,就像HTTP Cookie 管理器一样。只需给它会话 id 参数的名称,它就会在页面上找到它并将参数添加到该 ThreadGroup 的每个请求中。
或者,可以将此修饰符附加到选择请求,它只会修改它们。聪明的用户甚至会确定这个修饰符可以用来抓取 HTML Link Parser无法解析的值。
参数 ¶
用户参数¶
允许用户为特定于单个线程的用户变量指定值。
用户变量也可以在测试计划中指定,但不特定于单个线程。此面板允许您为任何用户变量指定一系列值。对于每个线程,将按顺序为变量分配系列中的一个值。如果线程数多于值,则重新使用这些值。例如,这可用于分配一个不同的用户 ID,供每个线程使用。用户变量可以在任何 JMeter 组件的任何字段中引用。
通过单击面板底部的添加变量按钮并在“名称: ”列中填写变量名称来指定变量。要向系列添加新值,请单击“添加用户”按钮并在新添加的列中填写所需的值。
可以使用函数语法在同一线程组中的任何测试组件中访问值:${variable}。
另见CSV Data Set Config元素,它更适合大量参数
参数 ¶
BeanShell 预处理器¶
BeanShell PreProcessor 允许在采样之前应用任意代码。
有关使用 BeanShell 的完整详细信息,请参阅BeanShell 网站。
测试元素支持ThreadListener和TestListener方法。这些应该在初始化文件中定义。有关示例定义,请参见文件BeanShellListeners.bshrc。
参数 ¶
- 参数- 包含作为单个变量的参数的字符串
- bsh.args - 包含参数的字符串数组,在空白处分割
在调用脚本之前,在 BeanShell 解释器中设置了一些变量:
- log - ( Logger ) - 可用于写入日志文件
- ctx - ( JMeterContext ) - 提供对上下文的访问
-
vars - ( JMeterVariables ) - 提供对变量的读/写访问权限:
vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object());
- props - (JMeterProperties - class java.util.Properties) - 例如props.get("START.HMS"); props.put("PROP1","1234");
- prev - ( SampleResult ) - 提供对前一个 SampleResult 的访问权限(如果有)
- sampler - ( Sampler )- 提供对当前采样器的访问权限
有关上述每个变量可用的所有方法的详细信息,请查看 Javadoc
如果定义了beanshell.preprocessor.init属性,则用于加载初始化文件,该文件可用于定义方法等,以在 BeanShell 脚本中使用。
JSR223 预处理器¶
JSR223 PreProcessor 允许在采样之前应用 JSR223 脚本代码。
参数 ¶
- 参数- 包含作为单个变量的参数的字符串
- args - 包含参数的字符串数组,在空白处拆分
设置了以下 JSR223 变量以供脚本使用:
- log - ( Logger ) - 可用于写入日志文件
- 标签- 字符串标签
- FileName - 脚本文件名(如果有)
- 参数- 参数(作为字符串)
- args - 作为字符串数组的参数(按空格分割)
- ctx - ( JMeterContext ) - 提供对上下文的访问
-
vars - ( JMeterVariables ) - 提供对变量的读/写访问权限:
vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object()); vars.getObject("OBJ2");
- props - (JMeterProperties - class java.util.Properties) - 例如props.get("START.HMS"); props.put("PROP1","1234");
- sampler - ( Sampler )- 提供对当前采样器的访问权限
- OUT - System.out - 例如OUT.println("message")
有关上述每个变量可用的所有方法的详细信息,请查看 Javadoc
JDBC 预处理器¶
JDBC PreProcessor 使您能够在示例运行之前运行一些 SQL 语句。如果您的 JDBC 示例需要一些数据位于数据库中并且您无法在设置线程组中计算这些数据,这将很有用。有关详细信息,请参阅JDBC 请求。
请参阅以下测试计划:
在链接的测试计划中,“ Create Price Cut-Off ” JDBC PreProcessor 调用一个存储过程在数据库中创建一个Price Cut-Off,这个将被“ Calculate Price cut off ”使用。
正则表达式用户参数¶
允许使用正则表达式为从另一个 HTTP 请求中提取的 HTTP 参数指定动态值。RegEx 用户参数特定于各个线程。
此组件允许您指定提取 HTTP 请求参数的名称和值的正则表达式的引用名称。必须为参数名称和参数值指定正则表达式组编号。仅对使用此 RegEx 用户参数且名称匹配的采样器中的参数进行替换
参数 ¶
假设我们有一个请求,它返回一个带有 3 个输入参数的表单,我们想要提取其中 2 个参数的值以将它们注入到下一个请求中
- 为第一个 HTTP 请求创建后处理器正则表达式
- refName - 设置正则表达式 Expression ( listParams )的名称
-
正则表达式- 将提取输入名称和输入值属性的表达式
例如:input name="([^"]+?)" value="([^"]+?)" - 模板- 将为空
- match nr - -1(为了遍历所有可能的匹配)
- 为第二个 HTTP 请求创建预处理器 RegEx 用户参数
- refName - 设置正则表达式的相同引用名称,在我们的示例中为listParams
- 参数名称组号- 参数名称正则表达式的组号,在我们的示例中为1
- 参数值组号- 参数值正则表达式的组号,在我们的示例中为2
另请参见正则表达式提取器元素,该元素用于提取参数名称和值
采样超时¶
如果样本完成时间过长,此预处理器会安排一个定时器任务来中断样本。如果超时为零或负数,则忽略超时。为此,采样器必须实现可中断。已知以下采样器会这样做:
AJP、BeanShell、FTP、HTTP、Soap、AccessLog、MailReader、JMS Subscriber、TCPSampler、TestAction、JavaSampler
测试元素适用于连接超时或响应超时等单个超时不足的情况,或者采样器不支持超时的情况。超时时间应设置得足够长,以便在正常测试中不会触发,但要足够短,以中断被卡住的样本。
[默认情况下,JMeter 使用 Callable 来中断采样器。这与定时器在同一个线程中执行,因此如果中断需要很长时间,它可能会延迟后续超时的处理。预计这不会成为问题,但如有必要,可以将属性InterruptTimer.useRunnable 设置为true以使用单独的 Runnable 线程而不是 Callable。]
18.8 后处理器¶
顾名思义,后处理器是在采样器之后应用的。请注意,它们应用于同一范围内的所有采样器,因此为确保后处理器仅应用于特定采样器,请将其添加为采样器的子级。
后处理器在断言之前运行,因此它们无法访问任何断言结果,样本状态也不会反映任何断言的结果。如果您需要访问断言结果,请尝试改用侦听器。另请注意,在运行所有断言之后 ,变量JMeterThread.last_sample_ok设置为“ true ”或“ false ”。
正则表达式提取器¶
允许用户使用 Perl 类型的正则表达式从服务器响应中提取值。作为后处理器,该元素将在其范围内的每个 Sample 请求之后执行,应用正则表达式,提取请求的值,生成模板字符串,并将结果存储到给定的变量名中。
参数 ¶
- 仅主要样本- 仅适用于主要样本
- 仅子样本- 仅适用于子样本
- 主样本和子样本- 适用于两者。
- 要使用的 JMeter 变量名称- 提取将应用于命名变量的内容
- 正文- 响应的正文,例如网页的内容(不包括标题)
-
正文(未转义) - 响应的正文,替换了所有 Html 转义码。请注意,处理 Html 转义时不考虑上下文,因此可能会进行一些不正确的替换。
请注意,此选项会极大地影响性能,因此仅在绝对必要时使用它并注意其影响
-
Body as a Document - 通过 Apache Tika 从各种类型的文档中提取文本(请参阅查看结果树文档视图部分)。
请注意,作为文档的正文选项会影响性能,因此请确保它适合您的测试
- 请求标头- 非 HTTP 示例可能不存在
- 响应标头- 非 HTTP 样本可能不存在
- 网址
- 响应代码- 例如200
- 响应消息- 例如OK
- 使用零值表示 JMeter 应该随机选择一个匹配项。
- 正数 N 表示选择第 n个匹配项。
- 负数与ForEach 控制器一起使用- 见下文。
但是,如果您有多个设置相同变量的测试元素,您可能希望在表达式不匹配时保持变量不变。在这种情况下,调试完成后删除默认值。
如果匹配数设置为非负数,并且发生匹配,则变量设置如下:
- refName - 模板的值
- refName_g n,其中n = 0 , 1 , 2 - 匹配的组
- refName_g - 正则表达式中的组数(不包括0)
如果不匹配,则refName变量设置为默认值(除非不存在)。此外,还删除了以下变量:
- refName_g0
- refName_g1
- refName_g
如果匹配数设置为负数,则处理采样器数据中的所有可能匹配。变量设置如下:
- refName_matchNr - 找到的匹配数;可能是0
- refName_ n,其中n = 1、2、3等 - 由模板生成的字符串
- refName_ n _g m,其中m = 0 , 1 , 2 - 匹配n的组
- refName - 始终设置为默认值
- refName_g n - 未设置
请注意,在这种情况下, refName变量始终设置为默认值,并且未设置关联的组变量。
有关如何指定修饰符的一些示例,以及有关 JMeter 正则表达式的更多信息,另请参阅响应断言。
CSS 选择器提取器 (原为:CSS/JQuery 提取器) ¶
允许用户使用 CSS 选择器语法从服务器 HTML 响应中提取值。作为后处理器,此元素将在其范围内的每个 Sample 请求之后执行,应用 CSS/JQuery 表达式,提取请求的节点,将节点提取为文本或属性值并将结果存储到给定的变量名中。
参数 ¶
- 仅主要样本- 仅适用于主要样本
- 仅子样本- 仅适用于子样本
- 主样本和子样本- 适用于两者。
- 要使用的 JMeter 变量名称- 提取将应用于命名变量的内容
- E[foo] - 具有“ foo ”属性的E元素
- 祖先子元素 - 来自祖先的子元素,例如.body p在具有类“ body ”的块下的任何位置找到p元素
- :lt(n) - 查找兄弟索引(即它在 DOM 树中相对于其父级的位置)小于n的元素;例如td:lt(3)
- :contains(text) - 查找包含给定文本的元素。搜索不区分大小写;例如p:contains(jsoup)
- …
如果设置了属性,则这是 JSoup 的等效Element#attr(name)函数。
如果为空,则等效于 JSoup 的Element#text()函数,如果未为属性设置值。
- 使用零值表示 JMeter 应该随机选择一个匹配项。
- 正数N表示选择第 n个匹配项。
- 负数与ForEach 控制器一起使用- 见下文。
但是,如果您有多个设置相同变量的测试元素,您可能希望在表达式不匹配时保持变量不变。在这种情况下,调试完成后删除默认值。
如果匹配数设置为非负数,并且发生匹配,则变量设置如下:
- refName - 模板的值
如果不匹配,则refName变量设置为默认值(除非不存在)。
如果匹配数设置为负数,则处理采样器数据中的所有可能匹配。变量设置如下:
- refName_matchNr - 找到的匹配数;可能是0
- refName_n,其中n = 1、2、3等 - 由模板生成的字符串
- refName - 始终设置为默认值
请注意,在这种情况下, refName变量始终设置为默认值。
XPath2 提取器¶
参数 ¶
- 仅主要样本- 仅适用于主要样本
- 仅子样本- 仅适用于子样本
- 主样本和子样本- 适用于两者。
- 要使用的 JMeter 变量名称- 提取将应用于命名变量的内容
例如//title将返回“ <title>Apache JMeter</title> ”而不是“ Apache JMeter ”。
在这种情况下,//title/text()将返回“ Apache JMeter ”。
- 0:表示随机(默认值)
- -1表示提取所有结果,它们将被命名为<variable name> _N(其中N从 1 到 Number of results)
- X:表示提取第 X个结果。如果此 X th大于匹配数,则不返回任何内容。将使用默认值
为了允许在ForEach Controller中使用,它的工作原理与上面的 XPath Extractor 完全相同
XPath2 Extractor 提供了一些有趣的工具,例如改进的语法和比第一个版本更多的功能。
以下是一些示例:
- 绝对(/书/页[2])
- 从书中提取页面的第二个绝对值
- 平均(/图书馆/书/页)
- 从图书馆的所有书籍中提取平均页数
- 比较(/book[1]/page[2],/book[2]/page[2])
- 如果第一本书的第 2页等于第 2 本书的第2页,则返回等于 0 的整数值,否则返回 -1。
要查看有关这些函数的更多信息,请查看xPath2 函数
XPath 提取器¶
参数 ¶
- 仅主要样本- 仅适用于主要样本
- 仅子样本- 仅适用于子样本
- 主样本和子样本- 适用于两者。
- 要使用的 JMeter 变量名称- 提取将应用于命名变量的内容
- 应检查 HTML 响应的“使用整洁”。使用 Tidy 将此类响应转换为有效的 XHTML(与 XML 兼容的 HTML)
- 对于 XHTML 或 XML 响应(例如 RSS),应取消选中“ Use Tidy ”
例如//title将返回“ <title>Apache JMeter</title> ”而不是“ Apache JMeter ”。
在这种情况下,//title/text()将返回“ Apache JMeter ”。
- 0:表示随机
- -1表示提取所有结果(默认值),它们将被命名为<variable name> _N(其中N从 1 到 Number of results)
- X:表示提取第 X个结果。如果此 X th大于匹配数,则不返回任何内容。将使用默认值
为了允许在ForEach Controller中使用,在返回时设置了以下变量:
- refName - 设置为第一个(或唯一)匹配;如果不匹配,则设置为默认值
- refName_matchNr - 设置为匹配数(可能是0)
- refName_n - n = 1 , 2 , 3等。设置为 1 st , 2 nd 3 rd等。
XPath 是主要针对 XSLT 转换的查询语言。但是,它也可用作结构化数据的通用查询语言。有关详细信息,请参阅 XPath 参考或XPath 规范。这里有几个例子:
- /html/head/标题
- 从 HTML 响应中提取标题元素
- /书/页[2]
- 从书中提取第二页
- /书/页
- 从书中提取所有页面
- //form[@name='countryForm']//select[@name='country']/option[text()='Czech Republic'])/@value
- 在名称属性为“ country ”的选择元素内提取与文本“ Czech Republic ”匹配的选项元素的值属性,在名称属性为“ countryForm ”的表单内
- 所有元素和属性名称都转换为小写
- Tidy 尝试纠正不正确的嵌套元素。例如 - 原始(不正确)ul/font/li变为正确ul/li/font
作为 Xalan XPath 解析器(JMeter 所基于的实现)的命名空间限制的解决方法,您需要:
- 提供一个包含命名空间前缀映射
的属性文件(例如,如果您的文件名为namespaces.properties ):
prefix1=http\://foo.apache.org prefix2=http\://toto.apache.org …
- 使用属性
在user.properties文件中引用此文件:
xpath.namespace.config=namespaces.properties
//mynamespace:tagname
//*[local-name()='tagname' and namespace-uri()='uri-for-namespace']uri-for-namespace mynamespace
JSON JMESPath 提取器¶
参数 ¶
- 仅主要样本- 仅适用于主要样本
- 仅子样本- 仅适用于子样本
- 主样本和子样本- 适用于两者。
- 要使用的 JMeter 变量名称- 提取将应用于命名变量的内容
- 0:表示随机
- -1表示提取所有结果(默认值),它们将被命名为<variable name> _N(其中N从 1 到 Number of results)
- X:表示提取第 X个结果。如果此 X th大于匹配数,则不返回任何内容。将使用默认值
JMESPath 是一种 JSON 查询语言。它以具有完整规范的 ABNF 语法进行描述。这可确保精确定义语言语法。有关详细信息,请参阅JMESPath 参考。这里还有一些例子JMESPath Example。
结果状态动作处理器¶
参数 ¶
- 继续- 忽略错误并继续测试
- 启动下一个线程循环- 在当前迭代错误的采样器之后不执行采样器,并在下一次迭代中重新启动循环
- 停止线程- 当前线程退出
- 停止测试- 整个测试在任何当前样本结束时停止。
- 立即停止测试- 整个测试突然停止。如果可能,任何当前的采样器都会被中断。
BeanShell 后处理器¶
BeanShell PreProcessor 允许在采样后应用任意代码。
BeanShell 后处理器不再忽略具有零长度结果数据的样本
有关使用 BeanShell 的完整详细信息,请参阅BeanShell 网站。
测试元素支持ThreadListener和TestListener方法。这些应该在初始化文件中定义。有关示例定义,请参见文件BeanShellListeners.bshrc。
参数 ¶
- 参数- 包含作为单个变量的参数的字符串
- bsh.args - 包含参数的字符串数组,在空白处分割
设置了以下 BeanShell 变量以供脚本使用:
- log - ( Logger ) - 可用于写入日志文件
- ctx - ( JMeterContext ) - 提供对上下文的访问
-
vars - ( JMeterVariables ) - 提供对变量的读/写访问权限:
vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object());
- props - (JMeterProperties - class java.util.Properties) - 例如props.get("START.HMS"); props.put("PROP1","1234");
- prev - ( SampleResult ) - 可以访问上一个 SampleResult
- data - (byte [])- 提供对当前样本数据的访问
有关上述每个变量可用的所有方法的详细信息,请查看 Javadoc
如果定义了属性beanshell.postprocessor.init,这将用于加载初始化文件,该文件可用于定义方法等,以在 BeanShell 脚本中使用。
JSR223 后处理器¶
JSR223 PostProcessor 允许在采样后应用 JSR223 脚本代码。
参数 ¶
- 参数- 包含作为单个变量的参数的字符串
- args - 包含参数的字符串数组,在空白处拆分
在调用脚本之前,会设置一些变量。请注意,这些是 JSR223 变量 - 即它们可以直接在脚本中使用。
- log - ( Logger ) - 可用于写入日志文件
- 标签- 字符串标签
- FileName - 脚本文件名(如果有)
- 参数- 参数(作为字符串)
- args - 作为字符串数组的参数(按空格分割)
- ctx - ( JMeterContext ) - 提供对上下文的访问
-
vars - ( JMeterVariables ) - 提供对变量的读/写访问权限:
vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object()); vars.getObject("OBJ2");
- props - (JMeterProperties - class java.util.Properties) - 例如props.get("START.HMS"); props.put("PROP1","1234");
- prev - ( SampleResult ) - 提供对前一个 SampleResult 的访问权限(如果有)
- sampler - ( Sampler )- 提供对当前采样器的访问权限
- OUT - System.out - 例如OUT.println("message")
有关上述每个变量可用的所有方法的详细信息,请查看 Javadoc
JDBC 后处理器¶
JDBC PostProcessor 使您能够在示例运行后立即运行一些 SQL 语句。如果您的 JDBC 示例更改了一些数据并且您希望将状态重置为 JDBC 示例运行之前的状态,这将很有用。
在链接的测试计划中,“ JDBC PostProcessor ” JDBC PostProcessor 调用存储过程从数据库中删除由 PreProcessor 创建的 Price Cut-Off。
JSON 提取器¶
JSON PostProcessor 使您能够使用 JSON-PATH 语法从 JSON 响应中提取数据。这个后处理器与正则表达式提取器非常相似。它必须作为 HTTP 采样器或任何其他具有响应的采样器的子级放置。它将允许您以非常简单的方式提取文本内容,请参阅JSON 路径语法。
参数 ¶
- 0:表示随机(默认值)
- -1表示提取所有结果,它们将被命名为<variable name> _N(其中N从 1 到 Number of results)
- X:表示提取第 X个结果。如果此 X th大于匹配数,则不返回任何内容。将使用默认值
边界提取器¶
允许用户使用左右边界从服务器响应中提取值。作为后处理器,该元素将在其范围内的每个 Sample 请求之后执行,测试边界,提取请求的值,生成模板字符串,并将结果存储到给定的变量名称中。
参数 ¶
- 仅主要样本- 仅适用于主要样本
- 仅子样本- 仅适用于子样本
- 主样本和子样本- 适用于两者。
- 要使用的 JMeter 变量名称- 断言将应用于命名变量的内容
- 正文- 响应的正文,例如网页的内容(不包括标题)
-
正文(未转义) - 响应的正文,替换了所有 Html 转义码。请注意,处理 Html 转义时不考虑上下文,因此可能会进行一些不正确的替换。
请注意,此选项会极大地影响性能,因此仅在绝对必要时使用它并注意其影响
-
Body as a Document - 通过 Apache Tika 从各种类型的文档中提取文本(请参阅查看结果树文档视图部分)。
请注意,作为文档的正文选项会影响性能,因此请确保它适合您的测试
- 请求标头- 非 HTTP 示例可能不存在
- 响应标头- 非 HTTP 样本可能不存在
- 网址
- 响应代码- 例如200
- 响应消息- 例如OK
- 使用零值表示 JMeter 应该随机选择一个匹配项。
- 正数 N 表示选择第 n个匹配项。
- 负数与ForEach 控制器一起使用- 见下文。
但是,如果您有多个设置相同变量的测试元素,您可能希望在表达式不匹配时保持变量不变。在这种情况下,调试完成后删除默认值。
如果匹配数设置为非负数,并且发生匹配,则变量设置如下:
- refName - 提取的值
如果不匹配,则refName变量设置为默认值(除非不存在)。
如果匹配数设置为负数,则处理采样器数据中的所有可能匹配。变量设置如下:
- refName_matchNr - 找到的匹配数;可能是0
- refName_ n,其中n = 1、2、3等 - 由模板生成的字符串
- refName_ n _g m,其中m = 0 , 1 , 2 - 匹配n的组
- refName - 始终设置为默认值
请注意,在这种情况下, refName变量始终设置为默认值,并且未设置关联的组变量。
18.9 其他特性¶
测试计划¶
测试计划是指定测试的整体设置的地方。
可以为在整个测试中重复的值定义静态变量,例如服务器名称。例如,变量SERVER可以定义为www.example.com,测试计划的其余部分可以将其称为${SERVER}。这简化了以后更改名称的过程。
如果在多个 用户定义变量配置元素之一上重复使用相同的变量名称,则该值设置为测试计划中的最后一个定义(从上到下读取)。此类变量应用于在测试运行之间可能发生变化但在测试运行期间保持不变的项目。
选择功能测试指示 JMeter 将附加样本信息 - 响应数据和采样器数据 - 保存到所有结果文件。这增加了运行测试所需的资源,并可能对 JMeter 性能产生不利影响。如果仅特定采样器需要更多数据,则向其添加侦听器,并根据需要配置字段。
此外,这里还有一个选项来指示 JMeter串行而不是并行运行线程组。
在主线程关闭后运行 tearDown 线程组:如果选中,则在主线程正常关闭后运行 tearDown 组(如果有)。如果强制停止测试,则不会运行 tearDown 线程。
测试计划现在提供了一种将类路径设置添加到特定测试计划的简单方法。该功能是附加的,这意味着您可以添加 jar 文件或目录,但删除条目需要重新启动 JMeter。
JMeter 属性还提供了一个用于加载其他类路径的条目。在jmeter.properties中,编辑“ user.classpath ”或“ plugin_dependency_paths ”以包含其他库。有关详细信息,请参阅JMeter 的类路径和 配置 JMeter。
线程组¶
线程组定义了将针对您的服务器执行特定测试用例的用户池。在线程组 GUI 中,您可以控制模拟的用户数(线程数)、加速时间(启动所有线程所需的时间)、执行测试的次数,以及可选的启动并停止测试时间。
另请参见tearDown Thread Group和setUp Thread Group。
使用调度程序时,JMeter 运行线程组,直到达到循环数或达到持续时间/结束时间 - 以先发生者为准。请注意,仅在样本之间检查条件;当达到结束条件时,该线程将停止。JMeter 不会中断正在等待响应的采样器,因此可以任意延迟结束时间。
从 JMeter 3.0 开始,您可以通过选择线程组并右键单击来运行它们的选择。将出现一个弹出菜单:
请注意,您有三个选项来运行线程组的选择:
- 开始
- 仅启动选定的线程组
- 开始没有停顿
- 仅启动选定的线程组,但不运行计时器
- 证实
- 仅使用验证模式启动选定的线程组。默认情况下,这会在验证模式下运行线程组(见下文)
此模式通过在一个线程、一次迭代、无计时器和无启动延迟设置为0的情况下运行线程组来实现对线程组的快速验证。通过在user.properties中设置,可以使用某些属性修改行为:
- testplan_validation.nb_threads_per_thread_group
- 用于验证线程组的线程数,默认为1
- testplan_validation.ignore_timers
- 验证plan的线程组时忽略定时器,默认1
- testplan_validation.number_iterations
- 用于验证线程组的迭代次数
- testplan_validation.tpc_force_100_pct
- 是否强制吞吐量控制器以百分比模式运行,就好像百分比为 100 %。默认为假
参数 ¶
- 继续- 忽略错误并继续测试
- 开始下一个线程循环- 忽略错误,开始下一个循环并继续测试
- 停止线程- 当前线程退出
- 停止测试- 整个测试在任何当前样本结束时停止。
- 立即停止测试- 整个测试突然停止。如果可能,任何当前的采样器都会被中断。
如果未选中,则在测试开始时创建所有线程(然后它们会暂停适当比例的加速时间)。这是最初的默认值,适用于在大部分测试中线程都处于活动状态的测试。
SSL 管理器¶
SSL 管理器是一种选择客户端证书的方法,以便您可以测试使用公钥基础设施 (PKI) 的应用程序。仅当您尚未设置适当的系统属性时才需要它。
您可以使用 Java 密钥库 (JKS) 格式的密钥库或公钥证书标准 #12 (PKCS12) 文件作为客户端证书。JSSE 库的一个特性要求您的密钥上至少有六个字符的密码(至少对于 JDK 附带的 keytool 实用程序而言)。
要选择客户端证书,请从菜单栏中选择.p12 ”,以便 SSL 管理器将其识别为 PKCS12 文件。任何其他文件都将被视为普通的 JKS 密钥存储。如果正确安装了 JSSE,系统将提示您输入密码。文本框不会隐藏您此时键入的字符——因此请确保没有人在看您的肩膀。当前实现假定密钥库的密码也是您要进行身份验证的客户端的私钥的密码。
您将看到默认情况下查找 PKCS12 文件的文件查找器。您的 PKCS12 文件必须具有扩展名“或者您可以设置适当的系统属性 - 请参阅system.properties文件。
下次运行测试时,SSL 管理器将检查您的密钥库,看它是否至少有一个可用的密钥。如果只有一个密钥,SSL Manager 将为您选择它。如果有多个键,则当前选择第一个键。目前无法选择密钥库中的其他条目,因此所需的密钥必须是第一个。
需要注意的事项如果您的证书颁发机构 (CA) 证书未由 JDK 随附的五个 CA 证书之一签名,则您必须正确安装证书颁发机构 (CA) 证书。安装它的一种方法是将您的 CA 证书导入 JKS 文件,并将 JKS 文件命名为“ jssecacerts ”。将文件放在 JRE 的 lib/security文件夹中。该文件将在同一目录中的“ cacerts ”文件之前读取。请记住,只要“ jssecacerts ”文件存在,安装在“ cacerts ”中的证书就不会被使用。这可能会给您带来问题。如果您不介意将 CA 证书导入“ cacerts ”" 文件,然后您可以针对所有已安装的 CA 证书进行身份验证。
HTTP(S) 测试脚本记录器 (原为:HTTP 代理服务器) ¶
HTTP(S) 测试脚本记录器允许 JMeter 在您使用普通浏览器浏览 Web 应用程序时拦截并记录您的操作。JMeter 将创建测试样本对象并将它们直接存储到您的测试计划中(因此您可以在制作样本时交互式地查看样本)。
确保您阅读此wiki 页面以正确设置 JMeter。
要使用记录器,请添加HTTP(S) 测试脚本记录器元素。右键单击 Test Plan 元素以获取 Add 菜单:(
)。记录器实现为 HTTP(S) 代理服务器。您需要为所有 HTTP 和 HTTPS 请求设置您的浏览器使用代理。
记录会话时最好使用隐私浏览模式。这应该确保浏览器启动时没有存储 cookie,并防止保存某些更改。例如,Firefox 不允许永久保存证书覆盖。
HTTPS 记录和证书
HTTPS 连接使用证书来验证浏览器和 Web 服务器之间的连接。通过 HTTPS 连接时,服务器将证书提供给浏览器。为了验证证书,浏览器会检查服务器证书是否由证书颁发机构 (CA) 签名,该证书颁发机构 (CA) 链接到其内置的根 CA 之一。
JMeter 需要使用自己的证书才能拦截来自浏览器的 HTTPS 连接。实际上,JMeter 必须伪装成目标服务器。
JMeter 将生成自己的证书。这些是使用属性proxy.cert.validity定义的有效期、默认 7 天和随机密码生成的。如果 JMeter 检测到它在 Java 8 或更高版本下运行,它将根据需要(动态模式)为每个目标服务器生成证书,除非定义了以下属性:proxy.cert.dynamic_keys=false. 使用动态模式时,证书将用于正确的主机名,并由 JMeter 生成的 CA 证书签名。默认情况下,浏览器不会信任此 CA 证书,但可以将其安装为受信任的证书。完成后,生成的服务器证书将被浏览器接受。这样做的好处是,即使是嵌入的 HTTPS 资源也可以被拦截,并且无需为每个新服务器覆盖浏览器检查。
除非提供了密钥库(并且您定义了属性proxy.cert.alias),否则 JMeter 需要使用 keytool 应用程序来创建密钥库条目。JMeter 包含通过查看各种标准位置来检查 keytool 是否可用的代码。如果 JMeter 找不到 keytool 应用程序,会报错。如有必要,可以使用系统属性keytool.directory告诉 JMeter 在哪里可以找到 keytool。这应该在文件system.properties中定义。
按下Start按钮 时会生成 JMeter 证书(如有必要) 。
如有必要,您可以通过从 JMeter 目录中 删除密钥库文件proxyserver.jks 来强制 JMeter 重新生成密钥库(以及导出的证书 - ApacheJMeterTemporaryRootCA[.usr|.crt] )。
此证书不是浏览器通常信任的证书之一,并且不会用于正确的主机。
作为结果:
- 浏览器应显示一个对话框,询问您是否要接受证书。例如:
1) The server's name "www.example.com" does not match the certificate's name "_ JMeter Root CA for recording (INSTALL ONLY IF IT S YOURS)". Somebody may be trying to eavesdrop on you. 2) The certificate for "_ JMeter Root CA for recording (INSTALL ONLY IF IT S YOURS)" is signed by the unknown Certificate Authority "_ JMeter Root CA for recording (INSTALL ONLY IF IT S YOURS)". It is not possible to verify that this is a valid certificate.
您将需要接受证书以允许 JMeter 代理拦截 SSL 流量以记录它。但是,不要永久接受此证书;它应该只被暂时接受。浏览器只会提示主 URL 证书的对话,而不是页面中加载的资源,例如托管在安全外部 CDN 上的图像、CSS 或 JavaScript 文件。如果您有这样的资源(例如 gmail 有),您必须首先手动浏览到这些其他域才能接受 JMeter 的证书。签入jmeter.log以获取您需要为其注册证书的安全域。 - 如果浏览器已经为此域注册了一个经过验证的证书,浏览器会将 JMeter 检测为安全漏洞并拒绝加载该页面。如果是这样,您必须从浏览器的密钥库中删除受信任的证书。
从 2.10 开始的 JMeter 版本仍然支持此方法,如果您定义以下属性,将继续这样做: proxy.cert.alias 以下属性可用于更改使用的证书:
- proxy.cert.directory - 查找证书的目录(默认 = JMeter bin/)
- proxy.cert.file - 密钥库文件的名称(默认“ proxyserver.jks ”)
- proxy.cert.keystorepass - 密钥库密码(默认“密码”)[如果使用 JMeter 证书则忽略]
- proxy.cert.keypassword - 证书密钥密码(默认“密码”)[如果使用 JMeter 证书则忽略]
- proxy.cert.type - 证书类型(默认“ JKS ”)[如果使用 JMeter 证书则忽略]
- proxy.cert.factory - 工厂(默认“ SunX509 ”)[如果使用 JMeter 证书则忽略]
- proxy.cert.alias - 要使用的密钥的别名。如果已定义,JMeter 不会尝试生成自己的证书。
- proxy.ssl.protocol - 要使用的协议(默认“ SSLv3 ”)
为 HTTPS 录制安装 JMeter CA 证书
如上所述,当在 Java 8 下运行时,JMeter 可以为每个服务器生成证书。为了顺利进行,JMeter 使用的根 CA 签名证书需要被浏览器信任。第一次启动记录器时,它会在必要时生成证书。根 CA 证书将导出到当前启动目录中名为ApacheJMeterTemporaryRootCA的文件中。设置证书后,JMeter 将显示一个包含当前证书详细信息的对话框。此时,可以按照以下说明将证书导入浏览器。
请注意,一旦根 CA 证书被安装为受信任的 CA,浏览器将信任任何由它签名的证书。在证书过期或从浏览器中删除证书之前,它不会警告用户该证书被依赖。因此,任何可以获取密钥库和密码的人都可以使用该证书生成证书,任何信任 JMeter 根 CA 证书的浏览器都将接受该证书。因此,密钥库和私钥的密码是随机生成的,并且使用的有效期很短。密码存储在本地首选项区域中。请确保只有受信任的用户才能访问具有密钥库的主机。
在 Firefox 中安装证书
选择以下选项:
- 工具/选项
- 高级/证书
- 查看证书
- 当局
- 进口 …
- 浏览到 JMeter 启动目录,然后单击文件ApacheJMeterTemporaryRootCA.crt,按Open
- 单击查看并检查证书详细信息是否与 JMeter 测试脚本记录器显示的一致
- 如果确定,请选择“信任此 CA 以识别网站”,然后按确定
- 必要时按OK关闭对话框
在 Chrome 或 Internet Explorer 中安装证书
Chrome 和 Internet Explorer 都对证书使用相同的信任库。
- 浏览到 JMeter 启动目录,然后单击文件ApacheJMeterTemporaryRootCA.crt并打开它
- 单击“详细信息”选项卡并检查证书详细信息是否与 JMeter 测试脚本记录器显示的一致
- 如果确定,请返回“常规”选项卡,然后单击“安装证书... ”并按照向导提示进行操作
在 Opera 中安装证书
- 工具/首选项/高级/安全
- 管理证书……
- 选择“ Intermediate ”选项卡,单击“ Import ... ”
- 浏览到 JMeter 启动目录,然后单击文件ApacheJMeterTemporaryRootCA.usr,然后打开它
参数 ¶
例如,*.example.com,*.subdomain.example.com
请注意,通配符域仅适用于一级,即abc.subdomain.example.com匹配*.subdomain.example.com但不匹配*.example.com
- 不要对采样器进行分组 - 按顺序存储所有记录的采样器,无需任何分组。
- 在组之间添加分隔符- 添加一个名为“ -------------- ”的控制器以在组之间创建视觉分隔。否则,采样器都按顺序存储。
- 将每个组放入一个新控制器中- 为每个组创建一个新的简单控制器,并将该组的所有采样器存储在其中。
- 仅存储每组的第一个采样器- 仅记录每组中的第一个请求。“ Follow Redirects ”和“ Retrieve All Embedded Resources ... ”标志将在这些采样器中打开。
- 将每个组放在一个新的事务控制器中- 创建一个新的事务控制器,并将该组的所有采样器存储在其中。
录制和重定向
在录制期间,浏览器将遵循重定向响应并生成附加请求。代理将记录原始请求和重定向请求(取决于配置的任何排除项)。生成的样本默认选择了“ Follow Redirects ”,因为这通常更好。
现在如果 JMeter 设置为在重放期间跟随重定向,它将发出原始请求,然后重放记录的重定向请求。为了避免这种重复重播,JMeter 尝试检测样本何时是先前重定向的结果。如果当前响应是重定向,JMeter 将保存重定向 URL。当接收到下一个请求时,会将其与保存的重定向 URL 进行比较,如果匹配,JMeter 将禁用生成的示例。它还向重定向链添加注释。这假设重定向链中的所有请求将相互跟随,而没有任何干预请求。要禁用重定向检测,请设置属性proxy.redirect.disabling=false
包括和排除
包含和排除模式被视为正则表达式(使用 Jakarta ORO)。它们将与每个浏览器请求的主机名、端口(实际或隐含)、路径和查询(如果有)进行匹配。如果您正在浏览的 URL 是
“ http://localhost/jmeter/index.html?username=xxxx ”,
那么将针对字符串测试正则表达式:
“ localhost:80/jmeter/index.html?username=xxxx ”。
因此,如果您想包含所有.html文件,您的正则表达式可能看起来像:
“ .*\.html(\?.*)? ” - 或“ .*\.html
如果您知道没有查询字符串或者您只想要没有查询字符串的 html 页面。
如果有任何包含模式,则 URL必须至少匹配其中一种模式,否则不会被记录。如果有任何排除模式,则 URL不能匹配任何模式,否则不会被记录。使用包含和排除的组合,您应该能够记录您感兴趣的内容并跳过您不感兴趣的内容。
因此“ \.html ”将不匹配localhost:80/index.html
捕获二进制 POST 数据
JMeter 能够捕获二进制 POST 数据。要配置哪些内容类型被视为二进制,请更新 JMeter 属性proxy.binary.types。默认设置如下:
# These content-types will be handled by saving the request in a file: proxy.binary.types=application/x-amf,application/x-java-serialized-object # The files will be saved in this directory: proxy.binary.directory=user.dir # The files will be created with this file filesuffix: proxy.binary.filesuffix=.binary
添加计时器
也可以让代理将计时器添加到录制的脚本中。为此,请直接在 HTTP(S) 测试脚本记录器组件中创建一个计时器。代理会将此计时器的副本放入它记录的每个样本中,或者如果您使用分组,则将其放入每个组的第一个样本中。然后将扫描此副本以查找其属性中变量${T}的出现,并且任何此类出现都将替换为与先前记录的采样器的时间间隔(以毫秒为单位)。
当你准备好开始时,点击“开始”。
样本在哪里记录?
JMeter 将记录的样本放置在您选择的目标控制器中。如果您选择默认选项“使用录制控制器”,它们将存储在测试对象树中找到的第一个录制控制器中(因此请务必在开始录制之前添加录制控制器)。
如果代理似乎没有记录任何样本,这可能是因为浏览器实际上并未使用代理。要检查是否是这种情况,请尝试停止代理。如果浏览器仍然下载页面,那么它没有通过代理发送请求。仔细检查浏览器选项。如果您尝试从运行在同一主机上的服务器进行录制,请检查浏览器是否设置为“绕过本地地址的代理服务器”(此示例来自 IE7,但其他浏览器会有类似的选项)。如果 JMeter 没有记录浏览器 URL,例如http://localhost/或http://127.0.0.1/,请尝试使用非环回主机名或 IP 地址,例如http://myhost/或http://192.168。 0.2/ .
处理 HTTP 请求默认值
如果 HTTP(S) 测试脚本记录器直接在存储样本的控制器中或直接在其任何父控制器中找到启用的HTTP 请求默认值,则记录的样本将包含您指定的默认值的空字段。您可以通过直接在 HTTP(S) 测试脚本记录器中放置 HTTP 请求默认值元素来进一步控制此行为,其非空白值将覆盖其他 HTTP 请求默认值中的值。有关详细信息,请参阅HTTP(S) 测试脚本记录器的最佳实践。
用户定义变量替换
同样,如果 HTTP(S) 测试脚本记录器直接在存储样本的控制器内或直接在其任何父控制器内找到用户定义变量(UDV),则记录的样本将出现这些变量的任何值替换为相应的变量。同样,您可以将用户定义的变量直接放在 HTTP(S) 测试脚本记录器中以覆盖要替换的值。有关详细信息,请参阅 测试脚本记录器的最佳实践。
变量替换:默认情况下,代理服务器会查找所有出现的 UDV 值。例如,如果您使用值www定义变量WEB ,那么无论在哪里找到字符串www都会被${WEB}替换。为避免这种情况在任何地方发生,请设置“正则表达式匹配”复选框。这告诉代理服务器将值视为正则表达式(使用 ORO 提供的 perl5 兼容正则表达式匹配器)。
如果选择“正则表达式匹配”,每个变量都将被编译为包含在 \b(和)\b中的 perl 兼容正则表达式。这样每个匹配都将在单词边界开始和结束。
如果您不希望您的正则表达式包含在这些边界匹配器中,则必须将您的正则表达式括在括号内,例如('.*?')以匹配'name'中的You can call me 'name'。
如果您只想匹配整个字符串,请将其括在(^和$)中,例如(^thus$)。括号是必要的,因为通常添加的边界字符会阻止^和 $匹配。
如果您只想匹配字符串开头的/images ,请使用值(^/images)。Jakarta ORO 还支持零宽度前瞻,因此可以匹配/images/...但使用(^/images(?=/))在输出中 保留尾随/。
注意重叠的匹配器。例如,值.*作为名为 regex的变量中的正则表达式将部分匹配先前替换的变量,这将导致类似 ${{regex}的结果,这很可能不是所需的结果。
如果将任何变量解释为模式时有任何问题,这些问题会在jmeter.log中报告,因此如果 UDV 未按预期工作,请务必检查这一点。
完成记录测试样本后,停止代理服务器(点击“停止”按钮)。请记住重置浏览器的代理设置。现在,您可能想要对测试脚本进行排序和重新排序,添加计时器、侦听器、cookie 管理器等。
我怎样才能记录服务器的响应呢?
只需将View Results Tree侦听器作为 HTTP(S) 测试脚本记录器的子级,就会显示响应。您还可以将保存响应添加到文件后处理器,它将保存响应到文件。
将请求与响应相关联
如果您定义属性proxy.number.requests=true JMeter 将为每个采样器和每个响应添加一个数字。请注意,如果使用了排除或包含,则可能会有比采样器更多的响应。已排除的响应将带有[和] 中的标签,例如[23 /favicon.ico]
饼干管理器
如果您正在测试的服务器使用 cookie,请记住在完成记录后将HTTP Cookie 管理器添加到测试计划中。在录制期间,浏览器会处理任何 cookie,但 JMeter 需要 Cookie 管理器在测试运行期间进行 cookie 处理。JMeter 代理服务器在记录期间传递浏览器发送的所有 cookie,但不会将它们保存到测试计划中,因为它们可能会在运行之间发生变化。
授权经理
HTTP(S) 测试脚本记录器获取“身份验证”标头,尝试计算身份验证策略。如果手动将授权管理器添加到目标控制器,HTTP(S) 测试脚本记录器将找到它并添加授权(匹配的将被删除)。否则,授权管理器将被添加到具有授权对象的目标控制器中。您可能必须在记录后修复自动计算的值。
上传文件
某些浏览器(例如 Firefox 和 Opera)在上传文件时不包含文件的全名。这可能会导致 JMeter 代理服务器失败。一种解决方案是确保要上传的任何文件都在 JMeter 工作目录中,方法是复制那里的文件或在包含文件的目录中启动 JMeter。
记录 JMeter 本身不可用的基于 HTTP 的非文本协议
您可能必须记录 JMeter 默认不处理的 HTTP 协议(自定义二进制协议、Adobe Flex、Microsoft Silverlight 等)。尽管 JMeter 没有提供本地代理实现来记录这些协议,但您可以通过实现自定义SamplerCreator来记录这些协议。此 Sampler Creator 会将二进制格式转换为HTTPSamplerBase子类,该子类可以添加到 JMeter 测试用例中。有关更多详细信息,请参阅“扩展 JMeter”。
HTTP 镜像服务器¶
HTTP 镜像服务器是一个非常简单的 HTTP 服务器——它只是镜像发送给它的数据。这对于检查 HTTP 请求的内容很有用。
它使用默认端口8081。
参数 ¶
参数 ¶
headerA: valueA|headerB: valueB会将 headerA 设置为valueA ,将headerB设置为valueB。
您还可以使用以下查询参数:
参数 ¶
调试采样器¶
Debug Sampler 生成一个包含所有 JMeter 变量和/或属性值的样本。
这些值可以在View Results Tree Listener Response Data 窗格中看到。
参数 ¶
调试后处理器¶
Debug PostProcessor 使用先前的 Sampler 属性、JMeter 变量、属性和/或系统属性的详细信息创建一个 subSample。
这些值可以在View Results Tree Listener Response Data 窗格中看到。
参数 ¶
测试片段¶
测试片段与Include Controller和Module Controller一起使用。
拆线线程组¶
一种特殊类型的 ThreadGroup,可用于执行测试后操作。这些线程的行为与普通的线程组元素完全一样。不同之处在于这些类型的线程在测试完成执行其常规线程组之后执行。