不同環境的性能測試計劃

不同環境下的 JMeter 性能測試,設置基本一致,只是地址,賬戶等資訊不同,本文利用 Shell 腳本和 JMeter 變數進行統一處理

安裝 JMeter

wget //mirror.cogentco.com/pub/apache//jmeter/binaries/apache-jmeter-5.4.1.tgz
tar -zxvf apache-jmeter-5.4.1.tgz -C /opt

把執行目錄加入 PATH

export PATH="$PATH:/opt/apache-jmeter-5.4.1/bin"
  • 這樣就可以從任何地方執行 jmeter 命令了

設置測試計劃

運行 JMeter GUI

jmeter

常規設置

  1. 右鍵單擊 Test Plan,把滑鼠移至 Add,再移至 Threads(User),點擊 Thread Group,設置合適的 Number of Threads (users) 值
  2. 右鍵單擊 Test Plan 下新增的 Thread Group,把滑鼠移至 Add,再移至 Config Element,點擊 HTTP Request Default,設置 Server Name or IP 為 ${__P(HOST)},Port Number 為 ${__P(PORT)}
  3. 右鍵單擊 Thread Group,把滑鼠移至 Add,再移至 Sample,點擊 HTTP Request,設置 Name 為 Frontend,Path 為 /
  4. 右鍵單擊 Thread Group,把滑鼠移至 Add,再移至 Sample,點擊 HTTP Request,設置 Name 為 Backend,Path 為 /api/currentUser
  5. 右鍵單擊 Thread Group,把滑鼠移至 Add,再移至 Assertion,點擊 Response Assertion,設置 Field to Test 為 Response Code,Patten Matching Rules 為 Equals,點擊下方的 Add,輸入 200
  • __P 為 JMeter 獲取命令行參數的函數

許可權處理

以上的後端介面是需要先登錄才能有許可權訪問的,許可權認證方式為 cookies 或 Authorization Header 中的 token,所以需要先獲取這個 token, 並在每次訪問時帶上

  1. 右鍵單擊 Test Plan,把滑鼠移至 Add,再移至 Threads(User),點擊 setUp Thread Group
  2. 右鍵單擊 Test Plan 下新增的 setUp Thread Group,把滑鼠移至 Add,再移至 Sample,點擊 HTTP Request,設置 Name 為 Login,Server Name or IP 為 ${__P(HOST)},Port Number 為 ${__P(PORT)},HTTP Request 的方法為 POST,Path 為 /api/login/account,點擊 下方的 Add,分別增加 Name 為 username 和 password,Value 為 ${__P(USERNAME)}${__P(PASSWORD)}
  3. 右鍵單擊 setUp Thread Group,把滑鼠移至 Add,再移至 Post Processors,點擊 Regular Expression Extractor,設置 Name of created variable 為 token,Regular Expression 為 "token":"(.+?)",Template 為 $1$
  4. 右鍵單擊 setUp Thread Group,把滑鼠移至 Add,再移至 Sample,點擊 BeanShellSampler,設置 Name 為 Token,Script 為 ${__setProperty(token, ${token})}
  5. 右鍵單擊 Thread Group,把滑鼠移至 Add,再移至 Config Element,點擊 HTTP Cookie Manager,點擊下方的 Add,設置 Name 為 token,Value 為 ${__property(token)},Domain 為 ${__P(HOST)}:${__P(PORT)},Path 為 /
  • "token":"(.+?)" 將返回結果中的 token 的值捕捉為 $1$
  • __setProperty 為 JMeter 設置全局變數的函數
  • __property 為 JMeter 獲取置全局變數的函數

運行測試計劃

直接運行

以上的計劃設置,把地址和賬戶資訊都作為變數,可以在命令行傳遞,形如:

mkdir report
HEAP=”-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m”
jmeter -n -t test.jmx \
-J HOST=127.0.0.1 \
-J PORT=80 \
-J USERNAME=USERNAME \
-J PASSWORD=PASSWORD \
-l log/local-20210620095700.txt \
-e -o report/local-20210620095700

  • report 文件夾必須存在,才能寫入報告目錄,所以首次需用 mkdir 新建
  • 以上命令使用了 jmeter 的命令選項 -n-t-J-l-e-o
  • local-20210620095700 裡面的 html 格式的測試報告,包括表格數據和可視化圖表,如下圖所示

腳本處理

以上命令相對繁瑣,而且不同環境需要重新設置每個參數,所以通過 Shell 腳本簡化

設置變數

export LOCAL_HOST=127.0.0.1
export LOCAL_PORT=80
export LOCAL_USERNAME=USERNAME
export LOCAL_PASSWORD=PASSWORD
export TESTING_HOST=192.168.1.10
export TESTING_PORT=80
export TESTING_USERNAME=USERNAME
export TESTING_PASSWORD=PASSWORD
export PRODUCT_HOST=192.168.1.100
export PRODUCT_PORT=80
export PRODUCT_USERNAME=USERNAME
export PRODUCT_PASSWORD=PASSWORD

調用變數

#!/bin/sh

time=$(date "+%Y%m%d%H%M%S")
server=${1:-"local"}
prefix=$(echo $server | tr 'a-z' 'A-Z')_
HOST=${prefix}HOST
PORT=${prefix}PORT
USERNAME=${prefix}USERNAME
PASSWORD=${prefix}PASSWORD

if ! [ -d "report" ]
then
mkdir report
fi

HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"
jmeter -n -t test.jmx \
  -J HOST=${!HOST} \
  -J PORT=${!PORT} \
  -J USERNAME=${!USERNAME} \
  -J PASSWORD=${!PASSWORD} \
  -l log/$server-$time.txt \
  -e -o report/$server-$time
  • $(echo $VAR | tr 'a-z' 'A-Z') 表示全部大寫,等效於版本 4.0 以上的 Bash 的 ${VAR^^}
  • 如果 report 文件夾存在就不同再重新創建,所以先通過 -d 判斷
  • ${!HOST} 表示 $HOST 的值為另一變數的名稱,最後解析出來的是這另一個變數的值

運行腳本

本地環境

./test.sh

測試環境

./test.sh testing

正式環境

./test.sh product

  • 在不設環境的時候,${1:-"local"} 把默認環境設置為 local

總結

以上計劃和腳本可以在此 GitHub 倉庫 下載,主要實現了:

  • JMeter 通過接收命令行輸入的參數進行動態設置測試計劃
  • 通過啟動執行緒組進行登錄處理,並將 token 設置為全局變數
  • 通過 Shell 腳本簡化命令並進行不同環境的統一處理