1. 程式人生 > 其它 >不同環境的效能測試計劃

不同環境的效能測試計劃

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

安裝 JMeter

wget https://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 指令碼簡化命令並進行不同環境的統一處理