1. 程式人生 > >如何使用JMeter從文件中提取數據

如何使用JMeter從文件中提取數據

後處理器 這一 pan db2 媒體文件 媒體 campaign mmu 喜歡

在性能測試方面,重用響應數據至關重要。幾乎(如果不是全部!)負載測試場景假設您:

  1. 從先前的響應中提取有趣的方面,並在下一個請求中重用它們(也稱為相關)

  2. 確保實際響應符合預期(又稱斷言)

因此,如果您是性能測試工程師,那麽了解如何實現此關聯和斷言邏輯非常重要。幸運的是,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);
View Code

哪裏:

  • 第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());
View Code

這意味著我們的Beanshell PostProcessor將如下所示:

技術分享圖片技術分享圖片

讓我們再次運行測試,並在Debug Sampler中查看A1和B1的變量值

技術分享圖片技術分享圖片

如您所見,有兩個變量(不包括預定義的變量)

    • A1=foo

    • B1=bar

$ {A1}和$ {B1}可用作參數,後處理器的目標,斷言等。

而已!!現在我們知道如何使用JMeter和Tika從Excel文檔中提取數據。

這只是Apache Tika 300多種格式中的一種 - 但我認為我不能在一篇博文中涵蓋所有這些格式!如果您使用的是Excel之外的其他內容,請查看Tika支持的格式頁面以確定實現庫和類。然後閱讀文檔以了解如何正確提取它。

如何使用JMeter從文件中提取數據