不同環境的性能測試計劃
- 2021 年 6 月 20 日
- 筆記
- Jmeter, performance, shell
不同環境下的 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
常規設置
- 右鍵單擊 Test Plan,把滑鼠移至 Add,再移至 Threads(User),點擊 Thread Group,設置合適的 Number of Threads (users) 值
- 右鍵單擊 Test Plan 下新增的 Thread Group,把滑鼠移至 Add,再移至 Config Element,點擊 HTTP Request Default,設置 Server Name or IP 為
${__P(HOST)}
,Port Number 為${__P(PORT)}
- 右鍵單擊 Thread Group,把滑鼠移至 Add,再移至 Sample,點擊 HTTP Request,設置 Name 為 Frontend,Path 為 /
- 右鍵單擊 Thread Group,把滑鼠移至 Add,再移至 Sample,點擊 HTTP Request,設置 Name 為 Backend,Path 為 /api/currentUser
- 右鍵單擊 Thread Group,把滑鼠移至 Add,再移至 Assertion,點擊 Response Assertion,設置 Field to Test 為 Response Code,Patten Matching Rules 為 Equals,點擊下方的 Add,輸入 200
__P
為 JMeter 獲取命令行參數的函數
許可權處理
以上的後端介面是需要先登錄才能有許可權訪問的,許可權認證方式為 cookies 或 Authorization Header 中的 token,所以需要先獲取這個 token, 並在每次訪問時帶上
- 右鍵單擊 Test Plan,把滑鼠移至 Add,再移至 Threads(User),點擊 setUp Thread Group
- 右鍵單擊 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)}
- 右鍵單擊 setUp Thread Group,把滑鼠移至 Add,再移至 Post Processors,點擊 Regular Expression Extractor,設置 Name of created variable 為 token,Regular Expression 為
"token":"(.+?)"
,Template 為$1$
- 右鍵單擊 setUp Thread Group,把滑鼠移至 Add,再移至 Sample,點擊 BeanShellSampler,設置 Name 為 Token,Script 為
${__setProperty(token, ${token})}
- 右鍵單擊 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 腳本簡化命令並進行不同環境的統一處理