Jmeter:JSR223腳本常見功能實現(JavaScript)


Json處理(JS)

對於Json字符串,需要使用單引號『''』(因為Json中已存在雙引號)

// String轉為Object
var jsonObj = JSON.parse('${data}');

// Object轉為String
var jsonStr = JSON.stringify(jsonObj);

// 獲取數組長度(直接通過length)
var len = obj.list.length;

獲取當前Sample返回值,並轉為Json

var response = prev.getResponseDataAsString();
var mData = JSON.parse(response);

緩存

存在一個默認勾選項:『如果可用,緩存編譯腳本』,勾選后,不僅是腳本被緩存,其中的數據也會被緩存而不會更新(包括變量),如:

// 此處的${api}會編譯為String,然后每次解析的都會是首次傳入的變量
var jsonObj = JSON.parse('${api}');
vars.put("_id",jsonObj._id);

移除變量

vars.remove("data");

生成隨機時間

通過組合使用Jmeter函數助手:__timeShift和__Random

# 使用:"${__timeShift(yyyy-MM-dd HH:mm:ss,,-PT${__Random(1,30000,)}H${__Random(1,300,)}M,,)}"

其中__timeShift的用法:
    "PT20.345S" -- parses as "20.345 seconds"
    "PT15M"     -- parses as "15 minutes" (where a minute is 60 seconds)
    "PT10H"     -- parses as "10 hours" (where an hour is 3600 seconds)
    "P2D"       -- parses as "2 days" (where a day is 24 hours or 86400 seconds)
    "P2DT3H4M"  -- parses as "2 days, 3 hours and 4 minutes"
    "P-6H3M"    -- parses as "-6 hours and +3 minutes"
    "-P6H3M"    -- parses as "-6 hours and -3 minutes"
    "-P-6H+3M"  -- parses as "+6 hours and -3 minutes"

注意:使用H,M,S時,必須有T,T出現在H,M,S前,D后,如:P2DT3H4M。如沒有D,則在P后,如:-PT6H3M。參考:https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html#parse-java.lang.CharSequence-

數組取隨機index

var temp = ["1","2","3","4","5"];
temp[Math.floor((Math.random()*temp.length))];

判斷字符串是否包含(JS)

"${__V(title,)}".indexOf("測試") != -1

當變量不存在時,才設置變量(JS)

// 一般只適用於host及登錄,否則有坑:如果在后續使用中需要修改該參數,則該方法無效
function setDefaultVar(varName,value){
	if (vars.get(varName) == null) {
		log.info("--------------- "+varName+" is not set, use: "+ value +" ---------------")
		vars.put(varName, value);
	}
}

獲取任意范圍內隨機整數

// 隨機獲取范圍內的整數
function random(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
};

從數組中隨機選擇一個

// 從數組中,隨機選擇一個
function randomChooice(array){
	return array[Math.floor(Math.random() * array.length)];
}

從對象中隨機選擇key(typescript代碼,需轉為JS才能在Jmeter使用)

private randomKeyInObject(obj: { [k: string]: string }) {
        let keys = Object.keys(obj)
        let randomIndex = Math.floor(Math.random() * keys.length);
        return keys[randomIndex];
    }

把數組設置為X個單獨變量

// 把數組設置為X個單獨變量
function arrayToVars(prefixKey, array) {
    for (var index = 0; index < array.length; index++) {
        var key = prefixKey + "_" + (index + 1);
        vars.put(key, array[index]);
    }
}

使用自己的『四舍五入』方法

// 修改toFixe,在Jmeter中非常不友好所以使用自己的方法
function toFixed(num, len) {
    if (len === void 0) { len = 2;}
    // Jmeter中不能使用:Number.EPSILON(ES6才出來)
    return Math.round((Number(num) + 2.2204460492503130808472633361816E-16) * Math.pow(10, len)) / Math.pow(10, len);
}

AssertionResult封裝

// 斷言是否相等(數字與字符類型分別處理)
function assertEqual(expect, actual, errorMsg) {
    var numberReg=/^-?[0-9]+.?[0-9]*$/;
    if(numberReg.test(expect) && numberReg.test(actual)){
        if (Number(expect) != Number(actual)) {
            AssertionResult.setResultForFailure(errorMsg + ":" + " ,expect: " + expect + " , but got: " + actual);
        }
    }else {
        if (expect != actual) {
            AssertionResult.setResultForFailure(errorMsg + ":" + " ,expect: " + expect + " , but got: " + actual);
        }
    } 
}

獲取默認變量

// 獲取變量,如沒有,則返回:defaultValue
function getVarWithDefault(varName,defaultValue){
	var theVar = vars.get(varName);
	if(theVar == null){
		theVar = defaultValue;
	}
	return theVar;
}

Loop循環中獲取子變量

// Loop循環中獲取子變量,需配合計數器使用,loopFlag為計數器的引用名稱,默認為index
function getSubVarInLoop(prefix, loopFlag) {
    if (loopFlag === void 0) loopFlag = "index";
    var key = prefix + "_" + vars.get(loopFlag);
    return vars.get(key);
}

解決JavaScript浮點數相加出現多位小數的Bug

// 解決JavaScript浮點數相加出現多位小數的Bug
function toDecimal(x) {
    var val = Number(x)
    if (!isNaN(parseFloat(val))) {
        val = val.toFixed(2);
    }
    return val;
}

修改toFixed為『四舍五入』,而不是『四舍六入五留雙』

Number.prototype.toFixed = function (len) {
    if (len > 20 || len < 0) {
        throw new RangeError('toFixed() digits argument must be between 0 and 20');
    }
    // .123轉為0.123
    var number = Number(this);
    if (isNaN(number) || number >= Math.pow(10, 21)) {
        return number.toString();
    }
    if (typeof (len) == 'undefined' || len == 0) {
        return (Math.round(number)).toString();
    }
    var result = number.toString(),
        numberArr = result.split('.');

    if (numberArr.length < 2) {
        //整數的情況
        return padNum(result);
    }
    var intNum = numberArr[0], //整數部分
        deciNum = numberArr[1],//小數部分
        lastNum = deciNum.substr(len, 1);//最后一個數字

    if (deciNum.length == len) {
        //需要截取的長度等於當前長度
        return result;
    }
    if (deciNum.length < len) {
        //需要截取的長度大於當前長度 1.3.toFixed(2)
        return padNum(result)
    }
    //需要截取的長度小於當前長度,需要判斷最后一位數字
    result = intNum + '.' + deciNum.substr(0, len);
    if (parseInt(lastNum, 10) >= 5) {
        //最后一位數字大於5,要進位
        var times = Math.pow(10, len); //需要放大的倍數
        var changedInt = Number(result.replace('.', ''));//截取后轉為整數
        var fu = 1/changedInt < 0;// 為true 時,則 changedInt < 0 或者 changedInt = -0,否則為正數或等於0
        if(fu){
            changedInt--;//整數進位
        }else{
            changedInt++;//整數進位
        }
        changedInt /= times;//整數轉為小數,注:有可能還是整數
        result = padNum(changedInt + '');
    }
    return result;
    //對數字末尾加0
    function padNum(num) {
        var dotPos = num.indexOf('.');
        if (dotPos === -1) {
            //整數的情況
            num += '.';
            for (var i = 0; i < len; i++) {
                num += '0';
            }
            return num;
        } else {
            //小數的情況
            var need = len - (num.length - dotPos - 1);
            for (var j = 0; j < need; j++) {
                num += '0';
            }
            return num;
        }
    }
};

在string中去除某string

# 在toBeDelete(string)中去除deleteWhat(string)
function deleteString(toBeDelete, deleteWhat, splitChar) {
  var toBeDelete = toBeDelete.split(",");
  var deleteWhat = deleteWhat.split(",");
  for (var i = 0; i < toBeDelete.length; i++) {
    for (var j = 0; j < deleteWhat.length; j++) {
      if (deleteWhat[j] === toBeDelete[i]) {
        var temp = toBeDelete.splice(i--, 1);
        log.info("delete string: " + temp);
      }
    }
  }
  return toBeDelete.join(splitChar);
}

var result = deleteString("1,42,12,33,6,642,118", "42,36,118,62,27,12,53", ",");
console.log(result);

生成范圍內的隨機日期

// 范圍內的隨機日期,不帶時分秒
function randomDate(startDate,EndDate){
    var st = startDate.split('-');
    var et = EndDate.split('-');
    var startTime = new Date(st[0], st[1] - 1, st[2]).getTime();
    var endTime = new Date(et[0], et[1] - 1, et[2]).getTime();
    var formatTime = function(time, spliter = '-') {
        var date = new Date(time);
        var year = date.getFullYear();
        var month = (date.getMonth() + 1) >= 10 ? (date.getMonth() + 1) : '0' + (date.getMonth() + 1);
        var day = date.getDate() >= 10 ? date.getDate() : '0' + date.getDate();
        return `${year}${spliter}${month}${spliter}${day}`
    }
    var random = function(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    };
    i = random(startTime,endTime);
    var result = formatTime(i, '')
    return result;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM