使用Jmeter的BeanShell斷言,把響應數據中的JSON跟數據庫中的記錄對比
很多時候我們需要把Response Data取到的 Json 字符串跟數據庫里的對比,來驗證接口的正確性,使用Beanshell斷言可以比較靈活的實現這個需求。
Beanshell是一種類似Java的腳本語言,可以直接調用外部的jar包,可以拿現成的json解析包來用,所以筆者選擇了這個方法。實現的思路是
1、歷史數據存儲到MySQL數據庫里,
2、Jmeter讀取參數化的CSV文件,把測試用例都存入CSV文件一次執行,
3、CSV文件和數據庫中數據用ID關聯,
4、每次斷言都用BeanShell使用JDBC連接MYSQL庫,使用測試用例的ID查出MYSQL中的數據
5、調用GSON的解析JSON方法,對比兩個數據,進行斷言
BeanShell在Jmeter中的使用可以參考這篇文章,https://www.blazemeter.com/blog/queen-jmeters-built-componentshow-use-beanshell 在這里就不多做介紹了。
GSON是Google的一個解析JSON的工具,筆者不太懂 java,但是JSON字符串的對比不能直接用字符串比較,
所以引用了這個包,然后調用了GSON的JsonObject.equals()方法,來判斷 兩個JSON的內容是否一樣。大家可以多研究下,最好能完成例如斷言失敗時打印內容不同的KEY等功能。
選中測試計划,添加JAR包的引用地址。MYSQL的驅動和GSON包都需要下載下來,如下圖直接點開窗口選擇JAR文件即可。
import java.sql.*; import java.util.*; import java.lang.*; import org.apache.regexp.*; import com.google.gson.JsonObject; import com.google.gson.JsonParser; //數據庫連接字段 String drive = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://yourdatabase:yourDatabasePort/"; String dbName = "YourDataBaseName"; String user = "YourDataBaseUser"; String pass = "YourDataBasePass"; String history = ""; String response = ""; String failuer = ""; //vars.get是Jmeter提供的方法,可以取到變量值,這個caseno是用來關聯用例和數據庫中結果的 String CaseNo = vars.get("caseno"); //下面是查詢的SQL String query = "SELECT response_data From test_json_compare Where case_no = '" + CaseNo + "'"; //JDBC聲明 Connection Mycon = null; Statement Mystmt = null; ResultSet Myrset = null; //try中獲取數據庫連接 try{ Mycon = DriverManager.getConnection(url+dbName, user, pass); } catch(SQLException e){ } Mystmt = Mycon.createStatement(); Myrset = Mystmt.executeQuery(query); //prev.getResponseDataAsString是Jmeter提供的方法,可以調取上次請求的響應字符串 response = prev.getResponseDataAsString(); //如果取到庫中的數據,賦值給history while (Myrset.next()){ history = Myrset.getString(1); } Myrset.close(); Mystmt.close(); //Gson提供的方法,原理筆者也不明白,效果是把字符串生成Json對象 JsonParser parser = new JsonParser(); JsonObject responseObj = (JsonObject) parser.parse(response); JsonParser parser1 = new JsonParser(); JsonObject historyObj = (JsonObject) parser1.parse(history); if(history == "") { Failure = true; FailureMessage = "連接數據庫失敗或者數據庫內沒有歷史數據"; //調用Gson提供的Json對象euqals方法判斷是否一致 }else if(responseObj.equals(historyObj) == false) { //把斷言失敗置為真 Failure = true; FailureMessage = "和歷史數據不匹配"; }
http://blog.csdn.net/drico1986/article/details/53021071