1. 程式人生 > 程式設計 >python 寫一個性能測試工具(一)

python 寫一個性能測試工具(一)

國慶重新學習了一下go的gin高效能測試框架。

用JMeter來測試gin與flask介面的效能,差別很大。

為什麼我自己不嘗試寫一個性能工具,效能工具的核心就是 併發 和 請求。

請求可以選擇Python的requests庫。

併發可以通過python的 程序、執行緒、協程模擬。

這麼一想,也不是很難了,上手擼一個。

依賴庫

requests==2.22.0
gevent==20.9.0
numpy==1.19.2

requests 大家並不陌生,HTTP請求庫。

gevent是python協程庫,通過協程模擬併發更節省資源,在同樣配置下能模擬更多的併發。

numpy 是python的資料計算庫,提供大量組數和矩陣運算,這裡用它求列表的平均值。

實現指令碼

好了,接下來開始上手寫程式碼了。

from __future__ import print_function
import time
import gevent
from gevent import monkey
monkey.patch_all()

import requests
from numpy import mean


users = 10 # 使用者數
numbers = 100 # 請求次數
req_url = "http://127.0.0.1:8080/user/tom" # 請求URL

print("請求URL: {url}".format(url=req_url))

print("使用者數:{},迴圈次數: {}".format(users,numbers))

print("============== Running ===================")

pass_number = 0
fail_number = 0

run_time_list = []

def running(url):
  global fail_number
  global pass_number
  for _ in range(numbers):
    start_time = time.time()
    r = requests.get(url)
    if r.status_code == 200:
      pass_number = pass_number + 1
      print(".",end="")
    else:
      fail_number = fail_number + 1
      print("F",end="")

    end_time = time.time()
    run_time = round(end_time - start_time,4)
    run_time_list.append(run_time)


jobs = [gevent.spawn(running,req_url) for _url in range(users)]
gevent.wait(jobs)

print("\n============== Results ===================")
print("最大:    {} s".format(str(max(run_time_list))))
print("最小:    {} s".format(str(min(run_time_list))))
print("平均:    {} s".format(str(round(mean(run_time_list),4))))
print("請求成功",pass_number)
print("請求失敗",fail_number)
print("============== end ===================")

設計思路

在JMeter中建立執行緒組有兩個引數 執行緒數和 迴圈數,即 使用者數 和請求數,設定多少個使用者,每個使用者使用者跑多少次,使用者數通過協程模擬,每次使用者執行次數通過for迴圈實現。

至於請求就比較簡單了,直接通過requests傳送請求。通過判斷影響的狀態碼是否為200來判斷是否成功,通過分別計算成功和失敗的請求個數。

關於請求時間統計,在每次請求前後獲得當前時間戳,然後計算時間差就是單個介面的呼叫時間。最大,最小,平均通過計算就可輕鬆的得到。

> python3 ab.py

請求URL: http://127.0.0.1:8080/user/tom
使用者數:10,迴圈次數: 100
============== Running ===================
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
.
============== Results ===================
最大:    0.0352 s
最小:    0.0036 s
平均:    0.0204 s
請求成功 1000
請求失敗 0
============== end ===================

後續

把ab.py指令碼做成 ab 命令列工具。

支援更多的請求型別(get/post/put/delete)和引數。

更多統計維度,吞吐量、吞吐率

增加啟動時間,思考時間等

...

以上就是python 寫一個性能測試工具(一)的詳細內容,更多關於python 效能測試工具的資料請關注我們其它相關文章!