如何使用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);

    哪里:

    • 第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支持的格式页面以确定实现库和类。然后阅读文档以了解如何正确提取它。

    原文地址:https://www.cnblogs.com/a00ium/p/10354800.html

    时间: 2024-11-04 11:12:07

    如何使用JMeter从文件中提取数据的相关文章

    [数据科学] 从text, json文件中提取数据

    文本文件是基本的文件类型,不管是csv, xls, json, 还是xml等等都可以按照文本文件的形式读取. #-*- coding: utf-8 -*- fpath = "data/textfile.txt" f = open(fpath, 'r') ## 按照字符读取字符 first_char = f.read(1) print "first char: ", first_char ## 改变文件对象的位置, 位置是按照bytesize计算的 ## 如果不把位置

    SQLServer 从xml 文件中提取节点数据到数据库中

    原文出处:http://blog.csdn.net/kk185800961/article/details/12350715  转载请注明出处 XML实例文件: <?xml version="1.0" encoding="utf-8"?> <!-- edited with XMLSpy v2010 (http://www.altova.com) by fengshuai (founder) --> <Root> <Frame

    如何使用JMETER从JSON响应中提取数据

    如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量. 好消息!您正在掌握掌握JMeter Json Extractor的权威指南.作为Rest API测试指南的补充,您将学习掌握Json Path Expressions所需的一切. 我们走吧!并且不要惊慌,那里没有什么困难. Json格式 为了更好地理解Json是什么,这是一个示例Json文档: { "store": { "book": [ { "category": &qu

    [转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    [流媒體]H264—MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012  Email:[email protected].com 一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1  MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象编码的第12部分: ISO 基本媒体文件格式/Information technology Coding of a

    【Python】从文件中读取数据

    从文件中读取数据 1.1 读取整个文件 要读取文件,需要一个包含几行文本的文件(文件PI_DESC.txt与file_reader.py在同一目录下) PI_DESC.txt 3.1415926535 8979323846 2643383279 5028841971 file_reader.py with open("PI_DESC.txt") as file_object: contents = file_object.read() print(contents) 我们可以看出,读取

    Kettle实现从数据库中提取数据到Excel

    因为有个日常提数,工作日每天都要从数据库中提取数据,转换为excel,再以邮件的形式发给用户. 刚好近期同事在研究使用kettle自动提数且完成邮件的发送,觉得很实用又挺有意思的就学了一下这个技能~ 首先我们需要新建 转换  转换: 可以将数据从数据库中提取到excel中  然后我们如果想要定时提取数据的话,可以新建 作业 作业: 可以定时执行转换任务,然后还可以将发送邮件耶~ (不过这个技能我还不是很熟悉,等我熟悉了再更新嘻嘻) 一 . 新建转换 1.点击 + 号 ,也就是新建 ,然后选择 转

    SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

    1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地址码 . FlightID Varchar(10) NULL, --航班号) 2/ 建立存储过程 USE DF17DataProIF EXISTS (SELECT * FROM SYS.PROCEDURES WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[BulkDataP

    读取文件中的数据(以结构体存放)

    /* *读取文件中的数据(数据以结构体存放) */ #include<iostream> #include <fstream> //#define Field 31 //field_anal number #define Field 15 //field_post number using namespace std; //the level restore certain level data //level_z show the level struct Level { int

    从plist文件中读取数据

    //从plist文件中读取数据- (void)readDataFromPlist{    //1.先获取文件路径    NSString * filePath = [[NSBundle mainBundle] pathForResource:@"Book" ofType:@"plist"];    //2.根据路径初始化字典对象    self.dic = [NSMutableDictionary dictionaryWithContentsOfFile:fileP