“JMeter”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
 
(未显示同一用户的14个中间版本)
第1行: 第1行:
 
https://jmeter.apache.org/
 
https://jmeter.apache.org/
  
<syntaxhighlight lang="powershell">
+
=== 不要使用 GUI 模式进行负载测试! ===
 +
仅在测试创建和调试阶段使用 GUI 模式。
 +
 
 +
负载测试应使用 CLI 模式(非 GUI 模式),命令格式如下:<syntaxhighlight lang="powershell">
 
jmeter -n -t [测试脚本.jmx] -l [结果文件.jtl] -e -o [网页报告输出路径]
 
jmeter -n -t [测试脚本.jmx] -l [结果文件.jtl] -e -o [网页报告输出路径]
 
</syntaxhighlight>
 
</syntaxhighlight>
  
* JSR223 PreProcessor 是 JMeter 中更高效的前置处理器
+
例:<syntaxhighlight lang="console">
<syntaxhighlight lang="console">
+
K:\record\2019\8\8\apache-jmeter-5.1.1\bin\jmeter -n -t K:\record\2025\07\10\test_jmeter.jmx -l K:\record\2025\07\10\结果文件.jtl -e -o K:\record\2025\07\10\report.html
 +
</syntaxhighlight>
 +
 
 +
 
 +
=== 建议根据测试需求调整 Java 堆内存大小 ===
 +
修改 JMeter 批处理文件(<code>jmeter.bat</code>或<code>jmeter.sh</code>)中的环境变量:<syntaxhighlight lang="console">
 +
HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"
 +
</syntaxhighlight>
 +
 
 +
 
 +
 
 +
=== JSR223 PreProcessor 前置处理器 ===
 +
JSR223 PreProcessor 是 JMeter 中更高效的前置处理器<syntaxhighlight lang="console">
 
// 获取 JMeter 变量
 
// 获取 JMeter 变量
 
def fileDir = vars.get("fileDir")  // 文件路径变量
 
def fileDir = vars.get("fileDir")  // 文件路径变量
第18行: 第33行:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
* JSR223 提供了内置的 <code>log</code> 对象,支持不同级别的日志输出。日志会记录到 JMeter 的日志文件(<code>jmeter.log</code>)中。
+
 
* <syntaxhighlight lang="console">
+
 
 +
=== 日志 ===
 +
JSR223 提供了内置的 <code>log</code> 对象,支持不同级别的日志输出。日志会记录到 JMeter 的日志文件(<code>jmeter.log</code>)中。<syntaxhighlight lang="console">
 
log.debug("这是调试信息,仅在调试模式显示")
 
log.debug("这是调试信息,仅在调试模式显示")
 
log.info("这是普通信息")
 
log.info("这是普通信息")
 
log.warn("这是警告信息")
 
log.warn("这是警告信息")
 
log.error("这是错误信息")
 
log.error("这是错误信息")
 +
</syntaxhighlight>JMeter 默认会在 启动目录 生成 <code>jmeter.log</code>,但需要确保:
 +
 +
1.日志级别正确:
 +
 +
编辑 JMeter 安装目录下的 <code>jmeter.properties</code> 文件,确保以下配置未被注释且级别为 <code>INFO</code> 或更低:<syntaxhighlight lang="console">
 +
# 取消注释并设置为 INFO 或 DEBUG
 +
log_level.jmeter=INFO
 +
log_level.jmeter.util=INFO
 +
</syntaxhighlight>2.日志文件路径未被修改:
 +
 +
确认 <code>jmeter.properties</code> 中没有自定义日志路径(搜索 <code>log_file</code> 字段,确保其被注释或指向正确路径):<syntaxhighlight lang="console">
 +
#log_file=jmeter.log  # 默认注释状态,使用启动目录
 +
</syntaxhighlight>
 +
 +
 +
 +
=== Groovy 读文件 ===
 +
1.读取文本文件为字符串:<syntaxhighlight lang="console">
 +
// 获取 JMeter 变量
 +
def fileDir = vars.get("fileDir")  // 文件路径变量
 +
def filePath = fileDir + "/data.txt"
 +
 +
// 读取文件内容
 +
def fileContent = new File(filePath).text
 +
 +
// 保存到 JMeter 变量
 +
vars.put("fileData", fileContent)
 +
</syntaxhighlight>2.逐行读取文件(适用于大文件):<syntaxhighlight lang="console">
 +
def filePath = "/path/to/large_file.csv"
 +
def lines = []
 +
 +
new File(filePath).eachLine { line ->
 +
    lines.add(line)
 +
    // 可添加条件中断读取
 +
    if (lines.size() >= 100) return false
 +
}
 +
 +
vars.put("first100Lines", lines.join("\n"))
 +
</syntaxhighlight>
 +
 +
=== 前置处理器和后置处理器的执行顺序 ===
 +
按取样器从上到下的顺序,父级组件>同级组件>子级组件
 +
[[文件:Jmeter中处理器的执行顺序.png]]
 +
 +
jmeter接口测试其实就是取样器的执行过程,只不过通过不同的辅助元件产生不同特殊效果。
 +
 +
 +
=== 配置Jmeter日志 ===
 +
%jmeter_home%\bin\log4j2.xml<syntaxhighlight lang="xml">
 +
    <File name="jmeter-log" fileName="${sys:jmeter.logfile:-jmeter.log}" append="false">
 +
      <PatternLayout>
 +
        <pattern>[%d] [%p] [%t] [%c{1.}]: %m%n</pattern>
 +
      </PatternLayout>
 +
    </File>
 +
</syntaxhighlight>默认没有 %t 输出线程ID,也没有"[]",日志不易读
 +
 +
=== 执行命令和记录日志 ===
 +
<syntaxhighlight lang="bat">
 +
E:\record\2025\07\23>K:\record\2019\8\8\apache-jmeter-5.1.1\bin\jmeter -n -t "E:\record\2025\07\22\HTTP Request.jmx" -l "E:\record\2025\07\23\result.jtl" -f
 +
</syntaxhighlight>默认在哪执行命令,日志就输出在哪个路径里了,像上面这个命令日志就输出到 <code>E:\record\2025\07\23</code> 这个目录下面了
 +
 +
=== 用 JSR 223 后置处理器 log 响应内容 ===
 +
<syntaxhighlight lang="groovy">
 +
// 获取响应内容(字符串格式)
 +
String responseBody = prev.getResponseDataAsString()
 +
 +
// 打印完整响应内容到日志
 +
log.info("响应内容:" + responseBody)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
=== 用 JSR 223 前置处理器 log 请求内容 ===
 +
<syntaxhighlight lang="groovy">
 +
// 获取请求 URL
 +
String url = sampler.getUrl().toString()
 +
log.info("请求 URL:" + url)
 +
 +
// 获取请求方法(GET/POST 等)
 +
String method = sampler.getMethod()
 +
log.info("请求方法:" + method)
 +
 +
// 获取请求参数(适用于 GET 或 POST 表单参数)
 +
def params = sampler.getArguments()
 +
if (params != null && params.size() > 0) {
 +
    StringBuilder paramStr = new StringBuilder()
 +
    params.each { arg ->
 +
        paramStr.append(arg.getName()).append("=").append(arg.getValue()).append("&")
 +
    }
 +
    log.info("请求参数:" + paramStr.toString().replaceAll("&$", "")) // 去除末尾多余的&
 +
}
 +
 +
// 获取请求体(适用于 POST 等带 body 的请求,如 JSON/XML)
 +
String requestBody = sampler.getArguments().getArgument(0)?.getValue()
 +
if (requestBody) {
 +
    log.info("请求体:" + requestBody)
 +
}
 +
</syntaxhighlight>
 
*
 
*

2025年7月23日 (三) 15:37的最新版本

https://jmeter.apache.org/

不要使用 GUI 模式进行负载测试!

仅在测试创建和调试阶段使用 GUI 模式。

负载测试应使用 CLI 模式(非 GUI 模式),命令格式如下:

jmeter -n -t [测试脚本.jmx] -l [结果文件.jtl] -e -o [网页报告输出路径]

例:

K:\record\2019\8\8\apache-jmeter-5.1.1\bin\jmeter -n -t K:\record\2025\07\10\test_jmeter.jmx -l K:\record\2025\07\10\结果文件.jtl -e -o K:\record\2025\07\10\report.html


建议根据测试需求调整 Java 堆内存大小

修改 JMeter 批处理文件(jmeter.batjmeter.sh)中的环境变量:

HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"


JSR223 PreProcessor 前置处理器

JSR223 PreProcessor 是 JMeter 中更高效的前置处理器

// 获取 JMeter 变量
def fileDir = vars.get("fileDir")  // 文件路径变量
def filePath = fileDir + "/data.txt"

// 读取文件内容
def fileContent = new File(filePath).text

// 保存到 JMeter 变量
vars.put("fileData", fileContent)


日志

JSR223 提供了内置的 log 对象,支持不同级别的日志输出。日志会记录到 JMeter 的日志文件(jmeter.log)中。

log.debug("这是调试信息,仅在调试模式显示")
log.info("这是普通信息")
log.warn("这是警告信息")
log.error("这是错误信息")

JMeter 默认会在 启动目录 生成 jmeter.log,但需要确保:

1.日志级别正确:

编辑 JMeter 安装目录下的 jmeter.properties 文件,确保以下配置未被注释且级别为 INFO 或更低:

# 取消注释并设置为 INFO 或 DEBUG
log_level.jmeter=INFO
log_level.jmeter.util=INFO

2.日志文件路径未被修改: 确认 jmeter.properties 中没有自定义日志路径(搜索 log_file 字段,确保其被注释或指向正确路径):

#log_file=jmeter.log  # 默认注释状态,使用启动目录


Groovy 读文件

1.读取文本文件为字符串:

// 获取 JMeter 变量
def fileDir = vars.get("fileDir")  // 文件路径变量
def filePath = fileDir + "/data.txt"

// 读取文件内容
def fileContent = new File(filePath).text

// 保存到 JMeter 变量
vars.put("fileData", fileContent)

2.逐行读取文件(适用于大文件):

def filePath = "/path/to/large_file.csv"
def lines = []

new File(filePath).eachLine { line ->
    lines.add(line)
    // 可添加条件中断读取
    if (lines.size() >= 100) return false
}

vars.put("first100Lines", lines.join("\n"))

前置处理器和后置处理器的执行顺序

按取样器从上到下的顺序,父级组件>同级组件>子级组件 Jmeter中处理器的执行顺序.png

jmeter接口测试其实就是取样器的执行过程,只不过通过不同的辅助元件产生不同特殊效果。


配置Jmeter日志

%jmeter_home%\bin\log4j2.xml

    <File name="jmeter-log" fileName="${sys:jmeter.logfile:-jmeter.log}" append="false">
      <PatternLayout>
        <pattern>[%d] [%p] [%t] [%c{1.}]: %m%n</pattern>
      </PatternLayout>
    </File>

默认没有 %t 输出线程ID,也没有"[]",日志不易读

执行命令和记录日志

E:\record\2025\07\23>K:\record\2019\8\8\apache-jmeter-5.1.1\bin\jmeter -n -t "E:\record\2025\07\22\HTTP Request.jmx" -l "E:\record\2025\07\23\result.jtl" -f

默认在哪执行命令,日志就输出在哪个路径里了,像上面这个命令日志就输出到 E:\record\2025\07\23 这个目录下面了

用 JSR 223 后置处理器 log 响应内容

// 获取响应内容(字符串格式)
String responseBody = prev.getResponseDataAsString()

// 打印完整响应内容到日志
log.info("响应内容:" + responseBody)

用 JSR 223 前置处理器 log 请求内容

// 获取请求 URL
String url = sampler.getUrl().toString()
log.info("请求 URL:" + url)

// 获取请求方法(GET/POST 等)
String method = sampler.getMethod()
log.info("请求方法:" + method)

// 获取请求参数(适用于 GET 或 POST 表单参数)
def params = sampler.getArguments()
if (params != null && params.size() > 0) {
    StringBuilder paramStr = new StringBuilder()
    params.each { arg ->
        paramStr.append(arg.getName()).append("=").append(arg.getValue()).append("&")
    }
    log.info("请求参数:" + paramStr.toString().replaceAll("&$", "")) // 去除末尾多余的&
}

// 获取请求体(适用于 POST 等带 body 的请求,如 JSON/XML)
String requestBody = sampler.getArguments().getArgument(0)?.getValue()
if (requestBody) {
    log.info("请求体:" + requestBody)
}