Json作為一種數(shù)據(jù)交換格式在網(wǎng)絡(luò)開發(fā),特別是Ajax與Restful架構(gòu)中應(yīng)用的越來(lái)越廣泛。而Apache的JMeter也是較受歡迎的壓力測(cè)試工具之一,但是它本身沒有提供對(duì)于Json數(shù)據(jù)的響應(yīng)處理。本文中假設(shè)需要從HTTP的響應(yīng)頭中返回的Json格式的數(shù)據(jù)流中抽取某些特定的數(shù)據(jù),數(shù)據(jù)格式如下:
{
"name":"Simpsons?family",
"members":[
{"firstName":"Homer",?"lastName":"Simpson"},
{"firstName":"Marge",?"lastName":"Simpson"},
{"firstName":"Bart",?"lastName":"Simpson"},
{"firstName":"Lisa",?"lastName":"Simpson"},
{"firstName":"Maggie",?"lastName":"Simpson"}
]
}
下面我們使用不同的方法來(lái)進(jìn)行數(shù)據(jù)的抽取工作:
正則表達(dá)式提取
JMeter安裝了正則表達(dá)式插件之后,可以按照固定的格式從字符串中提取數(shù)據(jù),而本例中正則表達(dá)式如下所示:
"firstName":"(.+?)"
使用了該表達(dá)式之后會(huì)返回所有服從表達(dá)式的字符串,但是只有一個(gè)表達(dá)式是我們所關(guān)注的。可以使用$1$來(lái)作為模板,而3則會(huì)返回第三個(gè)數(shù)據(jù)。
當(dāng)偶爾需要對(duì)Json數(shù)據(jù)進(jìn)行處理時(shí),正則表達(dá)式是一個(gè)合適的選擇,它的一個(gè)優(yōu)勢(shì)在于JMeter本身就內(nèi)置了Json處理模塊。但是,閱讀處理正則表達(dá)式卻是比較復(fù)雜的,特別是對(duì)于某些復(fù)雜的Json數(shù)據(jù)。
JMeter?JSON插件
另一種處理Json數(shù)據(jù)的方法是使用JMeter的插件,該插件可以使用JSONPath來(lái)獲取JSON數(shù)據(jù)中特定位置的數(shù)據(jù)。類似于XML文件中的XPath,JSONPath可以使用簡(jiǎn)單的表達(dá)式來(lái)操作Json對(duì)象。JSON?Path?Extractor是一個(gè)開源的增加了post處理器的插件,可以將該插件的Lib文件拷貝到JMeter的lib目錄下即可。
而上文中提及的需要定位的數(shù)據(jù)可以使用如下的JSONPath進(jìn)行描述:
$.members[2].firstName
在JMeter中,只需要從PostProcessor菜單中打開JSON?Path?Extractor然后輸入變量名與默認(rèn)值即可,如下所示:
JSONPath表達(dá)式較短并且易于閱讀,能夠有效提高測(cè)試腳本的易維護(hù)性,該插件并不隨著標(biāo)準(zhǔn)的JMeter一起安裝。
BeanShell?Post?Processor
最后一種方法即是借用了JMeter的對(duì)于BeanShell支持的特性,BeanShell是一個(gè)輕量級(jí)的面向Java的腳本語(yǔ)言。BeanShell?Post?Processor允許使用標(biāo)準(zhǔn)的Java語(yǔ)法來(lái)處理Json數(shù)據(jù),使用方法如下圖所示:
總結(jié)
本文列舉出了三種可用的從Json格式的返回值中提取數(shù)據(jù)的方法,正則表達(dá)式對(duì)于簡(jiǎn)單的Json格式的數(shù)據(jù)的快速標(biāo)準(zhǔn)化非常占優(yōu)勢(shì)。而JsonPath插件可以用于創(chuàng)建能夠被維護(hù)修改的腳本,但是需要額外的插件安裝工作。而最后的帶JSON庫(kù)的BeanShell確實(shí)非常詳細(xì)并且依賴于Java語(yǔ)言的靈活性可以進(jìn)行進(jìn)一步的開發(fā)。