寫這個東西的初衷是因為,馬上就要壓力測試,想要寫乙個工具並可以根據結果生成圖表,在該專案基礎上可以定製化開發,喜歡或對你有幫助給個start謝謝啦
完整**github位址
用到的技術和依賴包
多執行緒鎖
requests
pyecharts
配置了兩種發起請求方式(這裡如果數量過多還可以再優化多執行緒迴圈)
快速請求,將請求池中的請求全部傳送
慢速請求,在指定的時間內全部傳送完畢
def
fast_run
(begin, end)
: log.logger.warning(
"開始index{} 結束index{}"
.format
(begin, end)
) run_start_time = time.time(
) log.logger.info(
'開始發起快速非同步請求....'
)for request in syncpool[
int(begin)
:int
(end)]:
request.start(
) log.logger.warning(
"請求消耗時間 豪秒"
.format
((time.time(
)- run_start_time)
*1000))
defslow_run
(begin, end, slowtime)
: log.logger.warning(
"開始index{} 結束index{}"
.format
(begin, end)
) run_start_time = time.time(
) log.logger.info(
'開始發起慢速非同步請求....'
)if slowtime ==0:
fast_run(begin, end)
else
: waittime =
round((
(slowtime *
1000)/
len(syncpool))/
1000,3
) log.logger.info(
"延遲時間為{}毫秒"
.format
(waittime *
1000))
for request in syncpool[
int(begin)
:int
(end)]:
request.start(
) time.sleep(waittime)
log.logger.warning(
"請求消耗時間 {} 豪秒"
.format
((time.time(
)- run_start_time)
*1000
))
資料統計
def
out(length)
: log.logger.warning(f"總請求次數 次"
) log.logger.warning(f"成功請求 次"
) log.logger.warning(f"失敗請求 次"
) log.logger.warning(f"限流請求 次"
) log.logger.warning(
"成功率 %"
.format((
len(sync.success)
/int
(length))*
100)
) log.logger.warning(
"失敗率 %"
.format((
len(sync.fail)
/int
(length))*
100)
) log.logger.warning(
"限流百分比 %"
.format
(sync.limit /
int(length)
*100))
log.logger.warning(
"最長請求時間 毫秒"
.format
(max
(sync.response_time)))
log.logger.warning(
"最短請求時間 毫秒"
.format
(min
(sync.response_time)))
log.logger.warning(
"平均請求時間 毫秒"
.format
(sum
(sync.response_time)
/len
(sync.response_time)))
# 列印成功請求的request中資訊
for success in sync.success:
log.logger.debug(success.content)
# 列印失敗請求的request中資訊
for fail in sync.fail:
if fail is
notnone
: log.logger.debug(fail.content)
多執行緒請求物件
class
syncrequesttask
(threading.thread)
:def
__init__
(self, threadid, url, method, params, header, timeout=10)
: threading.thread.__init__(self)
self.setname(f"sync-"
) self.url = url
self.method = method
self.params = params
self.timeout = timeout
self.header = header
# 傳送請求
defrequest
(self)
: req =
none
try:
if self.method ==
'get'
: req = self.doget(
) self.add(req)
else
: req = self.dopost(
) self.add(req)
except exception as e:
print
(e)def
doget
(self)
: starttime = time.time(
) s = sessions.session(
) req = s.get(self.url, headers=self.header, timeout=self.timeout)
data_build(self.getname(
), time.time(
)- starttime)
req.close(
)return req
defdopost
(self)
:# request_body = json.dumps(self.params)
s = sessions.session(
) starttime = time.time(
) req = s.post(self.url, data=self.params, headers=self.header, timeout=self.timeout)
data_build(self.getname(
), time.time(
)- starttime)
req.close(
)return req
@staticmethod
defadd
(request)
:global lock
global limit
lock.acquire(
)if request.status_code ==
200:
elif request.status_code ==
429:
limit +=
1else
: lock.release(
)def
run(self)
:# 開始傳送請求
用Python編寫WEB伺服器壓力測試工具
code by 李嘉 不對因使用 產生任何後果負任何責任 需要測試的 url 列表,每一次的訪問,我們隨機取乙個 urls test?page test2?orderby a page test2?orderby d page max page 10000 server name 192.168.0...
用Python編寫WEB伺服器壓力測試工具
code by 李嘉 不對因使用 產生任何後果負任何責任 需要測試的 url 列表,每一次的訪問,我們隨機取乙個 urls test?page test2?orderby a page test2?orderby d page max page 10000 server name 192.168.0...
Python壓力測試工具 Locust
locust一款開源效能測試工具,易於使用 指令碼化 可擴充套件,對開發者非常友好。特性 pip install locust import json import tornado.web import tornado.ioloop login false 是否登入 deffib n 計算斐波那契數...