記錄jmeter使用beanshell斷言獲取復(fù)雜的json字符串參數(shù)值

實(shí)戰(zhàn)示例

測(cè)試場(chǎng)景
  • 電商系統(tǒng)經(jīng)常會(huì)涉及到商品的庫(kù)存數(shù)量的壓測(cè)隔心,在用戶下單前需要先做庫(kù)存余量的判斷坎缭,當(dāng)余量不足時(shí)用戶無(wú)法下單竟痰,保證商品的有效售賣
庫(kù)存余量查詢響應(yīng)結(jié)果
  • 響應(yīng)結(jié)果一般是json字符串的形式签钩,響應(yīng)示例如下:

    ?

2、期望獲取的結(jié)果

通過(guò)上面響應(yīng)結(jié)果坏快,想獲取參數(shù)為periods數(shù)組下的period_stock參數(shù)值和back_periods數(shù)組period_stock參數(shù)值铅檩。
標(biāo)注如下:


image

3、jmeter beanshell

測(cè)試獲取建議操作
  • 由于jmeter中beanshell斷言中書寫代碼沒(méi)有提示(超不方便)莽鸿,不過(guò)可提前在IEDA工具中先調(diào)試獲取結(jié)果再?gòu)?fù)制到beanshell中昧旨。
  • IDEA調(diào)試結(jié)果如下:


然后就只把把代碼復(fù)制到beanshell中即可。在jmeter中可以打印下獲取的庫(kù)存余量祥得,結(jié)果如下:


  • 附測(cè)試腳本(當(dāng)back_periods庫(kù)存值=0時(shí)兔沃,beanshell斷言生效,可及時(shí)查看訂單創(chuàng)建數(shù)量是否與庫(kù)存數(shù)量一致)
  import org.json.*;
  //獲取上一個(gè)請(qǐng)求的返回值
  String response = prev.getResponseDataAsString();
  //將返回值轉(zhuǎn)換為json
  JSONObject responseJson = new JSONObject(response);
  //獲取responseMessage
  JSONArray data = responseJson.getJSONObject("data").getJSONArray("ticket_periods");
  JSONObject ticket_periods = (JSONObject)data.get(0);
  JSONObject periods =(JSONObject)(ticket_periods.getJSONArray("periods").get(0));
  Integer period_stock = periods.getInt("period_stock");
  JSONObject back_periods=(JSONObject)(ticket_periods.getJSONArray("back_periods").get(0));
  Integer  period_stock_back = back_periods.getInt("period_stock");
  log.info("==========獲取庫(kù)存開始===========");
  log.info("periods內(nèi)余量值:" + period_stock);
  log.info("back_periods內(nèi)余量值:" +period_stock_back);
  log.info("==========獲取庫(kù)存結(jié)束===========");
  //beanshell斷言
 if(period_stock == 0){
   Failure = true; 
   FailureMessage = "period_stock的值:" + period_stock +"警告:已無(wú)庫(kù)存级及,請(qǐng)注意查看"+ "||period_id的值為:"+period_stock_back+"警告:已無(wú)庫(kù)存粘拾,請(qǐng)注意查看";
}
  • 獲取所有數(shù)組內(nèi)的參數(shù)值,這個(gè)需要進(jìn)行遍歷操作


    示例結(jié)果

    附遍歷代碼

public void testCase() throws IOException {
//        //將返回值轉(zhuǎn)換為json
//        JSONObject responseJson = new JSONObject(str);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        Map map = objectMapper.readValue(str, Map.class);
        Map dataMap = (Map) map.get("data");
        List<Map<String, Object>> list = (List<Map<String, Object>>) dataMap.get("ticket_periods");
        list.stream().forEach(item ->{
            List<Map<String, Object>> periodsList = (List<Map<String, Object>>) item.get("periods");
            periodsList.stream().forEach(periods ->{
                System.out.println("當(dāng)前period_stock的值:"+periods.get("period_stock"));
            });
        });
    }

  • 另外使用jmeter的beanshell功能經(jīng)常會(huì)用到以下方式傳遞變量
    1创千、在beanshell中如果拿到響應(yīng)結(jié)果的某個(gè)值缰雇,可以通過(guò)賦值方式傳入,然后通過(guò)變量取值即可
vars.put賦值追驴,格式為 vars.put("key","value")
vars.get 獲取變量械哟,vars.get("period_stock")

2、特別說(shuō)明:如果想把Integer類型通過(guò)vars放入的話需要加上toString()方法殿雪,上面需要把Integer 類型period_stock作為變量傳遞暇咆,示例

 vars.put("period_stock",period_stock.toString());

其它接口可通過(guò)變量名取值:{"period_stock":"${period_stock}"}
傳遞結(jié)果

GET http://127.0.0.1:8080/test

GET data:
{"period_stock":"80"}

[no cookies]

Request Headers:
Connection: keep-alive
Content-Type: application/json
Content-Length: 21
Host: 127.0.0.1:8080
User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_181)
  • 常用變量總結(jié):
    • vars: 實(shí)際引用Jmeter線程的局部變量, 連通Jmeter 和 beanshell
      vars.get(String key) //獲取變量值
       vars.put(String key, String value) //存儲(chǔ)value到變量key
    • log: 寫入信息到日志中丙曙,log.info(""),括號(hào)放置需要的變量
    • prev:獲取當(dāng)前響應(yīng)結(jié)果和響應(yīng)狀態(tài)爸业;
       getResponseDataAsString()
       getResponseCode()
    • props:class java.util.Properties
      變量屬性復(fù)制給變量props.put("some_variable",vars.get("some_variable"))

  • jmeter變量提取方法
    1、正則提取方法
    匹配規(guī)則


響應(yīng)示例

{
    "code":200,
    "data":[
        {
            "id":100,
            "regname":"test1",
            "pwd":"A31BFB0C8955E3780342A5EAF0282FF"
        },
        {
            "id":200,
            "regname":"test2",
            "pwd":"B31BFB0C8955E3780342A5EAF0282FF"
        },
        {
            "id":300,
            "regname":"test3",
            "pwd":"C31BFB0C8955E3780342A5EAF0282FF"
        }
    ],
    "msg":"success"
}

期望結(jié)果:取出id亏镰、regname扯旷、pwd參數(shù)值,通過(guò)正則提取
可使用在線驗(yàn)證工具:https://tool.oschina.net/regex/
驗(yàn)證結(jié)果
方法:

1索抓、ID的:"id":(.*?)," 或者: "id":(.+?),"可以匹配三個(gè)钧忽,模板寫成$y$,y=1取第一個(gè),y=2取第二個(gè)逼肯,y=3取第三個(gè)
2耸黑、regname的:"regname":"(.*?)",或者:"regname":"(.+?)"," 可以匹配三個(gè),模板寫成$y$,y=1取第一個(gè)篮幢,y=2取第二個(gè)大刊,y=3取第三個(gè)
3、pwd的:"pwd":"(.*?)","或者:"pwd":"(.+?)","可以匹配三個(gè)三椿,模板寫成$y$,y=1取第一個(gè)缺菌,y=2取第二個(gè)曲尸,y=3取第三個(gè)

2、json提取器方法
同樣是上述示例

{
    "code":200,
    "data":[
        {
            "id":100,
            "regname":"test1",
            "pwd":"A31BFB0C8955E3780342A5EAF0282FF"
        },
        {
            "id":200,
            "regname":"test2",
            "pwd":"B31BFB0C8955E3780342A5EAF0282FF"
        },
        {
            "id":300,
            "regname":"test3",
            "pwd":"C31BFB0C8955E3780342A5EAF0282FF"
        }
    ],
    "msg":"success"
}

期望結(jié)果:取出id男翰、regname另患、pwd參數(shù)值,通過(guò)json提取器
方法:

寫法:$.data[0].id  其他參數(shù)參考此提取方法
規(guī)則說(shuō)明:$開始蛾绎;.data:第一層里的數(shù)據(jù)昆箕;[0]:data里有三組數(shù)據(jù),取第一組的數(shù)據(jù)租冠;.id:取第一組數(shù)據(jù)里的id的值
當(dāng)[*]代表取所有數(shù)據(jù)鹏倘,例$.data[*].id取出80,81,82
當(dāng)[:N]代表取前兩個(gè)值,例$.data[:2].id取出80,81

擴(kuò)展:

擴(kuò)展1:取指定pwd為A31BFB0C8955E3780342A5EAF0282FF的id
方法:$.data[?@.pwd==A31BFB0C8955E3780342A5EAF0282FF].id
擴(kuò)展2:固定條件多個(gè)key的value
方法:$.data[?@.pwd==A31BFB0C8955E3780342A5EAF0282FF].["id","regname","pwd"]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顽爹,一起剝皮案震驚了整個(gè)濱河市纤泵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镜粤,老刑警劉巖捏题,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肉渴,居然都是意外死亡公荧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門同规,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)循狰,“玉大人,你說(shuō)我怎么就攤上這事券勺⌒髟浚” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵关炼,是天一觀的道長(zhǎng)程腹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)盗扒,這世上最難降的妖魔是什么跪楞? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任缀去,我火速辦了婚禮侣灶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缕碎。我一直安慰自己褥影,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布咏雌。 她就那樣靜靜地躺著凡怎,像睡著了一般校焦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上统倒,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天寨典,我揣著相機(jī)與錄音,去河邊找鬼房匆。 笑死耸成,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浴鸿。 我是一名探鬼主播井氢,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岳链!你這毒婦竟也來(lái)了花竞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掸哑,失蹤者是張志新(化名)和其女友劉穎约急,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苗分,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烤宙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俭嘁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躺枕。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖供填,靈堂內(nèi)的尸體忽然破棺而出拐云,到底是詐尸還是另有隱情,我是刑警寧澤近她,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布叉瘩,位于F島的核電站,受9級(jí)特大地震影響粘捎,放射性物質(zhì)發(fā)生泄漏薇缅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一攒磨、第九天 我趴在偏房一處隱蔽的房頂上張望泳桦。 院中可真熱鬧,春花似錦娩缰、人聲如沸灸撰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浮毯。三九已至完疫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間债蓝,已是汗流浹背壳鹤。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饰迹,地道東北人器虾。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蹦锋,于是被迫代替她去往敵國(guó)和親兆沙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355