要做接口并发性能测试,总得先学会分析吧!

news2024/11/26 21:18:59

引言

这篇是我3月份在公司内部做的技术分享内容,由于我在公司内部分享的内容较多以及一些特殊性,我摘取了接口并发测试从设计思路整理→测试方案设计→设计分析→代码编写这套流程(我不会承认我把40多页PPT的内容都放在这篇博文里)。文末见

不管是在内部技术分享,还是对个人的培训中,都发现:很多人并不清楚接口并发测试的整体流程,或者说,并没有参与过整个流程。

所以,我把这部分内容摘取出来、分享出来,就是为了能让大家在测试开发的道路上越走越远!

接下来,就开始今天的分享,来看看接口并发性能测试是怎样的分析流程。

并发测试定义

目的

是以并发为手段进行接口测试行为,通过测试行为发现接口在并发场景下导致的功能问题。

类型

①点层面上:同一时间做某件事。

例:早上7:30 ,所有的学生都升国旗。

②线层面上:一个时间做不同的事,但同时对服务器产生压力。

例:一个时间点,有的学生跳皮筋、有的玩足球。

敲黑板:并发测试不等同于性能测试,性能测试也只是并发测试的一个小类。

并发测试分类

功能并发测试

解析:要先进行测试单业务功能场景的并发测试,再进行混合业务功能场景的并发测试。

目的:为验证系统功能是否符合需求规格说明书的要求。

性能并发测试

解析:同时满足某些系统性能指标的前提下,让被测对象承担不同的工作量,以评估被测对象的最大处理能力及是否存在缺陷。

目的:为验证系统性能指标是否符合需求规格说明书的要求。

稳定性并发测试

解析:判断测试系统的长期稳定运行的能力。

目的:为验证系统稳定性是否符合需求规格说明书的要求。

异常性并发测试

解析:模拟系统在较差、异常资源配置下运行,以评估被测对象在资源不足的情况下的工作状态。

目的:为验证系统的异常响应机制是否满足需求规格说明书的要求。

设计思路整理

需求分析

①首先找到并发测试对象,了解需求测试的功能有哪些,可以按照业务功能整理,不必深入细节。

②其次描述测试对象的重要性,如要求严格质量的核心功能、高频使用功能、占用系统资源较多的功能等。

③最后进行测试对象拆分,比如购买商品可以拆分成:搜索商品、锁定库存、提交订单、发送支付指令、接受处理支付结果、业务流水、短信及站内信通知、VX推送结果等。

环境需求分析

明确重点测试对象,预先设置基础数据及大量历史数据、模拟真实环境。

性能指标需求分析

分析性能指标是否合理。可以从历史数据的这几个方面考虑:TPS、页面访问量、并发请求数等,从而来判断需求指标是否合理,安排优先级。

测试方案设计

测试策略

并发测试的准备工作:请求顺序、请求之间互相调用关系、数据流向、有没有调用外部系统等后,需要明确重点测试对象,预先设置基础数据及大量历史数据,模拟真实环境等。

测试策略执行,一般涉及以下4个阶段:

①对于功能并发测试:要先进行测试单业务功能场景的并发测试,再进行混合业务功能场景的并发测试;

②对于性能并发测试:同时满足某些系统性能指标的前提下,让被测对象承担不同的工作量,以评估被测对象的最大处理能力及是否存在缺陷;

③对于稳定性并发测试:判断测试系统的长期稳定运行的能力。该策略强度较小,一般趋向于客户现场日常状态下的压力强度;

④对于异常性并发测试:模拟系统在较差、异常资源配置下运行,如人为降低系统工作环境所需要的的资源,网络带宽、系统内存、数据帧等,以评估在资源不足情况下的工作状态。

总结:不同的测试阶段,测试人员关注的测试目的也是不同。所以对测试人员来说,测试思想才是最重要,有了测试思想,才会有好的测试方案。

测试方案

以两轮测试为例:

第一轮测试,以接口文档驱动测试,测试步骤及要点如下:

①编写接口测试代码:核对每个接口传入参数控制:长度限制、格式、必填项限制、正常值范围限制等。同时,确认报错提示信息是否准确、到位;

②异常数据测试:如渠道值设置负数、属性设置不存在、网络断开、数据库锁表等情况,检查数据是否出现异常;

③逐个接口进行并发事务测试:检查账户金额,用户流水、对账流水数据。核对数据的与用例调用结果是否一致;

④复合接口并发测试:将各种充值、交易类型的接口按照一定的顺序进行并发,校验账户收支金额、流水是否与用例调用结果是否一致。

第二轮测试,以业务场景驱动测试,测试步骤及要点如下:

①统一动作并发:相同订单并发支付,并发退款;

②混合交易场景:秒杀抢购,集中退货、到货确认;

③绕过页面操作:通过抓包,抛送异常值进行交易测试。

指标分析

整理并发需求

需求内容:中午和晚上是订餐的高峰期,所以会有很大的并发订单量。为了保证订单成功率、响应速度等因素,我们要对高峰期的订单量进行并发性能测试。

性能指标需求:

① 打开速度<3s,订单提交成功<5s;

②订单成功率达到99.5%以上;

③在100个并发用户的高峰期,订单处理能力至少达到900TPS。

提取性能指标

以100个外卖订单为例,需要提取的并发指标:

①并发订单数

②成功订单数

③成功订单响应时间

④订单成功率

⑤成功订单的总响应时间

⑥成功订单的平均响应时间

⑦Tps

性能指标分析

①并发订单数:即自定义的并发数,把并发100次,设置为10个线程,每个循环10次;

②成功订单数:就是获取响应值为成功的请求,先定义一个success_count ,初始值为0,如果成功的话执行+1;

③订单成功率:成功订单数/总的订单数成功;

④订单总响应时间:每个成功订单的响应时间之和,所以我们定义一个sum_time,初始值为0.00,然后把每次成功的响应时间加起来成功;

⑤订单平均响应时间:成功订单总响应时间/成功订单数;

⑥TPS:成功并发数/成功订单平均响应时间;

⑦订单响应时间:在请求之前,获取一次时间,在断言成功之后,再次获取一次时间,这样二者之差,就是订单的响应时间。

代码实战

咱们还是老规矩,直接上代码,在代码中做分析:

# -*- coding: utf-8 -*-"""@ auth : carl_DJ@ time : 2021-3-6"""
import hashlibimport threadingfrom time import *from datetime import datetime,timedeltaimport requestsimport json

'''初始化全局变量'''
#自定义全局变量需要的线程数,10thread_num = 10#自定义全局变量每个线程需要循环的数量,10one_worker_num = 10#设定最开始的总时间sum_time = 0.00#设定最开始的成功连接数success_count = 0
''' 后台登录常规操作'''
username = 'carldj'password = hashlib.md5(b'123456').hexdigest()  #设置密码,且是md5加密方式url = "http://www.xxx.com/energy/user/login/"form_data = {"username":username,"password":password}login_response = requests.post(url,data=form_data)c = login_response.cookies
 '''订单发送请求'''
def order():    #引用全局变量    global c    global sum_time    global success_count    #获取执行发送订单请求前时间    t1 = time()    #设定url、form_data进行创建订单    url1 = "http://www.xxx.com/energy/create_order/"    from_data1 = {"restaurant_id":1136,                  "menu_item_total":'12.00',                  "menu_item_data": [{'id':2667868,'p':22,'q':3}]                  }    make_responst = requests.post(url1,data=from_data1,cookies = c)    #获取请求结果    res = make_responst.text    #结果转换成字典赋值给变量id    id = json.loads(res)['order_id']    #断言判断是否提交成功    assert  id != " "    su_time =datetime.now()+ timedelta(hours=1)        #设定url、form_data进行生成订单    url2 = "http://www.xxx.com/energy/place_order/"    from_data2 = {"restaurant_id": id,                  "customer_name": 'carl_dj',                  "mobile_number":username,                  "delivery_address":"address message",                  "pay_type":'cash',                  "preorder":su_time                  }    place_responst = requests.post(url2, data=from_data2, cookies=c)    res = place_responst.text    #追加断言,判断结果是否有"success",有的话,说明订餐成功    assert res == " success"    print("订餐成功")    #订单成功后,再次获取一下时间    t2 = time()    #获取订单的响应时间    res_time = t2-t1    #把响应时间写入txt文件    result = open("E:\Private Folder\res.txt","a")  #路径直接写死,也可用os.path 来写路径    result.write("成功订单响应时间:" + str(res_time)+ '\n')    result.close()
    #也可以使用with打开文件,好处是不用关心文件是否关闭    # with open ("E:\Private Folder\res.txt","a") as result1:        # print(result1.read())
    #把每次成功订单数累加到全局变量sum_time中    sum_time  = sum_time + res_time    #把每次获取的成功订单数做累加,添加到全局变量success_count中    success_count = success_count +1
'''嵌套指定循环次数的order()函数'''
def working()    global one_worker_num    for i in range(0,one_worker_num):        order()
 '''自定义main()函数,来执行多线程'''def main():    global thread_num    #自定义一个空的数组,用来存放线程组    threads = []    #设置循环次数    for i in range(thread_num):        #将working()函数存放到线程中        t = threading.Thread(target=working,name="T"+ str(i))        #设定守护线程        t.setDaemon(True)        threads.append(t)    #启动循环执行    for t in threads:        t.start()    ##设置阻塞线程    for t in threads:        t.join()
if __name__ == "__main__":    main()    total_order = thread_num*one_worker_num    avg_time = sum_time/success_count    '''执行完之后,需要把数据写入到txt文件中'''    #订单并发总数    result.write("并发订单数:"+ str(total_order)+ "\n")    #成功并发数    result.write("成功并发数:"+ str(success_count) + "\n")    #订单成功率    result.write("订单成功率:"+ str(success_count/total_order*100)+ "%" + "\n")    #成功订单响应时间    result.write("成功订单总响应时间:"+ str(sum_time)+"\n")    #成功订单平均响应时间    result.write("成功平均响应时间:"+str(sum_time/success_count)+"\n")    #TPS事务数/秒    result.write("TPS:"+str(success_count/avg_time) + "\n")  #tps = 并发成功数/平均响应时间    result.close()

最后: 可以在我的VX公众号:【自动化测试老司机】免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/794061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高压放大器在无线电能传输中的作用和用途

高压放大器是一种电子放大器&#xff0c;主要用于放大输入信号的幅度&#xff0c;通过输出端输出一个较大的电压信号&#xff0c;以达到强化原始信号的功能。在无线电能传输中&#xff0c;高压放大器扮演着非常重要的角色。本文将从无线电能传输的定义、高压放大器的特性以及高…

mysql数据备份与还原进阶操作

创建以下表 创建普通用户backup并给权限 备份数据库school到/backup目录 mysqldump -u backup -p school > /backup/school.sql备份MySQL数据库为带删除表的格式&#xff0c;能够让该备份覆盖已有数据库而不需要手动删除原有数据库 mysqldump -u backup -p --add-drop-d…

mysql mha高可用

目录 1.MHA是什么以及作用 2.工作原理 3.案例 1.MHA是什么以及作用 MHA(Master High Availability) MySQL高可用环境下故障切换和主从复制的软件 MHA 的出现就是解决MySQL单点故障 MySQL故障切换过程中 MHA能做到0-30秒内自动完成故障切换操作 MHA能在故障切换的过程中最大程…

行业追踪,2023-07-26,如果主力不骗人,化工原料和磷化工有第一波机会

自动复盘 2023-07-26 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

1.java入门(基础概念与常识)

文章目录 1.1.java语言有哪些特点&#xff1f;1.2.关于JVM JDK和JRE最详细通俗的解答1.2.1JVM1.2.2 JDK和JRE 1.3. Oracle JDK 和 OpenJDK 的对比1.4. Java 和 C的区别?1.5. import java 和 javax 有什么区别&#xff1f;1.6. 为什么说 Java 语言“编译与解释并存”&#xff1…

Docker仓库

Docker仓库 一、docker Harbor简介 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。Harbor以 Docker 公司开源的 Registry 为基础&#xff0c;提供了图形管理 UI 、基于角色的访问控制(Rol…

Python 基础(十八):异常处理

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 一、异常是什么&#xff1f;二、异常处理的基本语法三、捕获特定的异常类型四、finall…

P3183 [HAOI2016] 食物链

题目描述 如图所示为某生态系统的食物网示意图&#xff0c;据图回答第 1 小题 现在给你 n 个物种和 m 条能量流动关系&#xff0c;求其中的食物链条数。物种的名称为从 1 到 n 编号 M 条能量流动关系形如 1,2,3​,…,am−1​,bm−1​,am​,bm​。其中 ai​ 和 bi​ 表示能量从物…

《零基础入门学习Python》第067讲:GUI的终极选择:Tkinter4

今天我们来学习 Entry 组件&#xff0c;也就是我们平时所说的 输入框。 输入框是跟程序打交道的途径&#xff0c;比如 程序要求你输入 账号 和 密码。那么它就要提供两个输入框&#xff0c;并且接收密码的输入框还会用 星号 * 将实际的内容给隐藏起来。 我们学了还几个 tkint…

uniapp 微信小程序 navigationBarBackgroundColor 标题栏颜色渐变

大体思路&#xff1a; 第一步&#xff1a;“navigationStyle”:“custom” 第二步&#xff1a; template内 重点&#xff1a;给view添加ref“top” 第三步&#xff1a;添加渐变色样式 1、pages.json {"path" : "pages/user/user","style" : …

FAQ文档的重点注意事项!别踩坑了

在很多优秀的大企业中&#xff0c;FAQ文档是企业运营管理中不可或缺的重要部分。但是也仅限大企业&#xff0c;很多企业目前还是没有这个意识的。一方面原因是因为缺乏这个客户服务的意识&#xff0c;另一方面也和技术水平不足有关。但是其实现在有不少的第三方搭建平台可以帮助…

L---泰拉瑞亚---2023河南萌新联赛第(三)场:郑州大学

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 示例1 输入 1 10 3 5 输出 3 说明 只有一把回旋镖&#xff0c;你可以先打两次伤害为3的&#xff0c;再打一次倾尽全力的&#xff0c;造成的伤害为5。总伤害为33511&#xff0c;即可获得胜…

【Java中间件】RocketMQ

RocketMQ 一、MQ概述 Message Queue&#xff0c;是一种提供消息队列服务的中间件。提供了消息生产、存储、消费全过程API的软件系统。 MQ的作用 限流削峰&#xff1a;当用户发送超量请求时&#xff0c;将请求暂存&#xff0c;以便后期慢慢处理。如果不使用MQ暂存直接请求到…

抖音小店开通指南:轻松打造个人电商王国

抖音小店是抖音推出的一个电商平台&#xff0c;为用户提供了开店、上传商品、管理店铺等功能&#xff0c;让用户可以在抖音上直接进行购物。下面不若与众就来谈谈抖音小店的开通的几个步骤&#xff1a; 1. 注册抖音账号&#xff1a;首先&#xff0c;你需要在抖音上注册一个账号…

什么是Koala?

Koala 介绍 koala 是一个前端预处理器语言图形编译工具&#xff0c;支持 Less、Sass、Compass、CoffeeScript&#xff0c;帮助 web 开发者更高效地使用它们进行开发。跨平台运行&#xff0c;完美兼容 windows、linux、mac。 关键特性 多语言支持 支持 Less、Sass、CoffeeSc…

使用PHP实现登录注册功能的完整指南

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。多年电商行业从业经验&#xff0c;对系统架构&#xff0c;数据分析处理等大规模应用场景有丰富经验。 &#x1f3c6;本文已收录于PHP专栏&#xff1a;PHP…

无涯教程-jQuery - trigger( event, data )方法函数

trigger(event&#xff0c;[data])方法在每个匹配的元素上触发一个事件。 触发事件不仅限于基于浏览器的事件&#xff0c;还可以触发向bind注册的自定义事件。 trigger( event, [data] ) - 语法 selector.trigger( event, [data] ) 这是此方法使用的所有参数的描述- event…

【技术干货】工业级BLE5.2蓝牙模块SKB378 使用教程,AT指令集

SKB378是一个高度集成的蓝牙5.2模组&#xff0c;可用来在2.4GHz ISM频段内做高速率、短距离无线通信。工业级标准&#xff0c;支持主从模式(1主对8从)&#xff0c;支持串口透传&#xff0c;AT指令控制&#xff0c;且支持AoA蓝牙高精度室内定位&#xff0c;模组内部集成32位ARM …

存储过程——存储函数

1.存储函数 存储函数的弊端&#xff0c;必须要有返回值&#xff0c;能使用存储函数的地方也能使用存储过程。 案例需求 create function fun1(n int) returns int deterministic begindeclare total int default 0;while n>0 doset total : total _n;set n : n - 1;end …

activemq消息中间件

ActiveMQ消息中间件详解 下载地址&#xff1a;https://activemq.apache.org/activemq-5015009-release 1、MQ的产品种类 1.1、消息中间件的特性/共同特性/共同维度 Kafka&#xff08;大数据专用、由java/scala编写&#xff09; API发送和接收MQ的高可用性MQ的集群和容错配置…