最近在學習BeanShell斷言,發現有點強大哈,只要會寫代碼,就沒有什麼是斷言不了的,哈哈哈,不過我如今只會寫點蹩腳的代碼,下面將介紹下如何將返回的JSON數據與數據庫數據作對比。html
注:本次涉及到的知識點有 1)BeanShell PostProcessor拼接字符串;2)BeanShell 斷言的基本使用;java
jmeter斷言接口返回的count與數據庫查詢出來的是否一致,接口返回的JSON響應數據以下:sql
(count說明:好比12/17,即12是表明商品數 [先用X代替],17是表明收藏夾的數量 [用Y代替])XY只是爲了方便區分,後面方便偷懶,哈哈。shell
{
"code":"0",
"msg":"OK",
"info":{
"categoryList":[
{
"id":45,
"categoryName":"ca文件夾",
"imageUrlList":[
"https://img/29/15302571783635805807.jpg"
],
"count":2,
"tip":null
}
],
"count":"12/17"
}
}
第一步:用sql分別查出商品數和收藏夾數,而後拼接成「12/17」的形式;數據庫
第二步:提取出響應數據的count值;(這一步其實有不少種實現方法,好比用jsonpath也能夠提取,但本次用的是BeanShell取值哈)apache
第三步:將提取出的count與數據庫查詢說來的拼接值作對比,判斷是否一致。json
若是以前沒有接觸過BeanShell的話,這節一點要仔細看哈,雖然只是簡單說起幾個知識點。api
二、Bean Shell經常使用內置變量數組
JMeter在它的BeanShell中內置了變量,用戶能夠經過這些變量與JMeter進行交互,其中主要的變量及其使用方法以下:框架
log:寫入信息到jmeber.log文件,使用方法:log.info(「This is log info!」);
ctx:該變量引用了當前線程的上下文,使用方法可參考:org.apache.jmeter.threads.JMeterContext。
vars - (JMeterVariables):操做jmeter變量,這個變量實際引用了JMeter線程中的局部變量容器(本質上是Map),它是測試用例與BeanShell交互的橋樑,經常使用方法:
a) vars.get(String key):從jmeter中得到變量值
b) vars.put(String key,String value):數據存到jmeter變量中
更多方法可參考:org.apache.jmeter.threads.JMeterVariables
props - (JMeterProperties - class java.util.Properties):操做jmeter屬性,該變量引用了JMeter的配置信息,能夠獲取Jmeter的屬性,它的使用方法與vars相似,可是隻能put進去String類型的值,而不能是一個對象。對應於java.util.Properties。
a) props.get("START.HMS"); 注:START.HMS爲屬性名,在文件jmeter.properties中定義
b) props.put("PROP1","1234");
prev - (SampleResult):獲取前面的sample返回的信息,經常使用方法:
a) getResponseDataAsString():獲取響應信息
b) getResponseCode() :獲取響應code
更多方法可參考:org.apache.jmeter.samplers.SampleResult
sampler - (Sampler):gives access to the current sampler
三、Bean Shell判斷返回的JSON
首先要下載JSON依賴包(org.json.jar),放到\apache-jmeter-5.0\lib\ext中,而後重啓jmeter便可在beanshell中import json包了。具體要怎麼提取到JSON中的某個值,在博文最後會貼代碼,請拉到最後查看,後續也會根據不一樣的JSON結構專門寫一篇如何提取JSON結構字段值的文章。
jmeter鏈接數據庫在以前就已經講過了,這裏就再也不贅述了哈,直接進入主題了。此次的查詢比較特別一點,爲何呢?由於查詢用到的表在不一樣的數據庫中,不是同一個庫了,爲了方便理解,仍是大概說一下吧。
category表在A庫,collect表在B庫,在查collect表裏的商品數時,是須要用到category表查詢出來的id的,由於查詢出來的id可能不止一個,因此就會涉及到要將id拼接起來,再放到collect表裏查詢。說的可能比較抽象,哈哈哈,下面直接上圖了。
添加JDBC Request,具體寫法以下:
添加JDBC Request,具體寫法以下:
添加BeanShell PostProcessor,Script寫法以下:
//先取得id的數量,即查詢出來一共有多少個id,這裏能夠直接引用A_#,能夠看debug sampler log.info("ids的數量爲:"+vars.get("A_#")); int id = Integer.valueOf("${A_#}"); //定義變量ids,用來存放拼接後的字符串 String ids = ""; //用id數量去for循環,循環查詢出每一個id,並拼接成字符串 for(i=1; i<=id; i++){ String Id = vars.get("A_"+i); log.info("Id爲:" + vars.get("A_" + i)); ids += Id + ","; } //去掉字符串最後一個多餘的逗號 ids = ids.substring(0, ids.length() - 1); log.info("ids爲:" + ids); //將id列表保存爲參數 vars.put("ids",ids);
添加JDBC Request,具體寫法以下:
添加背景裏說到的接口的http請求,在http請求裏添加BeanShell斷言,Script寫法以下:
//導入json的包 import org.json.*; //獲取響應結果,並轉換爲json String response = prev.getResponseDataAsString(); JSONObject responseJson = new JSONObject(response); log.info("輸出轉換爲JSON對象的響應數據:" + responseJson); /*獲取categoryList數組的數據:這個與本次斷言無關 JSONArray categoryList = responseJson.getJSONObject("info").getJSONArray("categoryList"); log.info("categoryList:" + categoryList); String message = responseJson.getString("msg"); log.info("響應message字段:" + message); */ //獲取count的值 String count = responseJson.getJSONObject("info").getString("count"); log.info("請求響應結果返回的count的值爲" + count); //將數據庫查詢出來的文件夾總數和商品總數拼接起來,好比12/19 sqlcount=${B_1}+"/"+${C_1}; log.info("第一種方法直接引用變量去拼接的值爲:"+sqlcount); String sqlcountB = vars.get("B_1"); String sqlcountC = vars.get("C_1"); sqlcount2= sqlcountB +"/"+sqlcountC; log.info("第二種方法用vars.get到值再拼接的值爲:"+sqlcount2); //斷言返回的count與數據庫的count是否一致 //if(count.equals("12/17")){ if(count.equals("sqlcount")){ Failure=false; log.info("數據一致"+"-----count的值爲:"+count+"------sqlcount的值爲:"+sqlcount); } else{ Failure=true; FailureMessage="不相等呀,請檢查!!!"+"count的值爲:"+count+"------sqlcount的值爲:"+sqlcount; log.info(FailureMessage); }