在性能測試方面,重用響應數據至關重要。幾乎(如果不是全部!)負載測試場景假設您:
-
從先前的響應中提取有趣的方面,並在下一個請求中重用它們(也稱為相關)
-
確保實際響應符合預期(又稱斷言)
因此,如果您是性能測試工程師,那么了解如何實現此關聯和斷言邏輯非常重要。幸運的是,BlazeMeter的知識庫和JMeter博客已經有一些關於如何做到這一點的精彩文章。請查看以下內容:
-
使用帶有JMeter的RegEx(正則表達式提取器) - 使用Perl5樣式的正則表達式解析響應
-
在JMeter中使用XPath和JSON路徑提取器 - 處理XML / XHTML和JSON數據
-
如何在3個簡單步驟中使用JMeter斷言 - 將斷言應用於響應並有條件地設置通過或失敗標准
這些都是基於文本的響應的好方法。但是,如果你需要從二進制文件中提取某些內容呢?例如,如果您需要驗證作為HTTP請求采樣器響應的Microsoft Word文檔的內容,該怎么辦?
這正是我將要在本文中解決的那種挑戰。我將引導您完成查看和獲取不同文檔類型內容的過程,包括Microsoft Office,OpenOffice,ZIP存檔和多媒體文件。
如何查看二進制文件的內容
在開始之前,請確保您知道如何使用JMeter的View Results Tree Listener - 因為它對請求和響應詳細信息的可視化和檢查非常有用。如果您不熟悉它,請查看本文:如何調試Apache JMeter腳本
現在讓我們從一個非常基本的Microsoft Excel兼容電子表格開始。我拿了一個3.6KB的Microsoft Office Excel工作表。
如您所見,我們有一個文件test.xlsx,其中一個工作表標記為“Sheet1”。在單元格A1中,我們有字符串foo,在單元格B1中,我們有字符串條。
現在是時候使用'查看結果樹監聽器'來了解JMeter如何看待它。
我使用本地Apache Tomcat應用程序服務器獲取“test.xlsx”文件,但JMeter的HTTP Request采樣器也可以從本地文件系統中獲取文件。只需在“協議”字段中輸入“文件”,並在“路徑”字段中提供完整路徑(如下面的屏幕截圖所示)。
以下是“查看結果樹監聽器”中“采樣器結果”選項卡的外觀:
這表明JMeter識別MIME類型(“application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”)並報告正確的響應體大小為3656字節。
現在讓我們看看“響應數據”選項卡:
這顯示了ZIP存檔的文本表示 - 由於其二進制特性而無法讀取。
“查看結果樹監聽器”為您提供了有關如何顯示響應數據的一些選項。它可以解析HTML,XML,JSON,提供Regex,CSS和XPath測試功能,還可以顯示來自不同文檔類型的內容(要做到這一點,你需要在drop中將默認選項“Text”更改為“Document” - 在左上角)
讓我們切換到“文檔”選項
現在我們可以看到JMeter的CLASSPATH中缺少“tika-app.jar”。要啟用基於非文本的響應解析,您需要從Apache Tika下載頁面下載tika-app - * .jar 並將其放入JMeter安裝的/ lib文件夾中。Asterisk(*)代表這個版本。最新的一個應該沒問題但是如果它不起作用,在JMeter的/ lib文件夾中查找tika-core - * .jar和tika-parsers - * .jar文件並下載相關的tika-app.jar。
這里有些例子:
-
JMeter 2.12附帶了tika-core-1.6.jar和tika-parsers-1.6.jar。因此,如果您使用的是JMeter 2.12,那么下載tika-app-1.6.jar是值得的
-
JMeter 2.13附帶了tika-core-1.7.jar和tika-parsers-1.7.jar。在這種情況下,你需要tika-app-1.7.jar
話雖如此,我建議盡可能使用最新的JMeter版本,因為它將包含錯誤修復,性能改進和新功能。
將tika-app - * .jar添加到/ lib文件夾后,重啟所有正在運行的JMeter實例實例非常重要,因為拾取外部.jar文件的過程不是動態的。這也適用於JMeter插件,JUnit測試等。
因此,讓我們看看響應如何將tika-app.jar添加到JMeter的類路徑中
現在我們可以看到工作表的標題以及A1和B1單元格的值。
如何訪問二進制文件的內容
有時僅僅“看到”內容是不夠的。如果您需要對提取的數據執行某些操作,例如將其用作下一個請求的參數或驗證實際響應是否包含“foo”字符串,該怎么辦?
讓我們看看我們是否可以使用正則表達式提取器從Excel文檔中獲取內容。首先,讓我們將整個響應保存到JMeter變量中。
如何將采樣器響應保存到JMeter變量中
在這里,我將向您展示如何構造匹配整個響應的正則表達式。
請查看JMeter用戶手冊的正則表達式部分。在這里,我們可以識別元和控制字符,以開發一個匹配響應中所有內容的正則表達式:
-
() = grouping
-
(?s) = single line modifier
-
^ = line start
-
. = wild-card character
-
* = repetition
因此,將返回整個響應的正則表達式應如下所示:
(?s)(^.*)
並且整個Regular Expression Extractor Post Processor應如下所示:
現在我們想看到“響應”變量值。讓我們在HTTP請求和視圖結果樹監聽器之間添加一個Debug Sampler,然后再次運行測試。
這有點令人失望!:(
顯然,正則表達式提取器不適用於已解析的響應,它只返回二進制文件內容,該內容不是非常有用或有用。但是如果JMeter顯示Excel文件內容,則應該可以獲得它。讓我們更深入一點,看看JMeter的View Results Tree Listener如何顯示Excel文件內容。
這里是:org.apache.jmeter.util.Document.String getTextFromDocument(byte [] document)。正如它在此處所述,您使用Apache Tika將多種文檔(包括odt,ods,odp,doc(x),xls(x),ppt(x),pdf,mp3,mp4等)轉換為文本。
因此,讓我們刪除正則表達式提取器並添加Beanshell Post Processor。
將以下代碼插入Beanshell的后處理器的“腳本”區域

import org.apache.jmeter.util.Document; String converted = Document.getTextFromDocument(data); vars.put("response", converted);
哪里:
-
第1行 - 導入以解析Document類
-
第2行 - 調用getTextFromDocument方法
-
data - 這是一個預定義的Beanshell變量,它將父采樣器響應保存為字節數組
-
將結果存儲到轉換的字符串對象中
-
-
創建JMeter變量響應並為其分配已轉換字符串的值
有關Beanshell腳本域的更多信息以及更多有用的提示和技巧,請參閱如何使用BeanShell:JMeter最喜歡的內置組件指南。
現在讓我們重試請求,看看這次是怎么回事。
如您所見,您現在可以將整個文件內容稱為:$ {response} JMeter Variable。更重要的是:您可以將后處理器和斷言應用於它。
如何解析二進制文件
最后,讓我們看一下如何以更智能的方式處理二進制文件。我已經介紹了如何將二進制文件內容轉換為JMeter變量,現在我將介紹如何訪問單個元素。
讓我們以示例Excel文件為例,從A1和B1單元格中提取值。
Apache Tika二進制文件包括幾個能夠處理文檔文件類型,多媒體文件,存檔等的庫。它使用Apache POI API for Microsoft文件類型,因此我們需要使用Apache POI類來提取單元格內容來自Excel文檔(請參閱有關使用Spreadsheets獲取代碼示例的POI快速指南以及有關如何執行此操作的更多信息)。
所以我們示例中的代碼如下所示:

import org.apache.jmeter.threads.JMeterVariables; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; InputStream in = new ByteArrayInputStream(data); Workbook wb = new XSSFWorkbook(in); in.close(); Sheet sheet1 = wb.getSheet("Sheet1"); Row row = sheet1.getRow(0); Cell a1 = row.getCell(0); Cell b1 = row.getCell(1); vars.put("A1", a1.getStringCellValue()); vars.put("B1", b1.getStringCellValue());
這意味着我們的Beanshell PostProcessor將如下所示:
讓我們再次運行測試,並在Debug Sampler中查看A1和B1的變量值
如您所見,有兩個變量(不包括預定義的變量)
-
-
A1=foo
-
B1=bar
-
$ {A1}和$ {B1}可用作參數,后處理器的目標,斷言等。
而已!!現在我們知道如何使用JMeter和Tika從Excel文檔中提取數據。
這只是Apache Tika 300多種格式中的一種 - 但我認為我不能在一篇博文中涵蓋所有這些格式!如果您使用的是Excel之外的其他內容,請查看Tika支持的格式頁面以確定實現庫和類。然后閱讀文檔以了解如何正確提取它。