Jmeter实操遇到的问题及解决办法

目录

一、Jmeter的下载与安装

二、Jmeter实操遇到的问题

场景1:正则表达式提取特殊字符

场景2:int64转换为base58

场景3:数据解耦


一、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)对于需要多次执行的请求,设置循环控制器的循环次数,可实现同一个线程组下,单个请求设置对应的执行次数

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值