使用jMeter对基于SAP ID service进行Authentication的Restful API进行并发测试

简介: 这篇文章本来Jerry只在SAP社区上写了英文版的,后来有两位做Marketing Cloud开发的德国同事,写邮件询问关于文章的更多细节,声称这种方式对他们自己的API性能测试很有用,所以我觉得还是值得用中文再写一遍。

这篇文章本来Jerry只在SAP社区上写了英文版的,后来有两位做Marketing Cloud开发的德国同事,写邮件询问关于文章的更多细节,声称这种方式对他们自己的API性能测试很有用,所以我觉得还是值得用中文再写一遍。

clipboard1

在SAP官网api.sap.com里有大量发布的API,方便合作伙伴和客户自开发应用同SAP解决方案进行集成。

clipboard2

比如Jerry上个月做的一个项目,就是和国内一家专注于提供人脸识别技术解决方案的企业合作, 用户通过微信扫码从而完成人脸识别后,在用户授权的情况下,会调用SAP Marketing Cloud的contact API,生成对应的contact数据,并且将人脸识别得出的面部特征码通过Marketing Cloud扩展字段的方式一并存入contact数据中。

因为这个项目最后会在2019年6月5日于上海举行的SAP云大会上展示,所以当时Jerry完成集成工作后心想,还是得提前测试一下咱们的Marketing Cloud在响应并发请求时的性能, 做到心里有数。

clipboard3

我们在SAP上海云大会上演示的场景是,将SAP Marketing Cloud的Launchpad通过大屏幕投影出来,参会嘉宾完成人脸识别后,Marketing Cloud contact创建API自动被调用,在系统生成contact数据,并且Launchpad contact tile的计数器加一。

clipboard4
clipboard5

所以下一步就是如何模拟大量对Marketing Cloud API的并发请求。

对于程序员来说,最容易想到的方式就是自己动手写一个程序来发送大量请求。Jerry选择的最简单的编程方式,在Java程序里新建大量线程,每个线程发送一个请求,当然也可以直接用JDK里提供的线程池库。我的Java程序源代码在github上:

https://github.com/i042416/JavaTwoPlusTwoEquals5/tree/master/src/odata

除了自己动手编写代码外,还可以重用一些API测试工具来达到同样的目的。Postman是一个API开发人员常用的接口调试利器,它也有定义变量和简易的编程功能:

clipboard6

可以通过称之为Collection Runner的功能,一键运行Collection里的多个请求。

clipboard7

Jerry在这篇SAP社区博客里详细介绍过Postman的编程:

Just a single click to test SAP OData Service which needs CSRF token validation
https://blogs.sap.com/2019/06/10/sap-just-a-single-click-to-test-sap-odata-service-which-needs-csrf-token-valid/

Jerry还在成都C4C开发团队时,组内同事就告诉过我,jMeter是另一个功能强大的基于Java的API压力测试工具。所以这次我选择用jMeter来对API做压力测试。

下文介绍的内容需要大家对jMeter的使用有最基本的了解,如果还不太熟悉的朋友,可以先查阅jMeter的官方文档。

总的思路就是使用jMeter提供的Thread Group(线程组)和控制器这两个工具。Thread Group帮助工具使用者实现了通过多线程发送HTTP请求的功能,比如下图设定的100,意思是通过100个线程同时发送请求。

clipboard8

而涉及到对系统进行写操作的SAP API,比如新建,修改或者删除数据的SAP OData服务,在请求的HTTP头部必须附带防止跨域请求伪造攻击的CSRF token(有时又称XSRF token:Cross-site request forgery). 我们可以将从服务器获取CSRF token的请求和真正调用contact API的请求放到同一控制器里,这样能确保同一线程内,拿token和创建contact这两个请求依次执行。

clipboard9

SAP云平台的官网上有一个帮助文档,对用户访问SAP云平台上的服务的Authentication流程做了清晰的阐述:

https://cloudplatform.sap.com/scenarios/usecases/authentication.html

clipboard10

这张图描述了在Authentication场景下,几个名词User(有时称为Client), Service Provider和Identity Provider(途中简写成IdP)的相互作用关系。

虽然Jerry本文介绍的场景,我用jMeter消费的是Marketing Cloud上的服务,而非SAP云平台上的服务,不过这些服务对应的Idp都是SAP ID service,即accounts.sap.com, 因此Authentication原理仍然相同。

我们牢牢记住这张图的几个步骤,因为我们接下来用jMeter消费Marketing Cloud API时,同样要遵循这种Authentication流。

我们先用Chrome访问SAP Marketing Cloud Fiori Launchpad,来深入理解图中介绍的Authentication流程。

  1. 浏览器打开SAP Marketing Cloud Fiori Launchpad链接,HTTP请求发送到了Marketing Cloud系统,后者可以视为Service Provider。
  2. Marketing Cloud把请求通过HTTP 302重定向了它预先配置好的IdP上去,即SAP ID service(也就是account.sap.com).

clipboard11

关于什么是SAP ID service,可以查看SAP官方帮助文档:

https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/d6a8db70bdde459f92f2837349f95090.html

  1. IdP的职责是完成实际的用户认证工作,它给用户返回一个登录页面,要求其输入用户名和密码。

clipboard12

上图显示的是SAP ID Service的登录页面,UI虽然简单,但是这个页面的源代码里存在很多隐藏字段。

用Chrome开发者工具能够发现这些隐藏字段:

clipboard13

xsrfProtection
spId
spName
authenticity_token
idpSSOEndpoint

这些字段都是在SAP ID Service的服务器端生成,然后返回给客户端。

  1. 用户输入密码点击登录按钮后,用户输入的用户名和密码,同第三步介绍的登录页面的隐藏字段,会一齐返回给SAP ID Service服务端。可以在Chrome开发者工具里观察到这些字段位于HTTP请求头部。

clipboard14

  1. IdP完成用户认证,颁发一个"assertion"响应,值存储于HTTP响应头部的SAMLResponse字段里。

clipboard15

这个字段的SAML表明这是一个基于SAML协议的认证过程,把上图Chrome开发者工具里观察到的SAMLResponse字段值通过BASE64解码,得到下图的XML格式的assertion内容:

clipboard16

上图第一处用红色矩形框高亮的字段是assertion的状态,值为success. 因为SAP ID Service和Marketing Cloud系统配置为互相信任,所以这意味着SAP ID Service通知Marketing Cloud,这个用户的认证已经通过了。

SAML协议规范的官方文档:

http://saml.xml.org/saml-specifications

有了上述的理论基础后,进行jMeter项目的配置工作思路也就清楚了。

我把jMeter项目的工程文件放到我的Github上了,方便大家重用:

https://github.com/i042416/KnowlegeRepository/blob/master/ABAP/C4COData/jMeter/01-contact-creation.jmx

在jMeter里,我们按照SAP官网认证架构图的6个步骤来配置:

clipboard17

  1. 使用jMeter提供的正则表达式提取器,将认证流程第3个步骤,IdP返回的登录页面的5个隐藏字段的值提取出来,存储成jMeter变量:

clipboard18

下图显示了这些隐藏字段的值被成功提取出来并存储成jMeter变量:

clipboard19

  1. 把第一步提取出并存储在jMeter变量中的五个字段的值(下图红色)的值,再加上用户手动输入的用户名和密码(下图蓝色), 作为请求的头部字段,一齐提交给SAP ID service:

clipboard20

登录成功后,收到了服务器端返回的Cookie值:

clipboard21

  1. 发送新的请求给服务器,获取CSRF token. 这个请求的响应里包含了两个下图高亮的Cookie,需要同样存储成jMeter变量,以供最后一个请求使用。

clipboard22

  1. 最后一个步骤,将前一步获取到的CSRF token附加到HTTP请求字段中,同时带上前一步服务器返回的两个Cookie字段:

clipboard23

至此这个jMeter项目的配置工作就完成了,其优于Java编程和Postman之处在于我们不需要编写一行代码,我们对API进行并发测试这个需求的相关功能点全部能够通过jMeter里的配置完成。

clipboard24

最后简单测试一下并发请求的响应时间:

clipboard25

我在使用jMeter调用contact API创建工作时用到了简单的随机数生成器,在contact的姓后面加上了简单的随机数,这是最后通过jMeter生成的contact在Marketing Cloud里的显示:

clipboard26

最后一步就是把SAP Marketing Cloud Launchpad里的contact tile的计数器刷新间隔设置成10秒刷新一次:

clipboard27

系统显示,在2019年6月5日上海SAP云大会这个演示场景的展台上,一共有276个嘉宾完成了人脸识别后的Marketing Cloud contact注册流程。

clipboard28

本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

相关文章
|
28天前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
51 2
|
2月前
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
23天前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
25天前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
109 7
Jmeter实现WebSocket协议的接口测试方法
|
27天前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【9月更文挑战第10天】随着软件应用的不断扩展,性能测试成为确保系统稳定运行的关键环节。本文通过对比Apache JMeter和Locust,探讨了如何在Python环境中利用这两款工具挖掘更多性能测试潜力。JMeter是一款成熟且功能强大的开源工具,支持多种协议,适用于各种应用的测试;而Locust则基于Python,通过简单脚本模拟HTTP请求,更适合Web应用测试。
59 2
|
1月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【9月更文挑战第5天】性能测试是确保应用在高负载下稳定运行的关键。本文介绍Apache JMeter和Locust两款常用性能测试工具,帮助识别并解决性能瓶颈。JMeter适用于测试静态和动态资源,而Locust则通过Python脚本模拟HTTP请求。文章详细讲解了安装、配置及使用方法,并提供了实战案例,帮助你掌握性能测试技巧,提升应用性能。通过分析测试结果、模拟并发、检查资源使用情况及代码优化,确保应用在高并发环境下表现优异。
48 5
|
29天前
|
消息中间件 监控 测试技术
惊呆了!Python性能测试高手都用这些神器:JMeter+Locust,效率翻倍📈
【9月更文挑战第8天】在软件开发中,性能测试对确保应用稳定性和高效运行至关重要。对于Python开发者而言,选择合适的性能测试工具能显著提升测试效率并精准定位性能瓶颈。本文深入探讨了JMeter和Locust这两款工具的独特优势。JMeter作为跨平台的性能测试工具,支持多种协议,具备高度可定制性和扩展性;而Locust则专为Python应用设计,利用协程实现高并发,提供实时监控和分布式测试功能。两者结合使用,可在实际项目中实现1+1>2的效果,帮助开发者构建全面高效的测试方案,保障应用稳定运行。
65 1
|
1月前
|
测试技术 Apache 数据库
从慢如蜗牛到飞一般的感觉!Python性能测试实战,JMeter&Locust助你加速🏃‍♂️
【9月更文挑战第6天】你的Python应用是否曾因响应缓慢而让用户望而却步?借助JMeter与Locust,这一切将迎刃而解。JMeter作为Apache基金会的明星项目,以其强大的跨平台和多协议支持能力,成为性能测试领域的魔法师;而Locust则以Python的简洁与高效,让性能测试更加灵活。通过实战演练,你可以利用这两款工具轻松识别并解决性能瓶颈,优化数据库查询、网络配置等,最终使应用变得敏捷高效,轻松应对高并发挑战。
16 1
|
1月前
|
测试技术 持续交付 Apache
性能测试不再愁!Python+JMeter+Locust,三步打造高性能应用
【9月更文挑战第4天】随着互联网的发展,软件性能成为衡量应用成功的关键。性能测试确保应用稳定高效运行,但复杂环境和多样需求带来了挑战。Python、JMeter和Locust三款工具可构建高效全面的性能测试方案。Python语法简洁,库丰富;JMeter提供图形界面,支持多种协议;Locust基于Python,简单易用且高度可扩展。结合三者,能满足复杂需求,保证灵活性与高效性。无论初学者还是资深工程师,都能确保应用高性能运行。
27 1
|
2月前
|
前端开发 API 网络架构
【Azure 应用服务】能否通过 Authentication 模块配置 Azure AD 保护 API 应用?
【Azure 应用服务】能否通过 Authentication 模块配置 Azure AD 保护 API 应用?
下一篇
无影云桌面