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,请选中此  链接。 它有安装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标头管理器

    • 在HTTP Header Manner配置页面中,单击“添加”。
    • 包括此名称 - 值对。
      • 名称=的Content-Type
      • 值=应用/ JSON
    • 如果您的API需要APIGEE密钥,请将其包含在此处或忽略。
      • 名称= apigeekey
      • 值=测试@ 123

  • 添加  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";
}

 

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

时间: 2024-11-14 12:20:52

JMeter - 如何测试REST API / 微服务的相关文章

测试——《微服务设计》读书笔记

一.测试象限(Brain Marick) 二.测试金字塔(Mike Cohn)       1.单元测试 通常只测试一个函数或方法调用,通过TDD或者基于属性而写的测试就属于这一类,在UnitTest中,我们不会启动服务,对且对外部文件和网络连接的使用也很有限,通常我们需要大量的单元测试. 单元测试是帮助开发人员,是面向技术而非业务的.       2.服务测试 对于包含多个服务的系统,一个服务测试只测试其中一个单独服务的功能.只测试一个单独的服务可以提高测试的隔离性,这样我们可以更快地定位并解

译:基于Spring Cloud Stream构建和测试 message-driven 微服务

原文链接:https://piotrminkowski.wordpress.com/2018/06/15/building-and-testing-message-driven-microservices-using-spring-cloud-stream/ 作者: Piotr Mińkowski 译者: helloworldtang img Spring Boot和Spring Cloud为您提供了一个利用不同的通信方式快速构建微服务的解决方案.您可以基于Spring Cloud Netfli

微服务测试之接口测试和契约测试

日常开发过程中,项目的接口通常由服务提供方约定和提供,微服务模式下接口被多个消费者调用更是常态,那么提供方接口的变更如何快速.高效.无遗漏的通知给消费者呢?另外,当一个service同时被多个使用者调用,如何保证对service的修改可以让其它所有使用者造成的影响都能被感知到?这些问题契约测试可以给你答案.另外,微服务模式下,接口测试是非常重要的测试手段,它在实际的项目中帮助验证微服务之间的协同和交互,大幅降低测试成本和提高测试效率方面提供了很大帮助,可以说接口测试是业务功能测试前置的助推器.因

Springcloud 微服务 高并发(实战1):第1版秒杀

疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列之15 [博客园总入口 ] 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)秒杀系列文章,将为大家介绍三个版本的高并发秒杀: 版本1 :springcloud + zookeeper 秒杀 版本2 :springcloud + redis 分布式锁秒杀 版本3 :springcloud + Nginx + Lua 高性能版本秒杀 这是第一个版本实现,文章比较长,大家可以挑选感兴趣的部分,选择性阅读. 1 为何要以秒杀做为高并发实战案例?

创建微服务?请先回答这10个问题

原文地址:http://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=401654497&idx=1&sn=5cac9aa4ae113592e1513c1ff70ea917&scene=21#wechat_redirect 乍一看微服务似乎很容易构建,但是要真正构建微服务,要完成的工作可比在容器里运行一些代码,并在这些代码间使用HTTP请求进行通信,要多得多.在开发新的微服务之前--必须得在新服务部署到生产环境之前--你需要回答

微服务指南走北(一):微服务是什么

微服务"Microservices"已经成为软件架构最流行的热词之一.网络上看到很多关于微服务的文章,但是感觉很多离我们还很遥远,并且没有找到多少真正在企业场景中应用的实例.此处省略一万字~~~~于是想要将自己最近一段时间使用微服务以及通过看大师们的文章的所思所想梳理出来,分享出来,以供大家参考(热切欢迎大家拍砖,头破血流最好). 什么是微服务 记得刚看到微服务的时候,注意点在微字上,然后才是服务,初步理解为:将整块儿的服务拆分成多个类似工具类的微小web服务,供其他服务调用,每个服务

细说微服务架构的优势与不足那点事

摘要: 一个微服务一般完成某个特定的功能,比如下单管理.客户管理等等.每一个微服务都是微型六角形应用,都有自己的业务逻辑和适配器.一些微服务还 会发布API给其它微服务和应用客户端使用.其它微服务完成一个Web UI,运行时,每一个实例可能是一个云VM或者是Docker容器. 微服务正在博客.社交媒体讨论组和会议演讲中获得越来越多的关注,在Gartner的2014 Hype Cycle上它的排名非常靠前.同时,软件社区中也有不少持怀疑论者,认为微服务不是什么新东西.Naysayers认为这就是S

微服务,真的适合你么?

1.什么是微服务? 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.微服务架构模式(Microservices Architecture Pattern)的目的是将大型的.复杂的.长期运行的应用程序构建为一组相互配合的服务,每个服务都可以很容易做局部修改.微服务架构带来可独立部署.高扩展与伸缩.自由选择开发语言.高效利用资源.故障隔离等优点,同时也因为服务多带来分布式事务

微服务理解

(转至网络)这种微服务架构模式深刻影响了应用和数据库之间的关系,不像传统多个服务共享一个数据库,微服务架构每个服务都有自己的数据库.另外,这种思路也影响到了企业级数据模式.同时,这种模式意味着多份数据,但是,如果你想获得微服务带来的好处,每个服务独有一个数据库是必须的,因为这种架构需要这种松耦合.下面的图演示示例应用数据库架构. 每种服务都有自己的数据库,另外,每种服务可以用更适合自己的数据库类型,也被称作多语言一致性架构.比如,驾驶员管理(发现哪个驾驶员更靠近乘客),必须使用支持地理信息查询的