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