用python做简单的接口压力测试

最近研究了一下接口的压力测试,主要来说就是连续频繁的对接口的调用,来测试接口的响应速度、返回结果,找到接口的性能瓶颈,最大承受极限等。

做接口压力测试的方法和工具很多,比较常用的工具有postman、jmeter,这两种都是界面形式的操作

当然也可以使用代码来跑~~我怀疑你在装逼,但是没有证据!

那接下来就是如何用python脚本进行接口测试了,这里使用的是python3,相关的下载安装和环境配置这里不做多说,很多文章都有介绍。

首先我们先要了解要用到http.client.HTTPConnection网络请求,可以去这篇文章看具体使用方法

python3 http.client 网络请求方式

然后就是需要到线程的支持,最后是对执行结果的输出分析。

注:下文分段解释,但是执行时请放在一个.py文件下(代码有参考借鉴一些别的文章)

一、引入所需库和设置需要到的参数

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

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"; #主机地址 例如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" #相对地址

TOTAL = 0 #总数

SUCC = 0 #响应成功数

FAIL = 0 #响应失败数

EXCEPT = 0 #响应异常数

MAXTIME=0 #最大响应时间

MINTIME=100 #最小响应时间,初始值为100秒

GT3=0 #统计3秒内响应的

LT3=0 #统计大于3秒响应的

# 并发的线程数

thread_count = 5

这里请根据真实的接口地址进行配置,有需要到token的请自行拿到token值,不需要头部的的可以在下面中写headers = {}

二、创建一个 threading.Thread 的派生类

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

class RequestThread(threading.Thread):

    # 构造函数

    def __init__(self, thread_name):

        threading.Thread.__init__(self)

        self.test_count = 0

        print ("===========task init===========METHOD=",METHOD[3])

    # 线程运行的入口函数

    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)  #若没有PORT请删掉这个参数

                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')这个方法会返回接口响应的所有内容

三、使用派生类方法写执行

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# main 代码开始

print ("===========task start===========")

# 开始的时间

start_time = time.time()

i = 1

while i <= thread_count:

    t = RequestThread("thread" + str(i))

    t.start()

    i = i + 1

t=0

#并发数所有都完成或大于60秒就结束

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))

四、上面就是所有的代码

然后我们打开cmd来运行这个脚本,这里设置thread_count = 1,即执行一次请求

cmd进入到相应的py文件夹下,运行脚本结果如下所示:

F:\pythonTest>python testInterfacePressure.py
===========task start===========
===========task init===========METHOD= OPTIONS
res.status = 200
res.read = {..........,"code":1,"message":"数据读取成功","status":200}

TOTAL =  1
Thread-1:0.149927

0.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

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值