如何用python做簡(jiǎn)單的接口壓力測(cè)試
最近研究了一下接口的壓力測(cè)試,主要來(lái)說(shuō)就是連續(xù)頻繁的對(duì)接口的調(diào)用,來(lái)測(cè)試接口的響應(yīng)速度、返回結(jié)果,找到接口的性能瓶頸,最大承受極限等。
做接口壓力測(cè)試的方法和工具很多,比較常用的工具有postman、jmeter,這兩種都是界面形式的操作
當(dāng)然也可以使用代碼來(lái)跑~~我懷疑你在裝逼,但是沒(méi)有證據(jù)!
那接下來(lái)就是如何用python腳本進(jìn)行接口測(cè)試了,這里使用的是python3,相關(guān)的下載安裝和環(huán)境配置這里不做多說(shuō),很多文章都有介紹。
首先我們先要了解要用到http.client.HTTPConnection網(wǎng)絡(luò)請(qǐng)求,可以去這篇文章看具體使用方法
python3 http.client 網(wǎng)絡(luò)請(qǐng)求方式
然后就是需要到線程的支持,最后是對(duì)執(zhí)行結(jié)果的輸出分析。
注:下文分段解釋?zhuān)菆?zhí)行時(shí)請(qǐng)放在一個(gè).py文件下(代碼有參考借鑒一些別的文章)
一、引入所需庫(kù)和設(shè)置需要到的參數(shù)
import threading import time import http.client import urllib import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning pararms = urllib.parse.urlencode({'token':'xxx'}) rqheaders={ #'DeviceToken':'xxxxxxxxx','OSVersion':'1.0.3','AppVersion':'14', 'Accept':'application/json, text/plain, */*', 'Accept-Encoding':'gzip, deflate, br', 'Accept-Language':'zh-CN,zh;q=0.9', 'Host':'deve.xxx.com', 'Origin':'https://www.xxx.com', 'Referer':'https://www.xxx.com/xxx_test/', 'token':'xxx', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'} HOST1 = "www.baidu.com"; #主機(jī)地址 例如192.168.1.101 nanning.anjuke.com, HOST_L = "deve.xxx.com" HOST_IP = "xxx.xx.xxx.xx" #ip地址 PORT = 9999 #端口 METHOD = {1:"GET",2:"POST",3:"OPTIONS"} URI = "/api/web/XXX" #相對(duì)地址 TOTAL = 0 #總數(shù) SUCC = 0 #響應(yīng)成功數(shù) FAIL = 0 #響應(yīng)失敗數(shù) EXCEPT = 0 #響應(yīng)異常數(shù) MAXTIME=0 #最大響應(yīng)時(shí)間 MINTIME=100 #最小響應(yīng)時(shí)間,初始值為100秒 GT3=0 #統(tǒng)計(jì)3秒內(nèi)響應(yīng)的 LT3=0 #統(tǒng)計(jì)大于3秒響應(yīng)的 # 并發(fā)的線程數(shù) thread_count = 5
這里請(qǐng)根據(jù)真實(shí)的接口地址進(jìn)行配置,有需要到token的請(qǐng)自行拿到token值,不需要頭部的的可以在下面中寫(xiě)headers = {}
二、創(chuàng)建一個(gè) threading.Thread 的派生類(lèi)
class RequestThread(threading.Thread): # 構(gòu)造函數(shù) def __init__(self, thread_name): threading.Thread.__init__(self) self.test_count = 0 print ("===========task init===========METHOD=",METHOD[3]) # 線程運(yùn)行的入口函數(shù) def run(self): self.test_performace() def test_performace(self): global TOTAL global SUCC global FAIL global EXCEPT global GT3 global LT3 try: st = time.time() conn = http.client.HTTPConnection(HOST1,PORT) #若沒(méi)有PORT請(qǐng)刪掉這個(gè)參數(shù) req = conn.request(METHOD[1], URI, body = {}, headers = rqheaders) # or POST headers=rqheaders res = conn.getresponse() #print ('msg:', res.msg) #print ('headers:', res.getheaders()) print("res.status =",res.status) print('res.read =',res.read().decode('utf-8')) start_time if res.status == 200: TOTAL = TOTAL+1 SUCC = SUCC+1 print("TOTAL = ",TOTAL) else: TOTAL = TOTAL+1 FAIL = FAIL+1 print("TOTAL = ",TOTAL) time_span = time.time()-st print ("%s:%f\n"%(self.name,time_span)) self.maxtime(time_span) self.mintime(time_span) if time_span>3: GT3 = GT3+1 else: LT3 = LT3+1 except Exception as e: print("e =",e) TOTAL = TOTAL+1 EXCEPT = EXCEPT+1 conn.close() def maxtime(self,ts): global MAXTIME print(ts) if ts>MAXTIME: MAXTIME=ts def mintime(self,ts): global MINTIME if ts<MINTIME: MINTIME=ts
res.read().decode('utf-8')這個(gè)方法會(huì)返回接口響應(yīng)的所有內(nèi)容
三、使用派生類(lèi)方法寫(xiě)執(zhí)行
# main 代碼開(kāi)始 print ("===========task start===========") # 開(kāi)始的時(shí)間 start_time = time.time() i = 1 while i <= thread_count: t = RequestThread("thread" + str(i)) t.start() i = i + 1 t=0 #并發(fā)數(shù)所有都完成或大于60秒就結(jié)束 while TOTAL<thread_count|t>60: print ("total:%d,succ:%d,fail:%d,except:%d\n"%(TOTAL,SUCC,FAIL,EXCEPT)) print (HOST,URI) t = t+1 time.sleep(2) time.sleep(2) print ("===========task end===========") print ("total:%d,succ:%d,fail:%d,except:%d"%(TOTAL,SUCC,FAIL,EXCEPT)) print ("response maxtime:",MAXTIME) print ("response mintime:",MINTIME) print ("great than 3 seconds:%d,percent:%0.2f"%(GT3,float(GT3)/TOTAL)) print ("less than 3 seconds:%d,percent:%0.2f"%(LT3,float(LT3)/TOTAL))
四、上面就是所有的代碼
然后我們打開(kāi)cmd來(lái)運(yùn)行這個(gè)腳本,這里設(shè)置thread_count = 1,即執(zhí)行一次請(qǐng)求
cmd進(jìn)入到相應(yīng)的py文件夾下,運(yùn)行腳本結(jié)果如下所示:
F:\pythonTest>python testInterfacePressure.py
===========task start===========
===========task init===========METHOD= OPTIONS
res.status = 200
res.read = {..........,"code":1,"message":"數(shù)據(jù)讀取成功","status":200}TOTAL = 1
Thread-1:0.1499270.14992666244506836
===========task end===========
total:1,succ:1,fail:0,except:0
response maxtime: 0.14992666244506836
response mintime: 0.14992666244506836
great than 3 seconds:0,percent:0.00
less than 3 seconds:1,percent:1.00
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python常見(jiàn)錯(cuò)誤類(lèi)型及解決方法
如果說(shuō)寫(xiě)代碼最害怕什么,那無(wú)疑是Bug。而對(duì)于新手來(lái)說(shuō),剛剛接觸編程,在享受寫(xiě)代碼的成就感時(shí),往往也會(huì)被各式各樣的Bug弄得暈頭轉(zhuǎn)向。Python常見(jiàn)錯(cuò)誤類(lèi)型及解決方法,拯救你的代碼!消滅Bug的過(guò)程就是技能經(jīng)驗(yàn)的累積過(guò)程。2023-06-06Python自動(dòng)化測(cè)試pytest中fixtureAPI簡(jiǎn)單說(shuō)明
這篇文章主要為大家介紹了Python自動(dòng)化測(cè)試pytest中fixtureAPI的簡(jiǎn)單說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10簡(jiǎn)單介紹Python的Django框架加載模版的方式
這篇文章主要介紹了Python的Django框架加載模版的方式,包括一些對(duì)加載順序的介紹,需要的朋友可以參考下2015-07-07python實(shí)現(xiàn)簡(jiǎn)單的學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單的學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Python數(shù)學(xué)建模StatsModels統(tǒng)計(jì)回歸模型數(shù)據(jù)的準(zhǔn)備
這篇文章主要介紹了Python數(shù)學(xué)建模StatsModels統(tǒng)計(jì)回歸模型數(shù)據(jù)的準(zhǔn)備學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10python跳過(guò)第一行快速讀取文件內(nèi)容的實(shí)例
今天小編就為大家分享一篇python跳過(guò)第一行快速讀取文件內(nèi)容的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Pytorch運(yùn)行過(guò)程中解決出現(xiàn)內(nèi)存不足的問(wèn)題
內(nèi)存不足是很多人感到頭疼的問(wèn)題,本文主要介紹了Pytorch運(yùn)行過(guò)程中解決出現(xiàn)內(nèi)存不足的問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02