jMeter 流水賬

前段時間做 QA 的活兒, 一直在弄 jMeter, 用來測試后端服務(wù). 做的不是 API 壓測, 而是走 user journey, 所以還挺有意思的. (壓測有啥意思啊...)

基本工作流程就是 1) 用 jMeter 抓包, 錄 req, res; 2) 整理 req, res 提取出關(guān)鍵變量; 3) 處理一些特殊情況, 做 fallback, 好把 user journey 走完.

這個過程中 2) 最有意思. 我做的工作基本是看 api 返回結(jié)果, 然后看前端代碼 (iPad 客戶端, 用的 react native) 的處理邏輯, 模仿它的處理流程對數(shù)據(jù)做相應(yīng)的操作, 然后發(fā) request, 直到把 user journey 走到頭.

之前這是一個 QA (稱之為 z) 在做, 后來我接了. 然后我發(fā)現(xiàn)... 特么這 QA 根本沒法做. 因?yàn)?QA 對后端 API (如果你知道后端 DAO 的格式, 你就知道數(shù)據(jù)結(jié)構(gòu)長啥樣) 以及前端數(shù)據(jù)操作 (你不知道 react native 代碼里對后端來的數(shù)據(jù)怎么操作, 你怎么進(jìn)行下一步, 發(fā)送 request?) 都不可能太了解, 也不大有臨時去翻代碼的耐心. 深深為 QA 還要做這個活感到亞歷山大. 所以, 或許, 這就該是個 DEV 的工作 (一個前后端代碼都寫的 DEV). 你得了解數(shù)據(jù)流以及這個過程中的數(shù)據(jù)轉(zhuǎn)化, 才能走完這 user journey.

我們的 z 在寫 jMeter 的時候, 錯誤的用了 Java. 明顯不對. 因?yàn)槲覀兦昂蠖藬?shù)據(jù)都是 JSON, 用 Java 來操作 JSON 實(shí)在太麻煩了. (而且我早就沒有了手寫 Java 的勇氣) jMeter 通過 JSR 223 (Java 腳本平臺) 支持多種腳本來撰寫測試邏輯, 大概有 Java, Groovy, BeanShell script, jexl (Java Expression Language), javascript. 我就不論證 javascript 怎么特別特別好, 特別適合我們的情況了. 都是友軍襯托的好, Java 和 groovy 能用嗎? beanshell 和 jexl 根本是歷史遺留語言... Anyway, 我用了 javascript.

下面是流水賬.


定義 pwd, 好加載 js 腳本文件, 在 User Defined Variables 加入 pwd: ${__BeanShell(import org.apache.jmeter.services.FileServer; FileServer.getFileServer().getBaseDir())}, 這樣就能在 js sampler 里用:
load(vars.get("pwd") + "/js/utils.js") 加載相關(guān)的函數(shù)和變量.

一些 js snippets:

// vars 是 get 和 put, 剛開始用成了 set 害我好久不知道為啥值就是設(shè)置不進(jìn)去...
vars.put("offset", (${__threadNum}-1)*${dealers_per_batch});

var numberOfCarPlates = parseInt(vars.get("car_plate_numbers_#"));
for (var i = 0; i < numberOfCarPlates; i++) {
    var car_plate_number = vars.get("car_plate_numbers_" + (i + 1));
    ...
}

var sa2carPlateNumbers = JSON.parse(vars.get("sa2carPlateNumbers")) || {};

vars.put("pre_inspection_maps", prev.getResponseDataAsString());

//
function jMeterPut(store, jmKey, jmValues) {
  store.put(jmKey + "_#", jmValues.length);
  for (var i = 0; i < jmValues.length; i++) {
    store.put(jmKey + "_" + (i + 1), jmValues[i]);
  }
}

JDBC Request snippets:

SELECT DISTINCT dealer_id
FROM user
  INNER JOIN user_group ON user.id = user_group.user_id
WHERE dms_user_id = 'PMT'
ORDER BY dealer_id
LIMIT ${dealers_per_batch} OFFSET ${offset};

SELECT dms_dealer_code
FROM outlet
WHERE id = '${dealer_id}'
LIMIT 1;

一些 one liner, 當(dāng)變量使:

${__Random(17500000000,17501111111,telephone)}

${__javaScript('側(cè)視'+'一二三四五六七八九十'[parseInt(Date.now()*Math.random())%10]+'甲乙丙丁戊己庚辛壬癸'[Date.now()%10],name)}

// 哪個方便用哪個, groovy 也不錯
${__groovy(new Date().format("yyyy-MM-dd HH:mm:ss"),)}

${__javaScript(new Date(Date.now() - (24-8)*60*60*1000).toISOString())}

// 記得用 Function Helper 生成和測試這些 one liner, 但可惜
// function helper 不會幫你轉(zhuǎn)義逗號, 你需要自己加
${__javaScript(var a=[];[1\,2\,3\,4\,5\,6\,7\,8\,9].forEach(function(i){return a.push("0"+i);});a=a.sort(function(){return Math.random() < 0.5;}).splice(0\,1+parseInt( Math.random()*9)).sort();JSON.stringify(a) ,)}

${__javaScript(var x=new Date(Date.now()+Math.random()*10*24*60*60*1000);x.setMinutes(0);x.setSeconds(0);x.setMilliseconds(0);x.toISOString(),)}

JSON extractor 如果只有一個變量, 不需要寫 default value. 如果有多個變量, 則需要用 ; 號分隔, 而且必須要有 default value. 不然提取不出來.

jMeter 的變量都是 string, 所以不要往變量里面存 boolean 之類的數(shù)據(jù)類型, 請存入 "true" 和 "false" 字符串 (復(fù)合結(jié)構(gòu)用 JSON.stringify, JSON.parse 來序列化). 用 If Controller 的時候, 也要使用 "${should_confirm}" === "true" 來做判斷 (兩邊都有引號). 一些栗子:

  • "${selected_owner_id}" !=== ""
  • Math.random() > ${dos_event_threshold}
  • "true" === "false" (turn off controller)

Supplementary

執(zhí)行順序

變量和函數(shù)

http://jmeter.apache.org/usermanual/functions.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怜械,隨后出現(xiàn)的幾起案子傅事,更是在濱河造成了極大的恐慌峡扩,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件响鹃,死亡現(xiàn)場離奇詭異巍佑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門脆栋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椿争,你說我怎么就攤上這事熟嫩。” “怎么了掸茅?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵昧狮,是天一觀的道長。 經(jīng)常有香客問我逗鸣,道長,這世上最難降的妖魔是什么透葛? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任卿樱,我火速辦了婚禮,結(jié)果婚禮上殿如,老公的妹妹穿的比我還像新娘最爬。我一直安慰自己门岔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布糠悯。 她就那樣靜靜地躺著妻往,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纫普。 梳的紋絲不亂的頭發(fā)上好渠,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音拳锚,去河邊找鬼。 笑死匾荆,一個胖子當(dāng)著我的面吹牛杆烁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播连躏,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拍棕!你這毒婦竟也來了勺良?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蠢箩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谬泌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陪蜻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年贱鼻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片症昏。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡父丰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出分苇,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布蘑斧,位于F島的核電站须眷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏花颗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一庸论、第九天 我趴在偏房一處隱蔽的房頂上張望棒呛。 院中可真熱鬧,春花似錦簇秒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽编曼。三九已至,卻和暖如春灵巧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刻肄。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工敏弃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麦到。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓瓶颠,卻偏偏與公主長得像拟赊,于是被迫代替她去往敵國和親粹淋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容