1. 程式人生 > >使用jMeter對基於SAP ID service進行Authentication的Restful API進行併發測試

使用jMeter對基於SAP ID service進行Authentication的Restful API進行併發測試

這篇文章本來Jerry只在SAP社群上寫了英文版的,可以通過點選文末的“閱讀原文”獲得。後來有兩位做Marketing Cloud開發的德國同事,寫郵件詢問關於文章的更多細節,聲稱這種方式對他們自己的API效能測試很有用,所以我覺得還是值得用中文再寫一遍。

在SAP官網api.sap.com裡有大量釋出的API,方便合作伙伴和客戶自開發應用同SAP解決方案進行整合。

比如Jerry上個月做的一個專案,就是和國內一家專注於提供人臉識別技術解決方案的企業合作, 使用者通過微信掃碼從而完成人臉識別後,在使用者授權的情況下,會呼叫SAP Marketing Cloud的contact API,生成對應的contact資料,並且將人臉識別得出的面部特徵碼通過Marketing Cloud擴充套件欄位的方式一併存入contact資料中。

因為這個專案最後會在2019年6月5日於上海舉行的SAP雲大會上展示,所以當時Jerry完成整合工作後心想,還是得提前測試一下咱們的Marketing Cloud在響應併發請求時的效能, 做到心裡有數。

我們在SAP上海雲大會上演示的場景是,將SAP Marketing Cloud的Launchpad通過大螢幕投影出來,參會嘉賓完成人臉識別後,Marketing Cloud contact建立API自動被呼叫,在系統生成contact資料,並且Launchpad contact tile的計數器加一。

所以下一步就是如何模擬大量對Marketing Cloud API的併發請求。

對於程式設計師來說,最容易想到的方式就是自己動手寫一個程式來發送大量請求。Jerry選擇的最簡單的程式設計方式,在Java程式裡新建大量執行緒,每個執行緒傳送一個請求,當然也可以直接用JDK裡提供的執行緒池庫。我的Java程式原始碼在github上:

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

除了自己動手編寫程式碼外,還可以重用一些API測試工具來達到同樣的目的。Postman是一個API開發人員常用的介面除錯利器,它也有定義變數和簡易的程式設計功能:

可以通過稱之為Collection Runner的功能,一鍵執行Collection裡的多個請求。

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個執行緒同時傳送請求。

而涉及到對系統進行寫操作的SAP API,比如新建,修改或者刪除資料的SAP OData服務,在請求的HTTP頭部必須附帶防止跨域請求偽造攻擊的CSRF token(有時又稱XSRF token:Cross-site request forgery). 我們可以將從伺服器獲取CSRF token的請求和真正呼叫contact API的請求放到同一控制器裡,這樣能確保同一執行緒內,拿token和建立contact這兩個請求依次執行。

SAP雲平臺的官網上有一個幫助文件,對使用者訪問SAP雲平臺上的服務的Authentication流程做了清晰的闡述:

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

這張圖描述了在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).

關於什麼是SAP ID service,可以檢視SAP官方幫助文件:

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

  1. IdP的職責是完成實際的使用者認證工作,它給使用者返回一個登入頁面,要求其輸入使用者名稱和密碼。

上圖顯示的是SAP ID Service的登入頁面,UI雖然簡單,但是這個頁面的原始碼裡存在很多隱藏欄位。

用Chrome開發者工具能夠發現這些隱藏欄位:

xsrfProtection spId spName authenticity_token idpSSOEndpoint

這些欄位都是在SAP ID Service的伺服器端生成,然後返回給客戶端。

  1. 使用者輸入密碼點選登入按鈕後,使用者輸入的使用者名稱和密碼,同第三步介紹的登入頁面的隱藏欄位,會一齊返回給SAP ID Service服務端。可以在Chrome開發者工具裡觀察到這些欄位位於HTTP請求頭部。

  1. IdP完成使用者認證,頒發一個"assertion"響應,值儲存於HTTP響應頭部的SAMLResponse欄位裡。

這個欄位的SAML表明這是一個基於SAML協議的認證過程,把上圖Chrome開發者工具裡觀察到的SAMLResponse欄位值通過BASE64解碼,得到下圖的XML格式的assertion內容:

上圖第一處用紅色矩形框高亮的欄位是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個步驟來配置:

  1. 使用jMeter提供的正則表示式提取器,將認證流程第3個步驟,IdP返回的登入頁面的5個隱藏欄位的值提取出來,儲存成jMeter變數:

下圖顯示了這些隱藏欄位的值被成功提取出來並存儲成jMeter變數:

  1. 把第一步提取出並存儲在jMeter變數中的五個欄位的值(下圖紅色)的值,再加上使用者手動輸入的使用者名稱和密碼(下圖藍色), 作為請求的頭部欄位,一齊提交給SAP ID service:

登入成功後,收到了伺服器端返回的Cookie值:

  1. 傳送新的請求給伺服器,獲取CSRF token. 這個請求的響應裡包含了兩個下圖高亮的Cookie,需要同樣儲存成jMeter變數,以供最後一個請求使用。

  1. 最後一個步驟,將前一步獲取到的CSRF token附加到HTTP請求欄位中,同時帶上前一步伺服器返回的兩個Cookie欄位:

至此這個jMeter專案的配置工作就完成了,其優於Java程式設計和Postman之處在於我們不需要編寫一行程式碼,我們對API進行併發測試這個需求的相關功能點全部能夠通過jMeter裡的配置完成。

最後簡單測試一下併發請求的響應時間:

我在使用jMeter呼叫contact API建立工作時用到了簡單的隨機數生成器,在contact的姓後面加上了簡單的隨機數,這是最後通過jMeter生成的contact在Marketing Cloud裡的顯示:

最後一步就是把SAP Marketing Cloud Launchpad裡的contact tile的計數器重新整理間隔設定成10秒重新整理一次:

系統顯示,在2019年6月5日上海SAP雲大會這個演示場景的展臺上,一共有276個嘉賓完成了人臉識別後的Marketing Cloud contact註冊流程。

要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":

相關推薦

使用jMeter基於SAP ID service進行Authentication的Restful API進行併發測試

這篇文章本來Jerry只在SAP社群上寫了英文版的,可以通過點選文末的“閱讀原文”獲得。後來有兩位做Marketing Cloud

Jmeter基於websocket協議的壓力測試

等待時間 ads 響應消息 一次 .org 完成 毫秒 新的 字節 Jmeter對基於websocket協議的壓力測試 WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通信(full-duplex)。

使用locust設備ID的生成邏輯的並發測試初步實踐

locust 壓測 分布式測試 項目背景:現階段我們項目主要有兩大場景,一是交易風控,二是賬戶風控,兩大的場景的很多規則都和設備ID有關,比如設備黑名單,設備A在黑名單庫並且相關規則開啟,設備A請求交易時就會有預警事件發生,所以設備ID的生成邏輯至關重要,主要和A、B、C 三大因素有關,大概如下:

LVM中基於xfs的文件系統進行擴容

linux以前沒接觸過CentsOS 7 ,對其所改變的特性不了解,偶然在centos 7中接觸到LVM,創建LVM的方法和6中沒有區別,但是對LVM進行擴容就有點不一樣了,使用以前的方法進行擴容後始終沒有生效,折騰了半天才搞清楚其擴容的方法。Xfs是CentOS7的默認文件系統類型,而不同文件系統類型對應的

通過JmeterDubbo接口進行接口及性能測試

抽象 進行 jet 自動發現 nta 客戶端 連接 reg spa dubbo接口/性能測試 dubbo簡介 zookeeper簡介、安裝及配置 dubbo服務端demo dubbo客戶端調用 jmeter工程改造及接口調用 讀取jmeter參數用於dubbo性能測試

基於數值分析思想多項式求值的原理和應用進行探究

數值分析 use com 相加 emp 要花 class RoCE size 摘要:多項式是由多個單項(符號項如:5x或者常數項4)通過四則運算組合起來的式子,如P(x)=2x^4+3x^3-3x^2+5x-1 一般的求解會將特定的x代入到上式中,一個一個的計算,共需要

軟銀、Synchronoss與TBCASoft攜手基於富通訊服務和區塊鏈的移動支付服務進行概念驗證

新澤西州布里奇沃特--(美國商業資訊)--日本電信運營商軟銀公司(SoftBank Corp.)、全球雲業務、資訊傳送、數字和物聯網產品的領導者和創新公司Synchronoss Technologies, Inc.以及跨運營商區塊鏈平臺技術創新公司TBCASoft, Inc.

使用JMeterTomcat進行壓力測試與Tomcat效能調優

一、準備工作。       1、安裝JDK1.6或1.6版本以後的,並配置環境變數。       2、在Apache的官網下載最新的Jmeter,  http://jmeter.apache.org/download_jmeter.cgi,截止目前為止,最新的Jmeter是

如何使用jMeter某個OData服務進行併發效能測試

For project reason I have to measure the performance of OData service being accessed parallelly. And I plan to use the open source tool JMeter to generate

如何使用jMeter某個OData服務進行高並發性能測試

ive count exp each achieve .com ast onf mod For project reason I have to measure the performance of OData service being accessed parallel

如何用JMeterMySQL資料庫進行壓測?

在Jmeter中建立一個JDBC Request 測試計劃主要分兩步。 (1)設定JDBC連線池(在JDBC Connection Configuration) (2)新增JDBC Request 其他步驟就是設定引數化、斷言、監聽結果。 第一步:新增 JDBC Conne

使用 JMeter SOAP 應用進行壓力或效能測試

Appache JMeter 以及 SOAP 協議簡述 開源測試工具:Appache JMeter JMeter 是 Apache 基金會 Jakarta 上的一個純 Java 開源專案,起初用於基於 Web 的壓力測試(pressure test),後來其應用範圍逐漸擴充套件到對檔案傳輸 FTP,

使用監聽器Spring bean id進行唯一校驗

       因為Spring IOC容器啟動載入時會檢查bean定義是否有重複,如果有重複則會根據AbstractRefreshableApplicationContext類中的allowBeanDefinitionOverriding屬性值進行判斷,如果值為true,則把

如何用SAP WebIDE的Fiori建立嚮導基於ABAP OData service快速建立UI5應用

如果我們手上已經有可以正常工作的OData服務,無論位於ABAP on-premise系統還是public上的internet O

使用JmeterAPI進行性能測試

使用 method 報告 dom scheduler npr def rman ads 先補充剛才測試的部分截圖余下,後續詳細補充內容。 API Test.jmx 如下: <?xml version="1.0" encoding="UTF-8"?>

網絡安全熱門話題——如何被(已經/正在)入侵網站進行檢測和防範

網絡 安全 熱門 九月安全專題討論:網絡安全熱門話題——如何對被(已經/正在)入侵網站進行檢測和防範擬進行以下技術(可以自定義相關技術)討論和技術研究,歡迎大家參與:(1)網站入侵日誌文件分析(2)抓包分析入侵行為並修補程序漏洞(3)從規則進行安全防護(4)在線監測webshell等惡意行為(5)

StringUtil字符串類型參數進行校驗的工具類

ring oms win shu ogl href sin oci nfa 9圖uO17茲S笨尚付5截Lhttp://www.docin.com/yizl7171 tDRD7y2PX笆http://www.docin.com/app/user/userinfo?useri

Java中List集合排序的方法 比較器的使用 根據學生象數序 語文 英語成績總和進行sort排序

private system.in set swift ringbuf 直觀 turn @override encoding package com.swift; import java.util.ArrayList; import java.util.Collecti

11.表達式計算一串加減乘除帶括號進行計算

pan fin gpo ++ 字符 第一個 std 取數 main 算法流程圖: 執行截圖: 完整代碼: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <

XML與WEB SERVICE的一些認識

對XML與WEB SERVICE的認識一、XML: XSLT:文件轉換器,可以把XML文件轉換成HTML文件 XSL-FO:為XML文件添加樣式,相當於CSS XPATH/XQUERY:在XML中查詢內容 XLINK/XPOINTER:在XML文檔中定義超鏈接 DTD/SCHEMA:定義合法的XML文檔 X