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

 更新时间:2023年09月05日 14:07:23   作者:星旅zl  
这篇文章主要介绍了如何用python做简单的接口压力测试问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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

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

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

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

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

python3 http.client 网络请求方式

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

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

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

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 的派生类

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

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

# 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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • tensorflow学习教程之文本分类详析

    tensorflow学习教程之文本分类详析

    初学tensorflow,借鉴了很多别人的经验,参考博客对评论分类(感谢博主的一系列好文),本人也尝试着实现了对文本数据的分类,下面这篇文章主要给大家介绍了关于tensorflow学习教程之文本分类的相关资料,需要的朋友可以参考下
    2018-08-08
  • Python技能树共建之python urllib 模块

    Python技能树共建之python urllib 模块

    这篇文章介绍了Python技能树共建之python urllib 模块,urllib模块是 Python 标准库,更多相关介绍需要的小伙伴可以参考下面文章的详细内容
    2022-05-05
  • 基于Python实现一个高效本地文件智能搜索工具

    基于Python实现一个高效本地文件智能搜索工具

    在日常工作中,我们经常需要在本地磁盘中搜索特定文件,本文将基于Python开发一款轻量高效的文件智能搜索工具,文中的示例代码讲解详细,需要的可以了解下
    2025-12-12
  • 关于Python3爬虫利器Appium的安装步骤

    关于Python3爬虫利器Appium的安装步骤

    在本篇文章里小编给大家整理的是一篇关于Python3爬虫利器Appium的安装步骤,需要的朋友们可以跟着参考下。
    2020-07-07
  • Python实现开根号的五种方式

    Python实现开根号的五种方式

    在日常数据处理、数学计算甚至算法题中,开根号是一个高频操作,但你知道吗?Python中实现开根号的方式远不止一种!本文总结了5种常用方法,感兴趣的小伙伴跟着小编一起来看看吧
    2025-08-08
  • python import logging日志(日志封装)详解

    python import logging日志(日志封装)详解

    文章介绍了如何使用Python的logging模块创建和配置日志类,包括初始化logger对象、设置日志级别和格式、自动分割日志文件等,还展示了如何在多个文件中使用日志功能,并通过配置文件进行日志配置
    2026-01-01
  • 基于PyQt5实现一个串口接数据波形显示工具

    基于PyQt5实现一个串口接数据波形显示工具

    这篇文章主要为大家详细介绍了如何利用PyQt5实现一个串口接数据波形显示工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-01-01
  • matplotlib绘制多子图共享鼠标光标的方法示例

    matplotlib绘制多子图共享鼠标光标的方法示例

    这篇文章主要介绍了matplotlib绘制多子图共享鼠标光标的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • python科学计算之scipy——optimize用法

    python科学计算之scipy——optimize用法

    今天小编就为大家分享一篇python科学计算之scipy——optimize用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 详解如何使用Python网络爬虫获取招聘信息

    详解如何使用Python网络爬虫获取招聘信息

    在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息。可是招聘信息有一些是错综复杂的。本文将为大家介绍用Python爬虫获取招聘信息的方法,需要的可以参考一下
    2022-03-03

最新评论