前言
同事有個需求,一個獲取人員信息的接口,請求頭裏面需要有一個sign
參數,這個參數是幾個實時獲取的參數最後進行Hmachash256加密之後生成的,具體示例:
獲取用戶接口:
1 |
GET http://192.168.0.1/api/user?userName=20190101&tenant=testtenant |
請求頭:
key | value |
---|---|
Authorization | Bearer ${token} |
content-type | application/json |
tenant | testtenant |
timestamp | 當前時間戳 |
randoms | 隨機數 |
sign | 簽名 |
其中籤名生成規則如下:tenanttesttenantuserName20190101tenanttesttenanttimestamp當前時間戳randoms隨機數
這一長串再使用指定密碼,進行HmacSHA256加密,生成的密文即爲sign
jmeter方案
因爲後期接口要進行性能測試,所以還是選了jmeter進行性能測試,按照接口描述的先排序再加密,在jmeter中,首先想到的就是通過beanshell
外部實現,然後生成對應jar包,在jmeter中引用,然後就有個問題,我java太菜了。。。沒辦法,折騰python。
jmeter中使用python腳本
在jmeter中使用python腳本,搜了下,找到三種方式:
1. 使用Jython包(地址失效,以下是下載的文件)
下載地址
下載Download Jython 2.7.0 - Standalone Jar
包,放到jmeter/lib/目錄下,重啓jmeter,就能在sampler
中找到JSR223 Sampler
,裏面就有python,但是,是python2.7,所以,對我沒啥用
2. jmeter-functions-execute-python-script-1.0.jar,網上有個這個包,可以從函數助手那邊進去執行python腳本,試了下失敗了,就不介紹了,有興趣可以百度下咋弄
3. OS Process Sampler,使用這個組件可以執行腳本,後面着重介紹這個,使用了下,很強的組件,理論上,只要你腳本能力強,可以獲得各種想要的(終於看到擺脫java的希望了。。)
OS Process Sampler
這個組件可以用來啓動一個可執行程序,由於是通過命令行方式啓動,所以我們可以用任何語言編寫一個測試用的可執行程序(比如Linux的sh腳本)。在該可執行程序中調用我們的接口,並把返回的原始數據輸出而交由JMeter做後續解析判斷。
位置:/sampler/OS Process Sampler
這個組件有幾欄:
1 2 3 4 |
command: 可執行文件(windows系統建議放.bat腳本或exe文件,linux系統放shell;幹過windows下放了shell直接報非可執行文件。。) working directory:工作目錄,默認是jmeterbin 目錄,可指定 command parameters:參數,如果腳本需要傳參,可在這邊傳 |
既然這個組件可以執行bat文件,那我們在bat文件裏面再調python文件不就實現了嘛~
加密實現
前面說了,思路就是使用OS Process Sampler
來調用.bat
文件,然後在.bat
文件中再調python文件,實現加密,腳本如下:
jmeter
OS Process Sampler中:
1 2 3 4 |
command: oss.bat路徑 working directory:默認 command parameters:secret,userName,tenant(三個傳參,方便參數化) |
同時,在OS Process Sampler
後追加三個正則表達式提取器,分別獲取時間戳,隨機數,簽名
正則表達式提取器:
1 2 3 4 |
引用名稱:sign 正則表達式:sign:(.+?)<> 模板:$1$ 匹配數字: 1 |
時間戳和隨機數相同方式獲取
oss.bat
oss.bat:
1 2 3 4 5 6 |
@echo off set secret = %1 set userName = %2 set tenant = %3 python E:py_workspacehashtestJmeterSSTest.py %* |
Windows批處理文件,首先獲取傳進去的三個參數,再將這三個參數作爲入參傳給python腳本
JmeterSSTest.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#!/usr/bin/env python3 # -*-coding: utf-8 -*- """ @author: kyle @time: 2019/4/23 12:44 """ import hashlib import hmac import time import random import sys # 定義傳參,按順序,secret,userName,tenant secret = sys.argv[1] userName = sys.argv[2] tenant = sys.argv[3] # 獲取當前時間戳 timestamp = int(time.time()) # 獲取隨機數 randoms = random.randint(0, 999999999) # 獲取sign strsign = str(u'tenant' + str(tenant) + u'userName' + str(userName) + u'tenant' + str(tenant) + u'timestamp' + str(timestamp) + u'randoms' + str(randoms)) # hmacsha256加密 intsign = hmac.new(bytes(str(secret), encoding='utf-8'), bytes(str(strsign), encoding='utf-8'), digestmod=hashlib.sha256).digest() # 二進制轉義 sign = intsign.hex() print(u'timestamp' + ':' + str(timestamp) + '<>') print(u'randoms' + ':' + str(randoms) + '<>') print(u'sign' + ':' + str(sign) + '<>') |
腳本就不解釋了,不難
完整jmeter結構
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-- 獲取token接口(簡單控制器) -- http信息頭管理器 -- http請求 -- 響應斷言 --查看結果樹 -- JSON Extractor -- 加密sign -- OS Process Sampler -- 正則提取 timestamp -- 正則提取 randoms -- 正則提取 sign -- 獲取用戶接口 -- http信息頭管理器 -- http請求 -- 查看結果樹 -- 響應斷言 |