使用JMeter進行RESTful API測試


在哪里設置實現最優腳本重用的屬性

由於支持雲的應用程序通常可以輕松、快速地進行復制和部署,所以可以在多種環境中對其進行測試。如果您需要在多個環境中測試和運行自動化腳本,那么可以在 JMeter 中使用一個獨立的屬性文件為連接資源(如,應用服務器和數據庫)定義數據(包括登錄憑據),這樣做很有好處。

在 JMETER_HOME/bin 目錄下的三個文件中定義 JMeter 的屬性和變量。在啟動 JMeter 時,它會按以下順序加載這些文件:

  1. jmeter.properties
  2. 一個可選的用戶定義的屬性文件
  3. system.properties

當 JMeter 正在運行的時候,如果要添加任何新屬性或改變現有的屬性,則必須先關閉 JMeter,然后重新啟動它,使更改生效。

jmeter.properties 文件存儲與 JMeter 應用程序本身有關的屬性。這個文件中僅 保留了特定於 JMeter 程序的屬性或特定於框架的屬性。創建一個單獨的文件(文件名由您選擇),用該文件來存儲測試環境特定的屬性和變量,它們對於和接受測試的應用程序有關聯的所有腳本來說是全局的屬性和變量 — 例如,管理員的用戶名/密碼。在 jmeter.properties 文件中,取消對 user.properties 設置的注釋,並將 user.properties 的值設置為所創建的文件的名稱。清單 1 中的示例將該值設置為 myuser.properties:

清單 1. 在 jmeter.properties 文件中指定一個用戶屬性文件

# Should JMeter automatically load additional JMeter properties?
# File name to look for (comment to disable)
user.properties=myuser.properties

清單 2 中的示例用戶屬性文件顯示了在用戶屬性文件中定義變量所用的格式。(在該定義中,等號左邊的任何地方都不允許有空格;必要時,屬性值可以包含空格)。

清單 2. 示例用戶屬性文件

#----------------------------------------------------------------
# FVT API Test Environment parameters
#----------------------------------------------------------------
#
# --- Login Credentials
USER_LOGIN=admin@in.ibm.com
USER_PASSWORD=password
#
# --- Application Server
APP_SERVER=localhost
APP_PORT=80
APP_CONTEXT=ctx
PROTOCOL=http
#
# --- Database Server${DB_NAME}
DB_HOST=localhost
DB_PORT=50000
DB_NAME=dbname
DB_USER=dbadmin
DB_PASSWORD=dbpassword

應保留 JMeter 的第三個屬性文件 system.properties,以便必須為所有腳本定義的全系統屬性能夠使用它。例如,如果您的所有腳本都使用某個特定的數據庫服務器,那么您可以在 system.propterties 文件中指定相關的屬性。

JMeter 的 User Defined Variables 控制面板(如圖 1 所示)顯示了 JMeter 腳本如何讀取在用戶屬性文件中定義的屬性。

圖 1. JMeter 腳本如何讀取在用戶屬性文件中定義的配置數據

JMeter User Defined Variables 控制面板的屏幕截圖,顯示了 JMeter 腳本如何讀取已在用戶屬性文件中定義的屬性

控制面板的 Value 列中的每個項目的格式為:

${__property(VARIABLE_NAME,VARIABLE_NAME)}

例如,來自用戶屬性文件的 USER_LOGIN 變量被讀取為腳本中的 ${__property(USER_LOGIN, USER_LOGIN)} 函數。括號中的第一個 USER_LOGIN 是在屬性文件中定義的變量的名稱(並且已在控制面板的 Name 列中列出)。如果屬性文件中沒有定義變量,那么第二個實例是默認值或回退值。

何時在屬性文件中定義一個變量,何時將它定義為 JMeter 腳本里面的一個變量,這些並沒有嚴格的規定。但有兩個准則可以幫助您在多個 JMeter 腳本中實現一致性,並減少不必要的重復變量定義:

  • 如果在幾個腳本一致地使用相同的值,那么可以在用戶屬性文件或 system.properties 文件中定義數據。這方面的示例包括系統變量(例如,數據庫名稱和服務器名稱),以及執行范圍的變量(例如,日志級別)。
  • 如果一些腳本使用一個在各腳本中可能會變化的值,那么可以將它定義為一個腳本變量,或在外部數據文件中定義它,例如,逗號分隔值(CSV)文件。

使用 JSON 模板文件實現有效負載分離

許多雲 API 要求使用 JSON 有效負載作為輸入。JSON 定義了一組結構化的元素,可以將它們嵌套在其他元素中。每一個元素定義一個或多個名稱/值對。功能測試包括以指定格式反復提供數據。例如,在一個典型的 REST API 調用中,JSON 有效負載在 REST HTTP 請求的主體中傳遞,並且通常包含硬編碼的數據。硬編碼的數據通常會在多個測試中重復,並分散在整個腳本中。

這種方法的一個常見問題是,如果 JSON 結構(或數據)發現變化(也許是因為 API 參數的更改),那么您必須進入 JMeter 測試,找到 HTTP 請求的主體,並修改 JSON 結構(和數據),以滿足新的要求。如果在使用此 JSON 結構的多個 JMeter 測試用例中有數千個 HTTP 請求,那么必須執行許多重復的編輯。

更好的方法是創建一個 JSON 結構模板,並定義數據目的地的替換字符串。JSON 模板不包含任何硬編碼的數據值,而是定義在腳本運行時隨實際數據一起加載的引用變量。然后,模板被讀入 JMeter 腳本中的某個變量,並在 HTTP 請求主體中被替換。

清單 3 顯示了定義一個 JSON 有效負載的傳統方式:

清單 3. JMeter 測試計划中的靜態 JSON 定義

{
   "Customer":{
      "CustomerType":"DIRECT",
      "CustomerNumber":"1234567890",
      "Organization":{
         "OrgName":"IBM",
         "Phone":"999-999-9999",
         "AddressSet":[

            {
               "AddressLine1":"Tech Park One",
               "AddressLine2":"",
               "AddressType":"MAILING",
               "City":"Pune",
               "Country":"India",
               "State":"Maharashtra",
               "StateCode":"MH",
               "PostalCode":"411006"
            }
         ],
         "Contact":{
            "FamilyName":"Gilra",
            "GivenName":"Shalini",
            "EmailAddress":"shagilra@in.ibm.com",
            "NamePrefix":"Miss",
            "LanguagePreference":"EN_US",
            "WorkPhone":"999-9999"
         }
      }
   }
}

清單 4 顯示了在模板中定義 JSON 的動態方式:

清單 4. 在外部 JSON 模板文件中的動態 JSON 定義

{ 
   "Customer":{ 
      "CustomerType":"${__eval(${STR_CUSTOMERTYPE})}", 
      "CustomerNumber":"${__eval(${STR_CUSTOMERNUMBER})}", 
      "Organization":{ 
         "OrgName":"${__eval(${STR_ORGNAME})}", 
         "Phone":"${__eval(${STR_PHONE})}", 
         "AddressSet":[ 
            { 
               "AddressLine1":"${__eval(${STR_ADDRESSLINE1})}", 
               "AddressLine2":"${__eval(${STR_ADDRESSLINE2})}", 
               "AddressType":"${__eval(${STR_ADDRESSTYPE})}", 
               "City":"${__eval(${STR_CITY})}", 
               "Country":"${__eval(${STR_COUNTRY})}", 
               "State":"${__eval(${STR_STATE})}", 
               "StateCode":"${__eval(${STR_STATECODE})}", 
               "PostalCode":"${__eval(${STR_POSTALCODE})}", 
            } 
         ], 
         "Contact":{ 
            "FamilyName":"${__eval(${STR_FAMILYNAME})}", 
            "GivenName":"${__eval(${STR_GIVENNAME})}", 
            "EmailAddress":"${__eval(${STR_EMAILADDRESS})}", 
            "NamePrefix":"${__eval(${STR_NAMEPREFIX})}", 
            "LanguagePreference":"${__eval(${STR_LANGUAGEPREFERENCE})}", 
            "WorkPhone":"${__eval(${STR_WORKPHONE})}", 
         } 
      } 
   } 
}

清單 3 中的 JSON 實體只包含硬編碼的數據。相反,清單 4 中的模板只包含引用變量的名稱,所以,任何 JMeter 測試計划都可以使用模板。實際數據被單獨存儲在 CSV 數據文件中,我們將在 下一節 討論它。

請注意,清單 4 中的 JSON 為每個已定義的替代變量調用了 JMeter __eval() 函數。增加的這一步驟使得在運行時執行 JMeter 腳本的時候可以對變量進行計算。

圖 2 和圖 3 顯示了如何在 JMeter 測試腳本中指定 JSON 實體模板文件。圖 2 顯示了 HTTP Request 控制面板:

圖 2. 在測試中使用一個模板文件的內容

JMeter HTTP Request 控制面板的屏幕截圖,配置該面板,以便在測試中使用某個模板文件的內容

在圖 2 的示例中,CUSTOMER_JSON 變量表示整個JSON Customer 元素。該變量被封閉在 _eval() 函數中,顯示為 HTTP 請求的主體(在 Parameters 選項卡上的 Send Parameters With the Request 標題下)。然后,在圖 2 中,請求主體是 ${_eval(${CUSTOMER_JSON})}。

在 User Parameters 控制面板中定義 CUSTOMER_JSON 變量,如圖 3 所示:

圖 3. 在 JMeter 腳本中讀取 JSON 模板文件

用於 JMeter 測試的 User Parameters 控制面板的屏幕截圖,顯示了該腳本如何讀取一個 JSON 模板文件

在圖 3 中,CUSTOMER_JSON 變量被設置為 FileToString(),並使用指向 JSON 模板文件的路徑作為參數。JSON 實體模板文件的所有內容都被讀入 CUSTOMER_JSON 變量。因此,JSON 實體模板文件的內容是在運行時計算的,所定義的所有替代字符串都被翻譯成為它們定義的數據。(下一節 將說明替代變量如何與實際數據相關聯)。

因為 JMeter 的 JSON 實體模板文件對於 JMeter 測試腳本是外部文件,所以您可以將它們存儲在一個單獨的目錄,比如 JMETER_HOME/tests/jsontemplates。當您訪問 JMeter 測試計划中的某個 JSON 實體模板時,可指定相對於 JMeter BIN 目錄的名稱,例如:

../tests/jsontemplates/customer_template.json

您也可以將模板存儲在 JMETER_HOME 目錄以外的地方,在這種情況下,您必須提供絕對路徑。

使用 CSV Data Set Config 元素的數據抽象

雖然將測試數據與 JMeter 測試計划分開在最初看起來像是執行了額外的工作,但是更簡潔的測試中的分離結果也更容易管理。在需要修改測試時,就可以快速實現一些好處。某些數據可能仍然位於本地,存在於每個測試計划中,但大多數的測試數據抽象到外部文件中 — 在屬性文件(正如我們前面討論過的)或一個 CSV 數據配置文件中。所產生的測試套件更易於維護,而且在大多數情況下,不需要編輯 JMeter 測試計划就可以修改任何數據值。

JMeter 使​​用 CSV 文件存儲以逗號分隔的數據行。JMeter 框架的 CSV Data Set Config 功能提供了一種在運行時動態讀取 CSV 文件測試數據的方法。將測試數據存儲為 CSV 另外一個好處是,您可以存儲多行代表多個數據對象/變量的數據,或循環處理的多次迭代的數據。JMeter 2.3.4 及更高版本還支持提供一個 CSV 標題 作為文件的第一行。然后,使用標題的分隔字符串名稱存儲所定義的數據值。通常情況下,隨后每一行的數據都代表循環的一次迭代。從這個意義上講,該腳本主要是 “數據驅動的”,測試人員可以修改 CSV 文件中的數據,無需對 JMX 腳本進行任何更改。

測試人員還可以跨多個測試線程共享數據,並在多個 CSV 文件中存儲測試數據。例如,如果有一個測試用一組用戶憑據登錄,然后為該用戶創建一個訂單,那么您可以創建兩個 CSV 文件:一個用於保存用戶憑據,另一個用於保存訂單信息。有時候,可能需要創建多個 JMX 腳本來訪問 CSV 文件。在這種情況下,您必須將 CSV 文件放在多個腳本都可以訪問的位置。

在一個 CSV 文件內定義的迭代數據通常與變量名稱有關聯。您可以在標題中定義這些變量名稱,用逗號分隔,並且它們一對一地與數據值的數量相匹配。當 JMeter 處理文件的每一行時,它會將適當的數據值分配給與該位置有關聯的變量名稱。清單 5 顯示了樣例 CSV 文件的內容:

清單 5. 樣例 CSV 文件 (customer.csv)

"STR_TESTCASE","STR_CUSTOMERTYPE","STR_CUSTOMERNUMBER","STR_ORGNAME","STR_PHONE",
"STR_ADDRESSLINE1","STR_ADDRESSLINE2","STR_ADDRESSTYPE","STR_CITY","STR_COUNTRY",
"STR_STATE","STR_STATECODE","STR_POSTALCODE","STR_FAMILYNAME","STR_GIVENNAME",
"STR_EMAILADDRESS","STR_NAMEPREFIX","STR_LANGUAGEPREFERENCE","STR_WORKPHONE", 

"Testcase1","DIRECT","1234567890","IBM","999-999-9999","Tech Park One","","MAILING",
"Pune","India","Maharashtra","MH","411006","Gilra","Shalini","shagilra@in.ibm.com","Miss",
"EN_US","999-9999", 

"Testcase2","DIRECT","1234567891","IBM","999-999-9999","Tech Park One","","MAILING",
"Pune","India","Maharashtra","MH","411006","Prakash","Prem","premprakash@in.ibm.com",
"Mr","EN_US","999-9999", 

"Testcase3","DIRECT","1234567892","IBM","999-999-9999","550, Kings Street","","MAILING",
"Littleton","United States","MA","MA","1460-1250","Tuohy","Tom","tuohy@us.ibm.com","Mr",
"EN_US","999-9999",

在 JMeter 處理 清單 5 中的 CSV 文件時,對於第一次迭代,會將 Pune 分配給 STR_CITY 變量,將 India 分配給 STR_COUNTRY 變量,等等。然后,對接下來的兩行/迭代執行同樣的操作,但使用了在那些行上指定的值。當腳本運行的時候,所指定的變量加載並包含它們的值,直到它們被覆蓋或腳本結束。為了避免無意中覆蓋了變量,請小心地命名變量。此外,當您調試 JMeter 腳本時,知道變量的起源在哪里非常重要,因為腳本本身沒有定義該位置。在 CSV 文件中使用一致的變量名稱命名慣例很有幫助。

圖 4 顯示了如何在 CSV Data Set Config 控制面板中指定 CSV 文件:

圖 4. 在 JMeter 中指定和讀取一個 CSV 文件

JMeter CSV Data Set Config 控制面板的屏幕截圖,該面板用於指定和讀取某個 CSV 數據文件

在圖 4 中,Filename 字段被設置為將被讀取的 CSV 文件的相對路徑。“Allow quoted data?” 值被設置為 true,因為 CSV 文件中的數據值用引號括了起來。“Recycle on EOF?” 選項被設置為 false,“Stop thread on EOF?” 選項被設置為 true,這將導致線程在到達文件結束(EOF)時停止。

使用 While Controllers 實現循環

在將測試數據分離成單獨的 CSV Data Set Config 文件后,可以更容易地使用數據集在一組相似但獨立的操作中進行迭代。JMeter 提供了 While Controller 等循環構造函數來幫助實現迭代。通過在循環構造函數中組織測試操作,您可以在一個 JMeter 測試計划中執行所需的全部數據驅動的測試。

這種方法對於雲測試很有用,因為它解決了測試從多個訪問角色或不同數據集(正、負、邊界值,等等)訪問 API 的需求。利用循環,可以將一個 API 測試目標的所有測試排列都放在一個測試計划中,這使得編寫測試用例的速度至少快了 20 倍。

圖 5 顯示了如何使用 While Controller 控制面板來告訴 JMeter 循環遍歷所有 CSV 文件數據:

圖 5. 循環遍歷 CSV 文件中的所有數據

JMeter While Controller 控制面板的屏幕截圖,該面板告訴 JMeter 循環遍歷 CSV 文件中的所有數據

在圖 5 中,Condition(函數或變量)字段被設置為 jexl() 函數。此函數比較了來自 CSV 數據文件的變量與 EOF,當 CSV 文件中沒有其他數據行時,它會告訴 JMeter 退出循環。條件可以是最終計算結果為 false 的任何變量或函數。

使用 BeanShell 編寫腳本

通過使用 BeanShell 腳本語言,您可以在 JMeter 腳本中進行 Java 編程。例如,在腳本必須操縱用 JMeter 的 Regular Expression Extractor 捕獲的變量的情況下,BeanShell 腳本很有用。BeanShell 腳本執行傳遞給它的程序,並在運行時返回結果。

在某些雲應用程序中,使用了從 API 命令返回的響應數據(可能是 JSON 格式的)作為對另一個 API 命令的請求數據,其中進行了一些修改。使用未知的動態數據可能非常棘手和困難,除非您可以在腳本中使用編程。利用 BeanShell 腳本,通過使用 JSONObject 類庫,您可以在運行時操縱 JSON 有效負載或讀取 JSON 有效負載的屬性值。為了在 JMeter 腳本中使用 JSONObject,通過將 JAR 復制到 JMETER_HOME/lib 文件夾,可以在 JMeter 的類路徑中包含 java json.jar。

您可以針對不同目的,通過多種方式定義和使用 BeanShell 腳本。利用 BeanShell PreProcessor 或 PostProcessor,可以在采樣器執行之前或之后應用 JMeter BeanShell Sampler 中的一段代碼。利用 BeanShell Assertion,可以進行條件測試,比如 JMeter 變量是否保存了一個預期值。

定義並使用 BeanShell 腳本的一般步驟是:

  1. 在 JMeter 中,創建一個 BeanShell Listener、一個 BeanShell PreProcessor、一個 BeanShell PostProcessor,或 BeanShell Sampler。
  2. 在 BeanShell 腳本中使用 vars.get("variable") 獲得變量。
  3. 使用 Java 編程語言來處理 BeanShell 腳本。
  4. 在 BeanShell 腳本中,使用 vars.put("variable") 將處理后的變量放回指定的 JMeter 變量(這可以是一個現有變量或一個新變量)。

清單 6 中的樣例 BeanShell 腳本修改了嵌套在 清單 3 中的 JSON 的第三層的 GivenName 和 WorkPhone 值:

清單 6. 使用 BeanShell 腳本修改兩個 JSON 值

custPayload= vars.get("testResp");
org.json.JSONObject custJSON= new org.json.JSONObject(custPayload);

if (custJSON.has("Customer") && custJSON.get("Customer")!= null) {
   org.json.JSONObject contactJSON = custJSON.getJSONObject("Customer").getJSONObject(
   "Organization").getJSONObject("Contact");
   contactJSON.put("GivenName", "Shalini");
   contactJSON.put("MobilePhone", "9923406159");
}
vars.put("updatedCustPayload", custJSON.toString());

現在,請求可以在 API UPDATE 命令中使用 ${updatedCustPayload} 變量。

可以通過其他許多方式使用 BeanShell 腳本來操縱 JMeter 變量或 JSON 數據 — 比如執行算術運算、提取變量的值,或以一個特定變量的值替換另一個變量的值。總體而言,BeanShell 可用於執行 JMeter 不直接支持的任務。

使用 Module Controller 模塊化可重用的片段

一 個復雜的測試計划中包括許多變量和函數,這很常見。通常情況下,這些片段在其他測試計划中也被使用超過一次或兩次。在這種情況下,可以將這些片段拆分為可 以在其他地方重用的若干個子模塊,以便減少維護工作量。然后,如果一個可重用的功能在未來需要進行修改,您只需要在某個地方修改它。

JMeter Module Controller 是一種機制,可以在運行時在目前的測試計划中替換測試計划片段。片段可以位於任何線程組或在 WorkBench 上。Module Controller 使用的任何片段都必須具有惟一的名稱,因為該名稱被用於在重新加載一個測試計划時找到目標控制器。

圖 6 的示例顯示了放置 Module Controller 的位置,以及在腳本中調用的模塊:

圖 6. Module Controller 的放置和它指向的模塊

JMeter 測試計划的屏幕截圖,在該計划中,Module Controller 是在 Customer Service 模塊的 Login 和 Logout 例程之間創建的,並且控制器所指向的 Register Customer 模塊是在 WorkBench 中創建的

在圖 6 所示的測試計划中,Register Customer 被定義為一個單獨的模塊,被放置在 WorkBench 部分中。Module Controller (Module Controller - Register Customer) 被放置在 Login User 例程的后面和 Logout 的前面,指向 Register Customer 模塊。在運行腳本時,在 Module Controller 的所在位置上,Module Controller 替代了測試計划中的 Register Customer 模塊。

圖 7 顯示了如何在腳本中定義一個 Module Controller:

圖 7. Module Controller 指向在 WorkBench 中定義的簡單控制器

指向 WorkBench 中定義的簡單控制器的 JMeter Module Controller 的屏幕截圖

在圖 7 中,從 Module To Run 字段的下拉列表選中 Register Customer 模塊,該列表列出了所有可用模塊。

當可重用的組件在同一個腳本(JMX 文件)中被重用時,可以使用 Module Controller。如果在其他腳本中也將使用可重用的片段,那么可以將片段移到一個單獨的 JMX 文件中,並使用 Include Controller 調用它,在下一節中將會詳細敘述該操作。

使用 Include Controller 包括可重用的 JMeter 文件

JMeter 的 Include Controller 提供了一個占位符,其中一個 JMX 文件(父 腳本)可以調用另一個 JMeter 腳本(子 腳本)。通過將腳本拆分為較小的腳本或模塊/例程,並使用這些子例程構建立一個測試套件,可以在腳本中實現模塊化,以增強可理解性和可重用性。使用 Include Controller 分離可重用的代碼片段或先決條件(如 Login User 和 Register User),幫助更好地管理和維護腳本。

要使用 Include Controller,首先需要創建一個子 JMX 文件,其中包含一個可重用的例程(如 Login Admin User)。圖 8 顯示了一個示例子腳本,通過 Include Controller 可以將它包含在父腳本中:

圖 8. 子 JMX 文件 (LoginUser.jmx)

子腳本 (LoginUser.jmx) 的屏幕截圖

圖 8 中的子腳本定義了一個測試計划,其中包含一個采樣程序和一個 Login User 的 HTTP 請求。在 HTTP 請求中,協議、服務器名稱和其他設置所使用的變量是在父腳本中定義的。

下一步是在父腳本中想要調用子腳本的地方添加一個 Include Controller,並將 Include Controller 指向子 JMX 文件的路徑。圖 9 顯示了一個在父腳本中定義的 Include Controller:

圖 9. 在父 JMX 文件中添加一個 Include Controller

父腳本的 Include Controller 的屏幕截圖

在圖 9 所示的 Include Controller 控制面板中,Filename 字段存儲了子 JMX 文件(在本例中是 Login_User.jmx)的相對路徑。

子 JMX 文件可以訪問在 Include Controller 中可以訪問的父 JMX 文件中定義的任何變量,並且父 JMX 文件可以使用在子 JMX 文件中定義的變量。

使用正則表達式

當 JSON 是 REST 操作的請求負載時,響應要么是 JSON 格式的,要么是字符串表示形式。在完成操作后,必須提取響應字符串、錯誤代碼和錯誤消息字符串,以驗證特性是否如預期般運作。您可以使用 JMeter 的正則表達式特性來提取變量中的響應數據。

圖 10 顯示了如何在 JMeter 的 Regular Expression Extractor 控制面板中創建一個簡單的正則表達式提取器:

圖 10. 簡單的正則表達式提取器

JMeter 中的簡單的正則表達式提取器的屏幕截圖

在圖 10 中,Reference Name (在本例中是 User)存儲使用正則表達式語法提取的值。在 Regular Expression 字段中,您為針對響應運行的正則表達式提供了語法(在 圖 11 中,該語法是 \"LoginName\":\"(.*?)\"),以提取特定數據。JSON 響應數據的常用正則表達式語法示例包括:

  • \s*(.+)\s* 用於提取整個響應字符串
  • \"LoginName\":\"(.*?)\" 用於提取 "LoginName":"abc@testmail.com"
  • \"CustomerId\":(\d+) 用於提取 "CustomerId":2000006

在 圖 10 的 Template 字段中,$1$ 表示參考變量的分組。Default Value 字段用於在正則表達式不匹配的情況下為調試提供默認值。根據實踐,只有在腳本階段添加和測試正則表達式模式的時候才聲明默認值。

擴展功能 JMeter 腳本以執行性能測試

理想情況下,任何應用程序的性能測試都包括兩個場景:用戶數量尖峰和系統負載的增加。如果現有的功能測試場景涵蓋了基本的 REST 函數,那么很容易擴展和更新它,從而測試托管在雲基礎架構上的 REST 服務的性能。您可以修改應該被發送到每個服務器的請求的數量,對應用程序進行加載測試。您可以通過配置使用適當循環迭代的上升期 來控制請求的數量。

例如,假設您有一個測試計划,基於以下算法執行和驗證一組簡單的 REST 原則:

  1. 執行一個 HTTP POST 方法,以創建一個客戶對象。
  2. 執行一個 HTTP GET 方法,以驗證客戶對象的創建。
  3. 執行一個 HTTP PUT 方法,以驗證客戶對象的修改。
  4. 執行一個 HTTP DELETE 方法,以驗證客戶對象已被刪除。

您可以將簡單的功能測試計划(最初為 RESTful API 功能測試場景而設計)調整為一個以雲環境中部署的服務器為目標的性能測試腳本。

  1. 導航到測試計划的 Thread Group 控制面板,如圖 11 所示:

    圖 11. 圖 11. 性能仿真設置示例

    JMeter Thread Group 控制面板的屏幕截圖,顯示了性能仿真設置
  2. 在 Number of Threads (users) 字段中輸入 ${Thread}。Thread 變量的值(將在步驟 5 中配置它)設置了可用線程的數量,以反映有多少虛擬用戶在訪問服務器。
  3. 在 Ramp-Up Period (in seconds) 字段中輸入 ${RampUp}。RampUp 變量的值(將在步驟 5 中配置它)確定了分發請求的速度(這基於在步驟 1 中定義的線程數量)。例如,如果有 10 個線程,加速上升時間為 100 秒,那么每個線程在前一個線程啟動后 10 秒開始,有 100 秒的總時間可以讓測試加快速度。
  4. 在 Loop Count 字段中輸入 ${Loop}。Loop 變量的值(將在步驟 5 中配置它)確定了測試計划執行的次數。
  5. 導航到 User Defined Variables 控制面板,並將 Thread、RampUp 和 Loop 定義為全局變量,如圖 12 所示。為每個要模擬的負載分配適當的變量值。

    圖 12. 性能測試模擬變量

    User Defined Variables 控制面板的屏幕截圖,顯示了樣例性能測試仿真變量

    在圖 12 中,Loop 值被設置為 5,RampUp 值被設置為 50,Loop 值被設置為 2。

圖 13 顯示了基於圖 12 中已配置的變量值,對在雲應用程序中部署的其中一個節點服務器執行 JMeter 的結果:

圖 13. 性能測試結果

屏幕截圖顯示了對已在雲應用程序中部署的某個節點服務器運行 JMeter 測試的結果,基於圖 12 中定義的配置變量

圖 13 顯示了發送到服務器的並發請求的沉重負載,以模擬性能測試條件。

擴展功能 JMeter 腳本,以執行可靠性測試

可靠性測試 是通過在多組特定條件下連續運行一組腳本,確保整體系統穩定性的一種方式。可靠性測試的結果應該與壓力測試、功能測試和網絡特性測試的結果一起查看。

與性能測試一樣,您可以將執行和驗證一組簡單的 REST 原則的測試計划轉換為一組合適的可靠性測試腳本,以確定雲實例上運行的任何產品或特性的穩定性。

可靠性測試的一個重要方面是,確定在連續多日運行一個腳本的過程中是否發生故障。選中 Thread Group 控制面板的 Forever 復選框,如圖 14 所示,讓線程可以一直運行,直到測試失敗或腳本被強行停止:

圖 14. JMeter 腳本的可靠性設置

JMeter Thread Group 控制面板的屏幕截圖,包含已為可靠性測試選中的 Forever 復選框

在配置了可靠性測試設置后,運行測試幾天,通過 JMeter 結果圖或通過 JMeter 提供的推斷選項連續監測結果。

結束語

本文向您介紹了使用 JMeter 來有效地測試基於雲的應用程序的方法。文章並沒有進行詳盡的討論,我們鼓勵您嘗試使用其他技術來改進 JMeter 中的自動化任務實現。JMeter Wiki是繼續您的探索的一個好地方。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM