使用JMETER进行REST API测试

我肯定你在这里是由于你须要加载测试Json Rest API这并不奇怪,由于Rest API如今愈来愈受欢迎。html

这本指南的目的:帮助您进行负载测试一个Json的 REST API 经过一个具体的例子OctoPerf的Json的REST APInginx

本指南将彻底为您提供如下知识:apache

这里没有理论,只有实践:一切都基于一个现实的Rest API(不是一个虚拟的例子)。您能够在学习本教程的同时下载示例JMXjson

准备好学习?咱们走吧!api

休息API登陆

OctoPerf平台基于Json Rest API咱们将看看如何使用JMeter模拟咱们的API登陆服务器

可是身份验证如何运做?咱们如何使用JMeter模拟登陆大多数Rest API使用如下登陆工做流程并发

  1. 登陆使用HTTP POST请求经过提供usernamepassword
  2. 接收临时身份验证令牌,以便之后请求标识本身,
  3. 发送身份验证令牌的后续请求中,典型地经由HTTP标头同样Authorization: Bearer AUTH_TOKEN

OctoPerf API也是如此。这与Oauth身份验证很是接近app

登陆API规范

首先,让咱们看看如何登陆OctoPerf Application值得庆幸的是,咱们的API有一个Swagger规范Swagger是一个提供Rest API文档的工具工具

登陆Swagger SpecDoc指定如何经过OctoPerf的API登陆post

好!如今让咱们来看看使用JMeter进行伪造所需的请求:

  • Http方法:必须是POST请求,带有一些post参数,(参见GET vs POST
  • Http Schemehttps因为咱们的Rest API 受SSL保护
  • 主机名api.octoperf.com
  • 路径 :( /public/users/login登陆端点路径),
  • 发布参数

    • 用户名:账户用户名,若是你没有,你能够在这里轻松注册
    • 密码:关联的密码。

而后咱们应该从服务器接收一个Json Response,它看起来像:

{
  "token": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } 

在这里看到令牌?这是咱们稍后将用于在Rest API上识别本身的东西。可是,首先让咱们来看看JMeter HTTP请求

执行登陆

登陆HTTP请求经过Rest API登陆OctoPerf

在这里,咱们已准备好将Login Http Request发送到咱们的服务器。我刚刚隐藏了敏感信息,但这基本上就是您的账户信息。为了调试登陆,咱们将使用View Results Tree Listener

登陆HTTP请求登陆请求发送到服务器

咱们能够看到,发送的请求是一个POST表单-urlencoded,其中包含咱们的登陆名和密码。这里没什么难的!如今,咱们对服务器发送Json响应感兴趣

登陆HTTP响应从服务器收到响应

精细!如今咱们已经收到了身份验证令牌,咱们能够提取它以在后续请求中重用它。

提取身份验证令牌

基于令牌的身份验证是一种简单的机制,其中令牌惟一地标识用户会话咱们须要处理这个问题dynamic parameter以正确模拟与Json API交互的用户

使用Json Extractor

要从服务器响应中提取身份验证令牌,咱们将使用JMeter JsonPath Extractor从响应中提取变量的过程以下:

  1. 服务器发回对咱们的登陆请求的响应,
  2. 后处理器,像JsonPath提取是继执行
  3. 提取器提取服务器响应的一部分并将其放入变量中${token}

JMeter Json Extractor从服务器响应中提取身份验证令牌

咱们已经使用这些设置配置了JMeter Json Extractor

  • 建立变量的名称token,这将致使带有语法的可重用变量${token}
  • Json Path表达式$.token有关详细信息,请参阅示例JsonPath表达式
  • 而且匹配Nr:简单地说1,第一次出现。但咱们能够把它留空。

看看我放置提取器的位置?loginHTTP请求下。咱们还添加一个Debug Sampler来查看是否正确提取了变量。

启用调试

JMeter调试采样器在Debug Sampler中启用JMeter变量

经过设置JMeter的变量true,咱们启用了采样器输出变量的试运行期间。

测试提取

JMeter调试采样器结果使用Json Extractor从服务器响应中成功提取令牌

大!Json提取器天衣无缝token从Json响应中提取字段的值咱们如今能够${token}在后续请求中使用表达式来执行通过身份验证的请求

让咱们看看咱们如何重用此令牌来告诉咱们的Rest API咱们是一个给定的用户。

从新注册验证令牌

咱们的Rest API有许多须要身份验证的端点这些端点提供用户工做区,项目,虚拟用户等数据。要访问受用户保护的端点,必须:

  • 登陆以获取身份验证令牌(就像咱们以前所作的那样),
  • Authorization: Bearer TOKEN对于每一个后续请求,http请求标头发送身份验证令牌

这正是咱们要在这里作的。

检索用户工做区

咱们如今特别感兴趣的是查询用户的工做空间这是Workspaces API端点的一部分。

工做区API工做区从Swagger API文档中休息API端点

咱们将GET使用路径向端点执行请求/workspaces/member-of它应该返回包含用户工做空间Json响应。这是一个示例响应:

[
  {
    "created": "2018-04-23T12:40:00.133Z", "description": "This is my personal workspace.", "id": "workspaceId", "lastModified": "2018-04-23T12:40:00.133Z", "name": "Personal", "userId": "myUserId" } ] 

让咱们在JMeter中建立一个HTTP请求来查询它们。这很简单,以下面的截图所示。

工做区API从JMeter调用端点成员

在这里,咱们设置了一个HTTP请求来查询用户的工做区:

  • Http方法:必须是GET请求,不涉及参数,
  • Http Schemehttps因为咱们的Rest API 受SSL保护
  • 主机名api.octoperf.com
  • 路径/workspaces/member-of

完了吗?还没。目前,若是咱们不提供身份验证令牌,服务器将拒绝咱们的请求。

工做区成员服务器返回错误

服务器以Http 4xx错误拒绝请求401 Unauthorized

与403 Forbidden相似,但专门用于须要身份验证且已失败或还没有提供的状况。

咱们须要经过Authorization在请求中包含标头来提供身份验证令牌怎么样?经过向请求添加HTTP标头管理器

添加受权标头

工做区成员在Authorization标头中设置提取的令牌

请记住:咱们以前已经token/public/users/login端点服务器响应中提取了如今,是时候重用它来检索访问受保护的资源了:

  1. 首先,getWorkspaces HTTP Request 添加一个Http Header Manager
  2. 添加Authorization带有值标头Bearer ${token}

查看结果树从服务器得到工做区

太好了!它如今正在工做!咱们拥有属于已登陆用户的全部工做空间。

查看结果树受权标头已在请求中发送

受权标头已成功包含在请求标头中。可是,有一点使人讨厌的是:Json格式不正确为何?

大多数服务器以紧凑格式发送json,跳过缩进。这是出于性能缘由(减小带宽使用和服务器CPU使用)

格式化Json响应

为了解决这个问题,JSON Formatter PostProcessor可以很好地完成这项工做。

JMeter Json Formatter PostProcessorJMeter Json Formatter后处理器

请参阅咱们的JMeter插件安装指南,了解如何安装Json插件另外一个选择是使用JSR223脚本本身格式化Json 

JMeter Json响应格式化Json如今打印得很漂亮!

如今,咱们能够利用Json Assertion(在JMeter 4.0中引入的强大功能来检查服务器响应。

使用Json Assertion

咱们将确保服务器响应包含Personal工做区。这是Json断言的工做要添加Json断言,请右键单击HTTP Request采样器,而后选择Add > Post Processor > Json Assertion

组态

JMeter Json响应断言断言响应包含我的工做空间

Json断言配置以下:

  • 断言的Json路径存在$.[1]['name']指第二工做区返回,并采起了name
  • 另外Assert Value:选中以检查name字段的值
  • 预期价值:应该是Personal

执行

假设咱们断言指望值Other不是Personal

JMeter Json响应断言失败查找名为Other的 workspaced时,Json Assertion失败

正如预期的那样,断言失败并显示如下消息:

Assertion error: false Assertion failure: true Assertion failure message: Value expected to be 'Other', but found 'Personal' 

性能

固然,您不只限于使用Json Assertion。若是您愿意,也可使用JMeter Response Assertion在性能方面甚至是有益的,由于根据咱们的断言性能比较表响应断言比Json断言消耗更少的CPU /内存资源

模拟动态行为

如今咱们知道如何登陆Json Rest API并发送访问受保护端点的请求,让咱们看看如何dynamically behaving使用JMeter 模拟用户。

这是本教程的最后一部分:

  • 首先,咱们将提取随机工做区ID,(将${workspaceId}
  • 其次,咱们将使用端点查询该工做空间的项目/projects/by-workspace/${workspaceId}/DESIGN

Projects Rest APIOctoPerf的Projects Rest API端点

最后一个Rest API端点让咱们感兴趣。咱们将从JMeter调用它,但首先咱们须要提取一个随机workspaceId

提取WorkspaceId

JMeter随机Json提取器提取随机workspaceId

提取器配置为getWorkspaces请求的后处理器,具备如下设置:

  • 建立变量的名称workspaceId
  • Json Path表达式$..id
  • 匹配号0,这是随机的。

这将提取随机workspaceId,并将其放入${workspaceId}变量中。

查询项目

最后,咱们须要根据以前提取的内容查询项目workspaceId为此,我复制并修改了以前的请求以得到一些时间。

JMeter随机Json提取器使用workspaceId变量查询项目

在这里,咱们设置了一个HTTP请求来查询工做区的项目:

  • Http方法:必须是GET请求,不涉及参数,
  • Http Schemehttps因为咱们的Rest API 受SSL保护
  • 主机名api.octoperf.com
  • 路径/design/projects/by-workspace/${workspaceId}/DESIGNDESIGN工做空间中包含的项目的状态。(而不是结果,这将是RESULT

我想咱们已经准备好进行快速迭代来试试这个了!

查看结果

JMeter随机Json提取器执行致使查询项目

若是咱们屡次执行用户,咱们会看到响应因提取随机workspaceId 

最后的话

JMeter很是适合Rest API测试,特别是那些基于Json格式的测试使用JMeter测试Json API很是简单

基本上,若是你掌握了上面提到JMeter组件,那么你很高兴!

若是你想进一步挖掘,我强烈建议你阅读咱们的文章:

若是您发现它有用,请随时分享本指南!

相关文章
相关标签/搜索