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;
}