Jmeter:JSR223 常用脚本(Groovy)

Json 相关

解析 Response

import groovy.json.JsonSlurper
def responseStr = prev.getResponseDataAsString()
def jsonSlurper = new JsonSlurper()
// String 转 Object,通过 mData["key"] 获取值
def mData = jsonSlurper.parseText(responseStr)

解析 SQL查询结果

import groovy.json.JsonSlurper
import groovy.json.JsonOutput
// 假设Result variable name设置为:data
def jsonString = JsonOutput.toJson(vars.getObject("data"))
def jsonSlurper = new JsonSlurper()
// String 转 Object,通过 jsonObject["key"] 获取值
def jsonObject = jsonSlurper.parseText(jsonString)

打印 Json

import groovy.json.JsonOutput

def book = new Book(id: 1, name: 'Thinking in Java')
def jsonOutput = new JsonOutput()
def result = jsonOutput.toJson(book)
//普通输出
println(result)
//格式化输出
println(jsonOutput.prettyPrint(result))

AssertResult相关

常用断言封装

void assertEqual(Object expect, String expectDesc, Object actual, String actualDesc) {
    if (expect != actual) {
        def errorMessage = "\'" + expectDesc + "\'" + " is not equal " + "\'" + actualDesc + "\'" + " ,expect: " + expect + " , but got: " + actual
        AssertionResult.setResultForFailure(errorMessage)
    }else {
    	def successMessage = "\'" + expectDesc + "\'" + " is equal " + "\'" + actualDesc + "\'" + " ,expect: " + expect + " , got: " + actual
    	  log.info("successMessage---" + successMessage)
    }
}

Thread相关

获取线程总数

// JSR223 脚本
ctx.getThreadGroup().getNumThreads()

// ${__groovy(,)}函数调用
${__groovy(org.apache.jmeter.threads.JMeterContextService.getNumberOfThreads())}

// 通过以下方法获取,会有一个 warn 级别的报错
${__groovy(ctx.getThreadGroup().getNumThreads(),)}

获取当前线程号

// Jmeter函数,适合调试
${__threadNum}

获取当前脚本路径

原因:在使用sample 的 upload file 功能时,传入 相对路径./uploadFile.pdf 会产生未知错误,需要传入绝对路径。所以提前获取当面脚本路径

import org.apache.jmeter.services.FileServer; 
FileServer.getFileServer().getBaseDir();

# 直接调用
${__groovy(import org.apache.jmeter.services.FileServer; FileServer.getFileServer().getBaseDir();,)}

获取指定Cookie

import org.apache.jmeter.protocol.http.control.Cookie
import org.apache.jmeter.protocol.http.control.CookieManager

def cookieManager = sampler.getCookieManager()
def size = cookieManager.getCookies().size()
for (i in 0..<size) {
    def cookie = cookieManager.get(i)
    /*SESSION为指定的cookie的name*/
    if ("SESSION" == cookie.getName()) {
        vars.put("sessionName", cookie.getName())
        vars.put("sessionValue", cookie.getValue())
        vars.put("sessionDomain", cookie.getDomain())
        vars.put("sessionPath", cookie.getPath())
    } else {
        log.error("-------Cookies : " + cookie.getName() + "----------- " + cookie.getValue())
    }
}

Header 相关

Property 相关

操作Property

Property是全线程共享,概念类似Java Class中的全局变量
在 JSR223 脚本中设置Property,不可直接调用 Jmeter 函数:${__setProperty(,,)}

需要设置、获取Property,可以调用以下方法:

import org.apache.jmeter.util.JMeterUtils
// 通过该方法只能设置 String 类型的value
JMeterUtils.setProperty("key", "value")
JMeterUtils.getProperty("key")
posted @ 2021-04-08 16:44  Feng1024  阅读(1887)  评论(1编辑  收藏  举报