天天看點

python locust post 參數拼接md5_Locust性能測試--接口加密參數關聯

前言登陸接口:

headers:時間戳--timestamp實時擷取,clientId--android/ios/web/微信小程式固定值,sign--privatekey加密後得到

查詢報告接口:

headers:時間戳--timestamp實時擷取,clientId--android/ios/web/微信小程式固定值,sign--privatekey加密後得到,token--登入傳回的參數

思路1、解決sign加密問題:_dispose_params()、_rsa()

2、隻登陸一次,拿到token後,後續查報告接口都使用同一個token(短期内不會失效,開發設定的5天):

on_start(),登陸一次之後,更新token

3、登入、查報告接口共用一個相同的headers

示例代碼

import time

import rsa

import base64

from locust import HttpLocust, TaskSet, task

# 将參數按照規則排序

def _dispose_params(dict, timestamp=None):

if not timestamp:

timestamp = int(time.time() * 1000)

string = 'timestamp={}'.format(timestamp)

if not dict:

return string

sorted_list = sorted(dict.items(), key=lambda item: item[0], reverse=False)

l = []

for i in sorted_list:

if i[1] or i[1] == 0:

l.append(i)

if not l:

return string

sorted_str = [str(x[0]) + "=" + str(x[1]) for x in l]

string = string + "&" + '&'.join(sorted_str)

return string

# 使用rsa非對稱進行簽名

def _rsa(message, privite_key):

privkey = rsa.PrivateKey.load_pkcs1(privite_key)

crypto_text = rsa.sign(message.encode(), privkey, 'MD5')

crypto_text = base64.b64encode(crypto_text)

return crypto_text

#獲得請求頭

privite_key = """-----BEGIN RSA PRIVATE KEY-----

****************************************************************

sLT2lYIsUTilR9JbRWw8omywe1pAH1e7yAsFM18jCHVWTIjBQTjnXcRb5EVBAkEA

nYuunvInJB95yTFCCY/ZmZUEU+bm1IFafH7PEZXVVgpgtztz4xEqlkStJBQXs8M7

BNG2kUAPfqKko2zzMTOxOQJBAN8tCqM0ezh1ahRI21RHgg3QdgSrlaQsDXtk4AWC

CBM8ep9GRp1vzT6EyMPSNyeySXSb7LQa0Pl3dpSNRter3Fs=

-----END RSA PRIVATE KEY-----

"""

timestamp = str(int(time.time() * 1000))

message = _dispose_params({}, timestamp)

sign = _rsa(message, privite_key)

headers = {"clientId": "8b4701753a65837e3c48d3af9b3a91bc",

"timestamp": timestamp,

"sign": sign}

print("請求頭是:", headers)

class testReport(TaskSet):

# 登入

def doLogin(self):

login_url = "/api/v1/login"

login_data = [{"account": "***", "client": "android", "credential": "e10adc3949ba59abbe56e057f20f883e","identityType": "passwd", "isFirstPart": "1"}]

response = self.client.post(login_url, json=login_data[0], headers=headers, verify=False).json()

#print("登入後未更新的請求頭是:", headers)

print("LOGIN RESULT:", response)

return response

# on_start() 在測試前的初始化,先登入且隻登陸一次

def on_start(self):

print("--------------性能測試來咯!--------------")

response = self.doLogin()

token = response["respData"]

headers["token"] = token

#print("登入後更新的請求頭是:", headers)

# 查詢報告清單

@task

def test_get_report_list(self):

report_url = "/api/v1/report/info"

report_data = None

print("執行查詢報告的請求頭是:",headers)

response = self.client.get(report_url, headers=headers, data=report_data, verify=False).json()

print('查詢結果 :', response)

#locust類中的子類HttpLocust類中封裝好了http方法,繼承HttpLocust可以直接使用http相關方法

class WebSite(HttpLocust):

task_set = testReport

host = "https://xxx.xxx.in"

min_wait = 1000

max_wait = 3000

執行性能測試

Hatching and swarming 1 clients at the rate 1 clients/s...

登入隻執行了一次

python locust post 參數拼接md5_Locust性能測試--接口加密參數關聯

總結

1、HttpLocust類從繼承 Locust的類,并把它添加一個用戶端屬性,它是的一個執行個體 HttpSession,可用于使HTTP請求。

2、http協定是無狀态的,是以登入請求和登入後的請求它是獨立的,但是登入後的請求需要依賴先登入拿到cookies,才能保持登入狀态,python接口自動化裡面可以用session來解決:s = requests.session()

HttpLocust類從繼承 Locust的類,并把它添加一個用戶端屬性,它是的一個執行個體 HttpSession,可用于使HTTP請求,這就相當于它自動使用了session機制,類似于client = requests.session()

是以後面的請求,直接拿client.get()、client.post()請求就可以了