「測試」 - 性能測試 & JMeter腳本開發

一、JMeter腳本開發實戰

實例:查詢一個城市的天氣預報

使用抓包工具觀察請求所產生的請求列表,篩選最核心API。

A、獲取城市代碼

http://toy1.weather.com.cn/search?cityname=西安

B、獲取天氣

http://www.weather.com.cn/weather1d/101110101.shtml#search

C、編寫JMeter腳本

1、JMeter參數化,用戶自定義變數,也可以通過csv Data setConfig引入大量數據。

2、添加HTTP請求,獲取城市代碼。

通過${var}方式引用之前定義的變數,設定編碼為UTF-8,否則結果為亂碼。

3、為此次HTTP請求,增加HTTP頭信息、響應斷言、結果樹。

響應斷言:當斷言失敗時,斷言結果會指出失敗原因。

4、通過正則表達式,提取城市編碼。

5、添加HTTP請求,獲取具體城市天氣預報。

二、場景設計

A、運行場景

  • 運行方式:GUI、命令行
  • 運行架構:本地運行、遠程運行

1、GUI運行、本地運行 - 參考上文

2、命令行運行

命令行模式運行JMeter測試腳本能夠大大縮減所需要的系統資源。

1).需要設置PATH環境變數把JMeter軟體目錄囊括進去

JMETER_HOME=D:JavaDEVJavaapache-jmeter-5.1.1
PATH=%JMETER_HOME%BIN

2).命令行執行

jmeter -n -t "D:JavaDEVJavaapache-jmeter-5.1.1indemo天氣預報.jmx"

常用參數:

  • -h,幫助 - 列印幫助信息並退出
  • -n,非GUI模式 - 非GUI模式下運行JMeter
  • -t,測試文件 - 要運行的JMeter測試jmx文件
  • -l,日誌文件 - 記錄結果的文件
  • -r,遠程執行 - 啟動遠程服務
  • -H,代理主機 - 設置JMeter使用的代理主機IP
  • -P,代理埠 - 設置JMeter使用的代理主機的埠號

3).結果查看

JMeter GUI->添加聚合報告->所有數據寫入一個文件,選擇剛生成的log文件就可以對執行結果進行直觀分析了。

3、遠程運行

1).修改設置控制機jmeter.properties文件,假設遠程機的地址為192.168.0.10

# Remote Hosts - comma delimited
remote_hosts=127.0.0.1,192.168.0.10
remote_hosts=localhost:1099,localhost:2010

2).運行遠程機的jmeter-server.bat批處理文件

3).在控制機上運行遠程按鈕

B、性能參數配置

JMeter運行在JVM之上,因此可以根據場景修改JVM配置,具體的JVM參數參考相關總結。

三、JMeter元件庫

元件的運行順序和作用域是JMeter最精髓的所以,也是JMeter優缺點的體現。

A、執行順序

元件執行順序,配置元件config elements->前置處理程序Per-processors->定時器timers->取樣器sampler->後置處理程序post-processors->斷言assertions->監聽器listeners

B、元件作用域

  • 配置元件,影響作用域內所有元件
  • 前置處理程序,作用域內每個取樣器之前執行
  • 定時器,作用域內每個取樣器有效
  • 取樣器,無作用域
  • 後置處理程序,作用域內每個取樣器之後執行
  • 斷言,作用域內

C、線程組

通過「線程組」實現並發,同時去執行相同的一批次任務,每個線程之間都是隔離的,互不影響的。線程的執行過程中,操作的變數,不會影響其他線程的變數值

Delay Thread creation until needed(延遲創建線程直到需要): 默認情況下,測試開始的時候,所有線程就被創建完了。如果勾選了此選項,那麼線程只會在合適的需要用到的時候創建。

Ramp-Up Period:線程啟動時間,多少個線程,多長時間啟動(秒),每個線程執行多少次循環。

取樣器錯誤:當線程執行取樣器失敗的時候,要執行的策略選項

  • 繼續:忽略錯誤,繼續執行
  • Start Next Thread Loop(啟動下一線程循環):忽略錯誤,線程當前循環終止,執行下一個循環
  • 停止線程:當前線程停止執行,不影響其他線程正常執行
  • 停止測試:整個測試將在當前正在執行的線程執行完畢後停止
  • 立即停止測試:整個測試會立即停止執行,當前正在執行的取樣器如果可能會被中斷

調度器

If Loop Count is not 1 or Forever, duration will be min(Durationm, Loop Count * iteration duration).

如果不想立即執行執行,可以通過調度器控制測試執行的開始時間和結束時間。

  • 持續時間(秒):控制測試執行的時間
  • 啟動延遲(秒):控制測試多久後啟動執行

D、匯總報告(summary Report)

  • Label:取樣器名稱
  • Samples:發送的請求總數
  • Average:平均響應時間
  • Min:最小響應時間
  • Max:最大響應時間
  • Std.Dev.:所有請求響應時間的標準差
  • Error%:出錯率(出錯的request數/所有的request數)
  • Throughput:吞吐量,每秒/每分鐘(具體看單位)處理的request數
  • Received KB/sec:每秒從伺服器端接收到的數據量
  • Avg.Bytes:服務端返回給request數據的平均值,可以理解為:服務端返回所有數據/請求數

E、聚合報告(Aggregate Report)

類似匯總報告。

F、HTTP代理伺服器

對於一些HTTPS協議的系統需要在啟動代理後,安裝JMeter/bin下的證書,才能使用代理伺服器,如果手機的錄製,需要設置手機的代理伺服器、埠,並在手機端安裝證書。

  • TYPE,默認為空,可選項HttpClient4、Java、空值
    • Java,使用JDK中的net包模擬瀏覽器
    • HttpClient4,使用Apache HttpClient4模擬瀏覽器
    • 默認為空值,使用jmeter.properties中jmeter.httpsampler的配置
  • Requests Filtering->Content-Type filter
    • Include,Content-Type白名單,表示哪些Content-Type可以通過
    • Exclude,Content-Type黑名單,表示哪些Content-Type被拒絕
  • Prefix,對每個錄製的HTTP請求的前綴命名,默認為空,則錄製的請求會按照數字遞增的方式進行命名
  • 自動重定向,當發送HTTP請求後得到的響應是302/301時,JMeter自動重定向到新的頁面,比如從頁面A重定向到頁面B,只會記錄頁面B的信息,頁面A的信息稱之為過程信息,如果要做關聯就不能搞定了。另外自動重定向只針對GET和HEAD請求,不能使用在PUT和POST上
  • 跟隨重定向,是否啟用跟隨重定向,是指發生重定向時,會生成Sampler請求
  • Use KeepAlive,JMeter和目標伺服器之間使用Keep-Alive方式進行HTTP通信,默認選中,KeepAlive有一個保持時間,可以在不同的web伺服器中設定這個時間
  • 從HTML文件獲取所有內含的資源,當該選項被選中時JMeter在發出HTTP請求並獲得響應的HTML文件內容後,還對該HTML進行Parse並獲取HTML中包含的所有資源(圖片、Flash等)

G、HTTP請求

  • 參數Parameters - 隨著請求一起發送的參數,可以是GET/POST方法
  • 協議 - HTTP、HTTPS、FILE,默認為HTTP
  • 消息體數據Body Data:使用POST時用到
  • 文件上傳File Upload - 當需要文件上傳時用到,MIME類型可以通過網路抓包工具獲取
  • 保存響應為MD5哈希Save response as MD5 hash:選中該項,在執行時僅記錄服務端響應數據的MD5值,而不記錄完整的響應數據;在需要進行數據量非常大的測試時,建議選中該項以減少取樣器記錄響應數據的開銷

H、用戶定義的變數

名稱、描述。

使用變數的方法:${variableName}

I、Http Cookie管理器

  • 每次清除Cookies - 每次線程組啟動時都會清除Cookie
  • Cookie Policy - Cookies策略
    • ignoreCookies - 忽略所有Cookies,用來防止HttpClient接受和發送Cookies

J、Http Header管理器

頭信息管理,User-Agent、Content-Type、Accept、Cookie等頭部信息。

四、其他元件庫

A、定時器

B、邏輯控制器

C、配置元件

D、前置處理器

E、後置處理器

F、斷言

G、監聽器

五、腳本開發

A、BeanShell

1、BeanShell概念

  • BeanShell是一種完全符合Java語法規範的腳本語言,並且又擁有自己的一些語法和方法。
  • BeanShell是一種鬆散類型的腳本語言。
  • BeanShell是用Java寫成的,一個小型的、免費的、可以下載的、嵌入式的Java源代碼解釋器,具有腳本語言特性,非常精簡的解釋器Jar包大小為175k。
  • BeanShell執行標準Java語句和表達式,另外包括一些腳本命令和語法。

2、JMeter中常用的Bean Shell

  • 定時器:BeanShell Timer
  • 前置處理器:BeanShell PreProcessor
  • 採樣器:BeanShell Sampler
  • 後置處理器:BeanShell PostProcessor
  • 斷言:BeanShell斷言
  • 監聽器:BeanShell Listener

3、BeanShell的用法

JMeter的BeanShell中內置了變數,使用者可以使用內置變數與JMeter進行交互。

推薦閱讀:

TAG:軟體測試 | 性能測試 | jmeter |