1. 程式人生 > >JMeter - 如何測試REST API / 微服務

JMeter - 如何測試REST API / 微服務

實踐 style n) 語言 sea 復制 必須 足夠 負載

概述:

有許多方法和工具可用於測試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";
}

JMeter - 如何測試REST API / 微服務