目录
一、Jmeter的下载与安装
首先来看下Jmeter下载安装步骤,大神请忽略!
官网最新版本下载地址:https://jmeter.apache.org/download_jmeter.cgi
选择Binaries(二进制版,即已经编译好、可直接执行),根据需要下载对应的包即可。
Jmeter目录解析:首先将下载的zip包解压到自己想要放的目录
jdk下载:需要下载对应的jdk,我下载的是jdk1.8
配置环境变量:
- 在系统变量-点击“新建”,建立一个变量:JMETER_HOME,选择浏览目录为你解压的jmeter安装路径
- 配置classpath变量,如果找不到,也可直接配置Path,新建变量值:%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar;
- 最后一定要保存生效
Windows和MacOS下安装启动
- 解压下载的安装包
- 进入解压后的apache-jmeter-X.X.X/bin目录
- 双击jmeter.bat文件或者ApacheJmeter.jar文件,两者都可启动。区别在于:使用jmeter.bat启动会多启动一个cmd窗口,如果关闭cmd窗口,jmeter界面也会关闭,使用ApacheJmeter.jar启动可直接启动jmeter的gui界面。
Jmeter切换语言为中文
找到你安装jmeter目录下的bin目录,打开jmeter.properties文件,找到#language=en,将其修改为:language=zh-cn,不注释。
设置Jmeter主题
Jmeter打开后默认主题是黑色的,换成白色背景,点击选项-->外观-->Windows
二、Jmeter实操遇到的问题
在之前的文章中我们学习了Jmeter基本知识和测试实操步骤,本文主要讲解在实操过程中遇到的问题以及解决办法。
场景1:正则表达式提取特殊字符
问题1:在正则表达式提取器提取想要的变量时,包含特殊字符时如何编写想要的正则表达式?
回答1:特殊字符,如加号“+”需要加转义字符\,否则会按照特殊字符处理,正则表达式无法判别。
场景2:int64转换为base58
问题2:有的请求接口的传参是需要将int64转换为base58模式,如何解决?
回答2:
- 添加一个JSR233元件在测试计划中。可以在测试计划中的任何位置添加该元件。
- 在JSR233预处理程序元件的脚本框中,选择语言:Groovy,使用以下代码来生成随机的int64数据并将其转换为base58数据:
import java.math.BigInteger
def base58_encode(String int64) {
def encodeMap = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
def num = BigInteger.valueOf(Math.abs(int64.toLong()))
def base = BigInteger.valueOf(58)
def res = new StringBuilder()
while (num.compareTo(base) >= 0) {
res.append(encodeMap[num.mod(base).intValue()])
num = num.divide(base)
}
res.append(encodeMap[num.intValue()])
return res.reverse().toString()
}
def base58_decode(String base58) {
def encodeMap = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
def num = BigInteger.ZERO
def isNegative = false
if (base58[0] == '-') {
isNegative = true
base58 = base58.substring(1)
}
for (test1 in base58) {
num = num.multiply(BigInteger.valueOf(58)).add(BigInteger.valueOf(encodeMap.indexOf(test1 as String)))
}
if (isNegative) {
num = num.negate()
}
return num
}
def encodeMap = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
def base58_instance = [encode: { input -> base58_encode(input) }, decode: { input -> base58_decode(input) }]
import java.util.Random
def random = new Random()
def int64 = random.nextLong()
println int64
def encoded = base58_instance.encode(int64.toString())
println("Encoded: " + encoded)
def decoded = base58_instance.decode(encoded)
println("Decoded: " + decoded)
vars.put("encodedData", encoded)
log.info("base58编码成功")
vars.put("decodedData", decoded.toString())
log.info("base58解码成功")
- 点击“运行”按钮运行测试计划。
- 可以在其他HTTP请求中使用该变量的值作为请求参数的值。例如,如果HTTP请求中有一个名为“data”的参数,可以将其值设置为${encodedData}。有的参数类型是map[string]string类型,传参时不包含引号在设置传参时可设置为:${__eval(${encodeData})}
场景3:数据解耦
问题3:添加应用成功后,需要保证前后数据一致,保证每次场景流程化,添加应用通过CSV文件导入,但是获取应用信息和删除操作可能不需要那么多的线程,如何解决呢?在同一个线程组下,每个请求执行的次数不一致,该如何保证每次数据都正常呢?
回答3:
(1)在线程组中添加循环控制器(线程组-->右键添加-->逻辑控制器-->循环控制器)
(2)对于需要多次执行的请求,设置循环控制器的循环次数,可实现同一个线程组下,单个请求设置对应的执行次数