『動善時』JMeter基礎 — 12、JMeter取樣器詳解:sampler

1、取樣器介紹

取樣器是用來模擬用戶操作的,向服務器發送請求以及接收服務器的響應數據。

取樣器是在線程組內部的元件,也就是說取樣器只能在線程組中添加。

取樣器(Sampler)是性能測試中向服務器發送請求,記錄響應信息,記錄響應時間的最小單元。(取樣器通常要進行這三個工作)

2、JMeter自帶的取樣器

  • HTTP Request:HTTP請求
  • Flow Control Action :測試活動
  • Debug Sampler :Debug取樣器
  • JSR223 Sampler :JSR223取樣器
  • AJP/1.3 Sampler :AJP/1.3取樣器
  • Access Log Sampler:Access Log取樣器
  • Bean Shell Sampler :Bean Shell取樣器
  • FTP Request :FTP請求
  • JDBC Request :JDBC Request
  • JMS Publisher:JMS發佈
  • JMS Point-to-Point :JMS點到點
  • JMS Subscriber :JMS訂閱
  • JUnit Request :JUnit請求
  • Java Request :Java請求
  • LDAP Extended Request :LDAP擴展請求默認值
  • LDAP Request :LDAP請求
  • OS Process Sampler :OS進程取樣器
  • SMTP Sampler :SMTP取樣器
  • TCP Sampler :TCP取樣器
  • Mail Reader Sampler:郵件閱讀者取樣器

說明:

  • 在測試工作中用的最多的可能就是「HTTP請求」。
  • 每一種不同類型的sampler可以根據設置的參數向服務器發出不同類型的請求。
  • 在JMeter的所有Sampler中,Java Request SamplerBean Shell Sampler是兩種特殊的可定製的Sampler。

總結:

  • 取樣器的作用是向服務器發送請求,記錄響應信息,記錄響應時間。
  • 多個取樣器按照它們在樹中出現的順序運行。

3、「HTTP請求」為例介紹一下取樣器

image

根據上圖解釋說明:

(1)HTTP Request:

  • 名稱(Name):取樣器名稱,也就是需要訪問接口的名稱。
    建議寫成請求接口的地址,例如:/login這樣在有多個取樣器的時候,左側列表就可以知道該取樣器是針對哪個接口的。
  • 注釋(Comments):對當前取樣器的解釋說明。

(2)Web服務器:

  • 協議<Protocol(http)>:向目標服務器發送HTTP請求時的協議,可以是http或者是https或者File ,默認值為http協議 (根據需求定)。
  • 服務器名稱或IP(Server Name or IP):HTTP請求發送目標服務器的域名或IP地址,例如www.baidu.com或者127.0.0.1
  • 端口號(Port Number):所訪問服務器中應用所佔的端口,默認80端口。

(3)HTTP請求:

1)方法(Method):

發送HTTP請求的請求方式。(可以根據接口文檔獲得)

請求方式包括:GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。

2)路徑(Path):

目標接口的URL路徑(不包括服務器地址和端口)。

也可以直接寫完整路徑(上面配置的IP+端口就可以省略了) ,不帶參數的api路徑。

3)內容編碼(Content encoding):

請求數據內容的編碼方式,默認值為iso8859編碼,但一般content encoding配置為UTF-8,來防止中文亂碼。

說明一下Content encoding屬性:

Accept-EncodingContent-Encoding是HTTP中用來對採用哪種編碼格式傳輸正文進行協定的一對頭部字段。

工作原理如下:

1、首先瀏覽器(也就是客戶端)發送請求時,通過Accept-Encoding帶上自己支持的內容編碼格式列表。

2、服務端在接收到請求後,從中挑選出一種用來對響應信息進行編碼,並通過Content-Encoding來說明服務端選定的編碼信息。

3、瀏覽器在拿到響應正文後,依據Content-Encoding進行解壓。

4)自動重定向:

如果選中該選項,當發送HTTP請求後得到的響應是302/301時,JMeter會自動重定向到新的頁面,但是JMeter是不記錄重定向的過程內容。只能用於GET和HEAD方法,如果是POST或者PUT請求則取樣器不會發送。

301、302響應碼說明:

官方的比較簡潔的說明:

  • 301 redirect:301 代表永久性轉移(Permanently Moved)
  • 302 redirect: 302 代表暫時性轉移(Temporarily Moved )

詳細來說,

它們的共同點301和302狀態碼都表示重定向,就是說瀏覽器在拿到服務器返回的這個狀態碼後會自動跳轉到一個新的URL地址,這個地址可以從響應的Location首部中獲取(用戶看到的效果就是他輸入的地址A瞬間變成了另一個地址B)

他們的不同在於。301表示舊地址A的資源已經被永久地移除了(這個資源不可訪問了),搜索引擎在抓取新內容的同時也將舊的網址交換為重定向之後的網址;302表示舊地址A的資源還在(仍然可以訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓取新的內容而保存舊的網址。

總結:

http 協議的 301 和 302 狀態碼都代表重定向。瀏覽器請求某url收到這兩個狀態碼時,都會顯示和跳轉到 Response Headers 中的Location。即在瀏覽器地址輸入 url A,卻自動跳轉到url B。

5)跟隨重定向:

Http Request取樣器的默認選項,當響應code是3xx時,自動跳轉到目標地址。與自動重定向不同,JMeter會記錄重定向過程中的所有請求響應,在查看結果樹時可以看到服務器返回的內容,如有多個跳轉則多個請求都會被記錄下來,此為默認選項。
自動重定向和跟隨重定向的區別只在於是否記錄多個跳轉的請求上

在JMeter默認選中跟隨重定向,但跟隨重定向自動重定向只能二選一。

6)使用keep Alive:

當該選項被選中時,JMeter和目標服務器之間使用Keep-Alive方式進行HTTP通信,默認選中。

HTTP請求中Keep-Alive模式說明:

如果一個瀏覽器對某一個域名有多個請求,就會進行頻繁的建立連接和斷開連接。所以HTTP 1.0中出現了Connection: keep-alive屬性,用於建立長連接,即我們所說的Keep-Alive模式。

Keep-Alive模式更加高效,因為避免連接頻繁建立和釋放的開銷。

7)對POST使用multipart/form-data:

使用multipart/from-dataapplication/x-www-form-urlencoded方式發送HTTP POST請求,默認不選中。

說明POST請求表單提交的編碼類型:

multipart/from-dataapplication/x-www-form-urlencoded用來控制請求向服務器發送表單數據之前如何對其進行編碼。

enctype屬性 說明
application/x-www-form-urlencoded 默認編碼方式, key1=value1&key2=value2。
multipart/form-data 普通表單提交,以及表單文件上傳。
text/plain 以純文本形式進行編碼,其中不含任何控件或格式字符,該方式不常用。

8)與瀏覽器兼容的頭(Browser-compatible headers)

當勾選multipart/form-data時,勾選此項會截掉HTTP請求頭中的Content-TypeContent-Transfer-Encoding,而只發送Content-Disposition部分。

(4)同請求一起發送參數:

1)參數(Parameters):

在請求中發送帶參數的URL ,JMeter提供了一個簡單的對參數化的方法。用戶可以將URL中所有參數設置在本表中,表中的每一行是一個參數值對(對應RUL中的 名稱1=值1)。

編碼這個選項最好勾選,因為如果參數值內含有ASCII Control Chars或者Non-ASCII characters或者其他符號的話,如果不勾選會導致發送失敗(亂碼問題),勾選的話會自動將含有的這些特殊符號進行編碼。

image

2)消息體數據(Body Data):

通請求一起發送的數據消息,這裡可以支持多種數據格式 json、xml等。

例如:

參數格式:name=zhangsan&age=15的形式。(參數以純文本形式)

參數格式:json形式。(需要配置http信息頭管理器,添加Context-Type = application/json)

注意:Parameters和Body Data只能選用其中一種方式發送參數。

3)文件上傳(Files Upload):

在請求中發送文件。通常HTTP文件上傳行為可以通過這種方式模擬,參數名稱就是發送文件對應的參數,MINE Type為資源媒體類型。

image

4、高級頁面選項介紹

image

根據上圖解釋說明:

(1)客戶端實現:

  • 實現(Implementation):發送http請求的方式。可選項為Java和HttpClient4,默認為HttpClient4。

    HttpClient4是Java工具包實現的請求方式,是基於.net工具包二次定製,效率高。

    如果是上傳文件的話一定要選擇,否則請求發送成功了,其實文件並未上傳成功。

  • 超時(毫秒)<Timeouts(milliseconds)>:超時設置。

    鏈接(Connect):連接超時時間,單位為毫秒;

    響應(Response):響應等待超時時間,單位為毫秒;

(2)從HTML文件嵌入資源:

  • 從HTML文件獲取所有內含的資源(Retrieve All Embedded Resources)

    當該選項被選中時,JMeter在發出HTTP請求並獲得響應的HTML文件內容後,還對該HTML進行解析,並獲取HTML中包含的所有資源(圖片、flash等),默認不選中。

    如果用戶只希望獲取頁面中的特定資源,可以在後邊的URLs must match文本框中,填入需要下載的特定資源表達式,這樣只有能匹配指定正則表達式的URL指向資源會被下載。

  • 並行下載(Parallel downloads):是否使用自設資源池,勾選後可設置大小。

  • 數量(Number):資源池大小,默認設置為6。

  • 網址必須匹配(URLs must match):URL匹配過濾,填寫此項則只會下載與此內容項匹配的url的資源。

    例如:要獲取//example.com/下的所有資源,使用正則表達式//example.com/.*

(3)源地址:

只用於http協議且Implementation為HttpClient4的情況,此屬性用於啟用IP欺騙,會重寫了這個http請求使用的默認本地IP地址。

用於JMeter主機具有多個IP地址的情況。該值可以是主機名、IP地址或網絡接口設備,如「ey0」或「l0」或「wlan0」

可以設置多個,防止IP地址被服務端拉黑。

  • IP/主機名(IP/Hostname):使用特定的IP地址或(本地)主機名。
  • 設備(Device):選擇該接口的第一個可用地址,該設備可以是IPv4或IPv6。
  • 設備IPV4:選擇名稱設備的IPv4地址。
  • 設備IPV6:選擇名稱設備的IPv6地址。

(4)代理服務器:

不想用本機的地址來發送Http請求,而想使用代理服務器時則填寫。

  • 服務器名稱或IP:代理服務器的名稱或者IP地址。
  • 端口號:該代理的端口號。
  • 用戶名:使用該代理的用戶名。
  • 密碼:用戶密碼。

(5)保存響應為MD5哈希:

選中該項,在執行時僅記錄服務端響應數據的MD5值,而不記錄完整的響應數據。在需要進行數據量非常大的測試時,建議選中該選項,以減少取樣器記錄響應數據的開銷。

到這裡「HTTP請求」這個取樣器介紹完了,每個取樣器的頁面和用法都不用,這裡不能一一進行說明,以後再用到哪種取樣器(Samplers)會單獨講解。

參考: