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


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

 

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

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

 

因此,如果您是性能測試工程師,那么了解如何實現此關聯和斷言邏輯非常重要。幸運的是,BlazeMeter的知識庫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支持的格式頁面以確定實現庫和類。然后閱讀文檔以了解如何正確提取它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM