1. 程式人生 > >Jmeter 介面測試中使用Beanshell斷言: 將介面響應報文與資料庫結果對比

Jmeter 介面測試中使用Beanshell斷言: 將介面響應報文與資料庫結果對比

昨天朋友問我Jmeter怎麼把資料庫查詢結果與介面響應JSON報文做對比。(第一段是記錄自己的探索過程,讀者可以直接跳至第二段)

我當時想法是

第一步:搞定介面引數

1. 正則匹配介面響應的JSON內容。匹配-1,匹配所有符合內容 (分別匹配ID 和 NAME的值)

2. 取ID,作為ForEach控制器的控制引數。(ID_1, ID_2, ID_3 .. 有多少會迴圈幾次)

3. 其他變數用${__counter(TRUE,)}計數器來拼接。例如${__V(NAME_${__counter(TRUE,)})}(取得NAME_1, NAME_2... ForEach迴圈幾次,就取幾個)

第二步:搞定資料庫值

1. JDBC PostProcessor 後置處理器,將查詢結果儲存為 (id_1, id_2 ... name_1, name_2 ...的形式)

第三步:斷言

1.使用java請求。ResultData引數 新增介面返回的 id 和 name

2.為java請求新增相應斷言,在斷言中新增 資料庫的ID 和 NAME 

朋友說這不是他想要的。他想在一個斷言裡判斷。但是因為json裡內容是不固定的,所以響應斷言肯定無法滿足。

昨天回到家想了一下,覺得Beanshell斷言應該可以。

實際上確實可以,還很簡單!

我的思路是:

第一步:介面引數直接使用HTTP請求的響應內容,JMeter內建了獲取當前請求響應的方法prev.getResponseDataAsString()

第二步:資料庫逃不掉的,老老實實賦欄位名

第三步:Beanshell斷言

1. for迴圈, i = 1,vars.get("id_" + i) 拼接變數名 獲得基礎填充內容 "{\"id\":" + id + ",\"latitude\":" + latitude + ",\"longitude\":" + longitude + ",\"name\":\"" + name + "\"}"

2. 拼接首位JSON格式,獲得完整JSON報文

3. equals() 判斷 2個字串

另外Jmeter中的BeanShell中,好像不能使用String.format()。我查了一下,暫時沒有這塊兒資料。如果有的話,拼接部分就方便很多了。

最後附上Beanshell斷言完整程式碼

int M = ${id_#};
int i;
String Str = "";
String id = "";
String latitude = "";
String longitude = "";
String name = "";

Str = "{\"data\":[";

for(i = 1; i <= M; i++){
	id = vars.get("id_" + i);
	latitude = vars.get("latitude_" + i);
	longitude = vars.get("longitude_" + i);
	name = vars.get("name_" + i);
	
	Str = Str + "{\"id\":" + id + ",\"latitude\":" + latitude + ",\"longitude\":" + longitude + ",\"name\":\"" + name + "\"}";
	if (i != M){
		Str = Str + ",";
		}
	}
Str = Str + "],\"message\":\"\",\"result\":0}";
System.out.println("資料庫內容: \n" + Str);

//prev.getResponseDataAsString是Jmeter提供的方法,可以調取上次請求的響應字串  
response = prev.getResponseDataAsString();  
System.out.println("響應內容: \n" + response);

if(Str == ""){
	Failure = true;
	FailureMessage = "連線資料庫失敗或者資料庫內沒有歷史資料!";
	//對比資料庫內容和響應內容,私用euqals方法判斷是否一致
	}else if(response.equals(Str) == false){
		//把斷言失敗置為真 
		Failure = true;  
		String Msg = "與資料庫內容不匹配!\n";
		FailureMessage = Msg + "資料庫內容: \n" + Str + "\n" + "響應內容: \n" + response; 
		}

最後總結一下用到的Jmeter內建方法:

vars.get() #獲取JMeter中的變數

prev.getResponseDataAsString() #獲取當前請求的響應結果

Failure、FailureMessage 是Beanshell斷言特有的引數,用於指定斷言失敗。

完整的Jmeter內建方法請參考這位大佬的博文

http://www.cnblogs.com/puresoul/p/4915350.html

解決問題過程中參考了這位大佬的博文,利用gson包直接對比json報文。(但我沒實現,只是使用了他的部分java程式碼)

http://blog.csdn.net/drico1986/article/details/53021071