python實現接口並發測試腳本


常用的網站性能測試指標有:並發數、響應時間、吞吐量、性能計數器等。

1、並發數

並發數是指系統同時能處理的請求數量,這個也是反應了系統的負載能力。

2、響應時間

響應時間是一個系統最重要的指標之一,它的數值大小直接反應了系統的快慢。響應時間是指執行一個請求從開始到最后收到響應數據所花費的總體時間。

3、吞吐量

吞吐量是指單位時間內系統能處理的請求數量,體現系統處理請求的能力,這是目前最常用的性能測試指標。
QPS(每秒查詢數)、TPS(每秒事務數)是吞吐量的常用量化指標,另外還有HPS(每秒HTTP請求數)。
跟吞吐量有關的幾個重要是:並發數、響應時間。
QPS(TPS),並發數、響應時間它們三者之間的關系是:
QPS(TPS)= 並發數/平均響應時間

4、性能計數器

性能計數器是描述服務器或操作系統性能的一些數據指標,如使用內存數、進程時間,在性能測試中發揮着"監控和分析"的作用,尤其是在分析統統可擴展性、進行新能瓶頸定位時有着非常關鍵的作用。
Linux中可以使用top或者uptime命令看到當前系統的負載及資源利用率情況。
資源利用率:指系統各種資源的使用情況,如cpu占用率為68%,內存占用率為55%,一般使用"資源實際使用/總的資源可用量"形成資源利用率。

壓測腳本(下單的接口):

?
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/env python
#-*- coding:utf-8 -*-
 
import requests,time,json,threading,random
 
class Presstest( object ):
   headers = {
     'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36' ,
     'Content-Type' : 'application/json; charset=UTF-8' ,
   }
   def __init__( self ,login_url,press_url,phone = "1376193000" ,password = "123456" ):
     self .login_url = login_url
     self .press_url = press_url
     self .phone = phone
     self .password = password
     self .session = requests.Session()
     self .session.headers = self .headers
 
   def login( self ):
     '''登陸獲取session'''
     data = data = { 't' : int (time.time() * 1000 ), 'userName' : self .phone, 'passWord' : self .password}
     res = self .session.post( self .login_url,data = json.dumps(data))
     XToken = res.json().get( 'data' ).get( 'companyToken' )
     self .session.headers[ 'X-Token' ] = XToken
 
   def testinterface( self ):
     '''壓測接口'''
     self .session.headers[ 'X-UnionId' ] = 'of6uw1CUVhP533sQok'
     data = { "id" : int (''.join( str (random.choice( range ( 10 ))) for _ in range ( 10 ))),
         "openId" : "oMr0c5LGJjlTc" , "addressId" : 10 , "shipType" : "SELF" , "totalAmount" : 5 ,
         "receivable" : 5 , "carts" : [
         { "amount" : 1 , "barcode" : "1234567890" , "skuId" : 1 , "spec" : "34" , "itemAmount" : 5 , "price" : 0 ,
          "cover" : "xxxx-dd.oss-cn-shanghai.aliyuncs.com/dfc91fd067ac464c096c90af33a196a5.png" ,
          "name" : "沙宣洗發水" , "packingType" : "瓶" , "placeOfOrigin" : "上海" , "productId" : "310153323435134976" ,
          "retailPrice" : 5 , "suitableAge" : "1-100" }], "formId" : "the formId is a mock one" , "comments" : "aa" }
     global ERROR_NUM
     try :
       html = self .session.post( self .press_url, data = json.dumps(data))
       if html.json().get( 'code' ) ! = 0 :
         print (html.json())
         ERROR_NUM + = 1
     except Exception as e:
       print (e)
       ERROR_NUM + = 1
 
   def testonework( self ):
     '''一次並發處理單個任務'''
     i = 0
     while i < ONE_WORKER_NUM:
       i + = 1
       self .work()
     time.sleep(LOOP_SLEEP)
 
   def run( self ):
     '''使用多線程進程並發測試'''
     t1 = time.time()
     Threads = []
 
     for i in range (THREAD_NUM):
       t = threading.Thread(target = self .testonework, name = "T" + str (i))
       t.setDaemon( True )
       Threads.append(t)
 
     for t in Threads:
       t.start()
     for t in Threads:
       t.join()
     t2 = time.time()
 
     print ( "===============壓測結果===================" )
     print ( "URL:" , self .press_url)
     print ( "任務數量:" , THREAD_NUM, "*" , ONE_WORKER_NUM, "=" , THREAD_NUM * ONE_WORKER_NUM)
     print ( "總耗時(秒):" , t2 - t1)
     print ( "每次請求耗時(秒):" , (t2 - t1) / (THREAD_NUM * ONE_WORKER_NUM))
     print ( "每秒承載請求數:" , 1 / ((t2 - t1) / (THREAD_NUM * ONE_WORKER_NUM)))
     print ( "錯誤數量:" , ERROR_NUM)
 
 
if __name__ = = '__main__' :
   phone = "1376193000"
   password = "123456"
   
   THREAD_NUM = 1     # 並發線程總數
   ONE_WORKER_NUM = 5   # 每個線程的循環次數
   LOOP_SLEEP = 0.1    # 每次請求時間間隔(秒)
   ERROR_NUM = 0      # 出錯數
   
   obj = Presstest(login_url = login_url,press_url = press_url,phone = phone,password = password)
   obj.login()
   obj.run()

輸出結果:

?
1
2
3
4
5
6
7
= = = = = = = = = = = = = = = 壓測結果 = = = = = = = = = = = = = = = = = = =
URL: https: / / ds.xxxxx.com / weshop / order / checkout
任務數量: 1 * 5 = 5
總耗時(秒): 1.9810078144073486
每次請求耗時(秒): 0.39620156288146974
每秒承載請求數: 2.5239678327547805
錯誤數量: 0

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM