JMeter - 如何测试REST API / 微服务

概述:

有许多方法和工具可用于测试REST API。
当我需要测试REST API时,在查看了各种工具和选项之后,由于以下原因,我选择了JMeter。

  • JMeter是免费和开源的。

  • JMeter可以从CSV文件中直接读取您的测试数据。参数化非常简单。

    • 可以轻松地使用多组数据测试API。

  • JMeter有一个功能强大的“ 响应提取器” -可用于从API响应中提取信息(JSON / XML /正则表达式),并在测试的后续请求中使用它。

  • JMeter有大量的“ 断言 ” - 来验证API响应是否符合预期。

  • 我们为功能测试创建的JMeter测试也可用于性能测试。

  • ANT / Maven / Gradle插件作为构建的一部分执行测试。

  • 与Jenkins轻松集成以定期运行测试,Jenkins有一个JMeter插件来解析结果文件并显示漂亮的图表。


安装JMeter:

启动JMeter后,您将看到Test Plan  元素,它是JMeter测试的根节点,我们将在其中为测试添加各种JMeter元素。

创建一个简单的API JMeter测试:

现在让我们为测试添加所需的元素。

  • 在测试计划下添加一个线程组。(右键单击测试计划 - >添加 - >线程(用户) - >线程组)

    • 我们更新了线程组中的用户数,迭代次数等。

    • 现在让他们成为1。

  • 线程组下添加HTTP请求采样器。(右键 单击线程组 - >添加 - >采样器 - > HTTP请求)

    • Sampler是一种JMeter请求。

    • REST是一种方法,它使用HTTP协议。所以我们添加HTTP Request采样器。

    • 将服务器IP /主机名更新为  myapiservername.com [对于此API网址:http:  //myapiservername.com/rest/api/path ]

    • 更新API路径  / rest / api / path

图片

  • 使用请求发送文件   - 应该具有请求JSON文件的路径,或者在HTTP请求正文数据部分 中包含请求JSON 

  • 添加  HTTP标头管理器   (右键单击测试计划 - >添加 - >配置元素 - > HTTP标头管理器

    • 名称= apigeekey

    • 值=测试@ 123

    • 名称=的Content-Type

    • 值=应用/ JSON

    • 在HTTP Header Manner配置页面中,单击“添加”。

    • 包括此名称 - 值对。

    • 如果您的API需要APIGEE密钥,请将其包含在此处或忽略。

图片

  • 添加  HTTP授权管理器 -在任何身份验证的情况下都是必需的。 (右键单击测试计划 - >添加 - >配置元素 - > HTTP授权管理器

    • 将基本URL更新为  http://myapiservername.com

    • 更新用户名

    • 更新密码

  • 在“测试计划”下,添加一个侦听器 - “  查看结果树”

您的JMeter测试将如下所示(我没有包括监听器)。

图片

现在如果你运行它,你应该能够发送请求并成功获得响应。

注意:如果由于某种原因它不起作用,请尝试将HTTP请求实现更改为Java /其他值并尝试一下。

图片

无论我们到目前为止做了什么,都是一个非常简单的测试 - 就像POC一样。现在让我们看看如何进一步改进它。

参数化测试数据:

在上面的示例中,我们发送硬编码请求JSON来测试API。我们可能必须针对不同的数据集测试API。

让我们举一个非常简单的例子,我有一个API,它给出了我发送的图书ID请求的图书名称和价格详细信息。

CSV中的测试数据:

图片

请求JSON:

让我们假设我们的API请求采用以下格式。

{"bookid": 1
}

复制

响应JSON:

让我们假设我们的API响应如下所示。

{"bookname": "Awesome Jmeter""bookprice": 23.5
}

图片

在测试计划下添加CSV数据集配置并更新上面给出的详细信息。

  • 变量名称:可以为空。JMeter将CSV列名称作为变量名称。

  • 回收EOF?:应该是假的。我们只测试每一行一次。

  • 在EOF上停止线程?:应该是TRUE。一旦我们测试了所有行,它将自动停止JMeter测试。

  • 在“线程组”中,选中“循环计数”中的“For Ever”复选框。

参数:

我们不是发送硬编码的书籍ID,而是使用CSV文件的“id”列中的值对其进行参数化。

图片

而已。如果您现在运行测试,它应该为CSV文件中的每一行逐个发送6个请求。

我们可以做得比这更好 - 如果有不同类型的请求 - GET / POST / DELETE / PUT / PATCH等等。使用JMeter非常容易。我完全通过电子表格驱动我的测试,如下所示。请在此处查看JMeter - REST API - 数据驱动测试的高级用法

图片

断言:

如果我们可以发送请求并获得响应,那么我们完成了吗?不!!但是,我们几乎就在那里!

我们需要验证我们是否得到了预期的响应。因此,最后一步是添加断言。

我在上面的示例中显示的CSV文件中有预期的书名和价格详细信息。让我们使用这些细节来检查我们的API是否按预期工作。

在HTTP Request下添加Response Assertion ,如下所示。我们需要验证响应中是否有预期的图书名称和价格。按下面的说明添加它们。

图片

此断言将验证响应并相应地通过/失败测试。(确保模式匹配规则是'包含',因为我们只检查书名和价格。我们没有验证整个响应。)

持续时间断言:

JMeter不仅验证文本,还验证请求的“ 时间 ”。如果我们添加“持续时间断言”并设置可接受的时间限制,JMeter可以确认是否在时间限制内收到了响应。

图片

从JSON响应中提取数据:

有时,您可能希望从JSON响应中提取特定数据,并将此数据传递给JMeter中的后续请求。JMeter提供了一个JSON Extractor来从JSON响应中提取特定值。

让我们假设,我的样本响应看起来像这样。

{"title":"In Search of Lost Time","author":"Marcel Proust","id":1
}

复制

我可以添加一个JSON Extractor,如下所示,将作者的值提取到变量authorValue中。

图片

  • $指的是JSON Path表达式中的根元素

  • 'author'是根元素的直接子元素。所以可以使用$ .author访问它

  • 匹配编号给出第N个匹配。如果您想要数组中的所有匹配值,则匹配数字应为-1

  • 默认值 - 在没有匹配时使用

让我们考虑下面的JSON响应

{"store":{"book":[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}],"bicycle":{"color":"red","price":19.95}}
}

复制

  • 要获得第一本书的价格 -  $ .store.book [1] .price

  • 从类别获得所有价格 - $ ..价格

有关这方面的更多信息,请点击此处。

REST API的性能测试:

您可能已经验证了API功能!

但是,我们如何知道有关API的以下信息?

  • 响应时间

  • 它可以支持的并发用户

  • 用户负载中断

  • CPU /内存使用情况

  • 内存泄漏

通过使用我们刚刚创建的相同测试,JMeter也可以在这里提供帮助!

  • 更新线程组中的线程数。如果输入10作为用户数并运行,JMeter将模拟10个并发用户。

  • 更新加速期(以秒为单位)。例如:如果您有10个用户和50秒作为加速期,JMeter将每5秒开始创建1个虚拟用户。

  • 循环计数:选择“永远”。

  • 在Scheduler下,输入Duration(秒)。[输入600将对10个虚拟用户进行10分钟的性能测试。]

  • 更新CSV数据集配置:'回收EOF?' - 将其设置为TRUE - [FALSE仅读取一次CSV数据。我们需要足够的数据让VUsers运行10分钟。因此,将其设置为TRUE将在读取后提供相同的测试数据集]

  • 在测试计划下添加“聚合报告”监听器。

立即运行您的仪表测试。“聚合报告”将基本了解您的REST API性能指标,例如在给定持续时间内发出的请求数,平均响应时间,吞吐量,“90%行”等。[注意:运行JMeter性能不是一个好习惯我们刚刚在GUI模式下测试,因为它消耗更多内存。请查看此提示和技巧 ,了解要遵循的最佳做法。]

摘要:

我们刚刚创建了一个简单的数据驱动框架,用于在不使用任何编程语言的情况下使用JMeter测试REST API的功能行为。 我们还看到了如何通过重用为功能测试创建的相同脚本,使用JMeter对我们的API进行性能测试。

您可能希望继续阅读有关JMeter - REST API - 数据驱动测试的高级用法的更多信息

你是JMeter的新手吗?- 然后你应该完全检查这篇文章,它提供了有关JMeter最佳实践和初学者常见错误的更多信息。

Response Assertion can also compare the response code.
But, We will have more control over Beanshell Assertion.

To check the HTTP response code (assuming you have stored the expected response code in CSV in ‘resCode’ column),

图片

if (ResponseCode.equals(vars.get("resCode")) == true && ResponseData.contains(vars.get("expectedMessage")) == true ) {
SampleResult.setResponseOK();
}else{
Failure=true;
FailureMessage="Response code/data not as expected";
}

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/7987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SparkSQL与Hive整合 、SparkSQL函数操作

SparkSQL与Hive整合 SparkSQL和Hive的整合,是一种比较常见的关联处理方式,SparkSQL加载Hive中的数据进行业务处理,同时将计算结果落地回Hive中。 整合需要注意的地方 1)需要引入hive的hive-site.xml,添加classpath目录下面即可…

【web网页制作】html+css旅游家乡河南开封主题网页制作(4页面)【附源码】

HTMLCSS家乡河南主题网页目录 🍔涉及知识🥤写在前面🍧一、网页主题🌳二、页面效果Page1 首页Page2 开封游玩Page 3 开封美食Page4 留言 🌈 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 🐋四…

springboot lua检查redis库存

需求 最近需求需要实现检查多个马戏场次下的座位等席对应库存渠道的库存余量,考虑到性能,决定采用Lua脚本实现库存检查。 数据结构 库存层级结构 redis库存hash类型结构 实现 lua脚本 --- 字符串分割为数组 local function split(str, char)local…

IIoT:数据融合在工业物联网中的应用——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断发展,工业物联网(IIoT)已经逐渐渗透到各个行业,为企业的生产和管理带来了前所未有的便利。 然而,与此同时,海量的数据也为企业带来了挑战。如何将这些…

【数学建模】天然肠衣搭配问题

2011高教社杯全国大学生数学建模竞赛D题 天然肠衣(以下简称肠衣)制作加工是我国的一个传统产业,出口量占世界首位。肠衣经过清洗整理后被分割成长度不等的小段(原料),进入组装工序。传统的生产方式依靠人工…

基于springboot实现可盈保险合同管理系统项目【项目源码+论文说明】

基于springboot实现可盈保险合同管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本可盈保险合同管理系统就是在这样的大环境下诞生,其…

C#里如何设置输出路径,不要net7.0-windows

官网介绍&#xff1a; 更改生成输出目录 - Visual Studio (Windows) | Microsoft Learn <PropertyGroup> <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> <AppendRuntimeIdentifierToOutputPath>false</Appen…

git bash各分支修改内容不同但合并后不显示冲突问题

在跟着廖雪峰老师的git学习时&#xff0c;按部就班的执行明后&#xff0c;发现 而不是出现原文的结果 解决方法&#xff1a; 切换位feature分支&#xff0c;再合并 git switch feature1 git merge master 此时我们发现&#xff1a; 后面再跟着原文敲就可以了

每日一题5:Pandas-修改列

一、每日一题 一家公司决定增加员工的薪水。 编写一个解决方案&#xff0c;将每个员工的薪水乘以2来 修改 salary 列。 返回结果格式如下示例所示。 解答&#xff1a; import pandas as pddef modifySalaryColumn(employees: pd.DataFrame) -> pd.DataFrame:employees.loc[…

如何更好地使用Kafka? - 故障时解决

要确保Kafka在使用过程中的稳定性&#xff0c;需要从kafka在业务中的使用周期进行依次保障。主要可以分为&#xff1a;事先预防&#xff08;通过规范的使用、开发&#xff0c;预防问题产生&#xff09;、运行时监控&#xff08;保障集群稳定&#xff0c;出问题能及时发现&#…

Databend 开源周报第 143 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 了解 Databend …

Redis学习(十)|使用消息队列的重试机制实现 MySQL 和 Redis 的数据一致性

文章目录 介绍原理整体方案实现步骤示例代码总结其他&#xff1a;Kafka 重试策略配置1. 生产者重试策略配置2. 消费者重试策略配置 介绍 在分布式系统中&#xff0c;保持 MySQL 和 Redis 之间的数据一致性是至关重要的。为了确保数据的一致性&#xff0c;我们通常采取先更新数…

去中心化金融与Web3:科技驱动的金融革命

随着区块链技术的发展和普及&#xff0c;去中心化金融&#xff08;DeFi&#xff09;作为其重要应用之一&#xff0c;正在成为金融领域的一场革命。结合Web3技术&#xff0c;去中心化金融正在以前所未有的方式重新定义着金融服务和产品的交付方式&#xff0c;推动着金融领域的创…

bfs之八数码

文章目录 八数码解题思路图解举例算法思路 代码CPP代码Java代码 八数码 在一个 33的网格中&#xff0c;1∼8这 8个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如&#xff1a; 1 2 3 x 4 6 7 5 8在游戏过程中&#xff0c;可以把 x 与其上、下、左、右四个方向之一…

【Oracle】Linux x86-64 安装Oracle 23AI指南

本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 前言 在信息技术日新月异的今天&#xff0c;企业级数据库系统扮演着数据管理与业务支撑的核心角色。Oracle数据库&#xff0c;作为全球…

IAP15W4K61S4单片机EEPROM读写程序

/*-------------关闭IAP----------------*/ void IapIdle() { IAP_CONTR 0; //关闭IAP功能 IAP_CMD 0; //清除命令寄存器 IAP_TRIG 0; …

专业软件测试会议

全国软件测试会议&#xff1a;这是一个系列性的专业会议&#xff0c;由中国的学术机构或专业组织主办&#xff0c;例如中国计算机学会的容错计算专业委员会。此会议自2005年起开始举办&#xff0c;历届会议地点包括北京、昆明和武汉等地。会议内容覆盖软件测试理论、实践、工具…

跟TED演讲学英文:4 pillars of college success in science by Freeman Hrabowski

4 pillars of college success in science Link: https://www.ted.com/talks/freeman_hrabowski_4_pillars_of_college_success_in_science Speaker: Freeman Hrabowski Date: February 2013 文章目录 4 pillars of college success in scienceIntroductionVocabularyTranscr…

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法 问题描述&#xff1a; Building for iOS-simulator, but linking in object file (/Users/hori/Documents/SDK/SDK/Libs/DCUniRecord.framework/DCUniRecord[arm64][3](PGRecord.o)) built for iOS Linker command fail…

ISIS的工作原理

1.邻居关系建立 &#xff08;1&#xff09;IS-IS领接关系建立原则 1、通过将以太网接口模拟成点到点接口&#xff0c;可以建立点到点链路邻接关系。 2、当链路两端IS-IS接口的地址不在同一网段时&#xff0c;如果配置接口对接收的Hello报文不作IP地址检查&#xff0c;也可以建…