热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

接口并发性能测试开发之:从测试方案设计、测试策略、指标分析到代码编写,这一篇全搞定。

并发接口性能设计思路与代码编写1.引言2.并发测试定义3.并发测试分类4.设计思路整理5.测试方案设计6.指标分析7.代码实战8.总结1.引言这篇是我3月份在公司内部做的技术分享


并发接口性能设计思路与代码编写

  • 1. 引言
  • 2. 并发测试定义
  • 3. 并发测试分类
  • 4. 设计思路整理
  • 5. 测试方案设计
  • 6. 指标分析
  • 7. 代码实战
  • 8. 总结


1. 引言

这篇是我3月份在公司内部做的技术分享内容,
由于我在公司内部分享的内容较多,以及一些特殊性,
我摘取了接口并发测试从设计思路整理→测试方案设计→设计分析→代码编写这套流程。


我不会承认我把40多页PPT的内容都放在这篇博文里


因为我不管是在内部技术分享,还是对个人的培训中,都发现:很多人并不清楚接口并发测试的整体流程,或者说,并没有参与过整个流程。
所以,我把这部分内容摘取出来,分享出来,就是为了能让大家在测试开发的道路上,越走越远!

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


听说,看到最后的大佬,技术能力都是最强的
据说,最后的彩蛋,会让你不知所措



2. 并发测试定义

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

类型:
点层面上同一时间做某件事
例:早上7:30 ,所有的学生都升国旗
线层面上一个时间做不同的事,但同时对服务器产生压力
例:一个时间点,有的学生跳皮筋,有的玩足球

敲黑板:


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



3. 并发测试分类


  • 1、功能并发测试
    解析:要先进行测试单业务功能场景的并发测试,在进行混合业务功能场景的并发测试。
    目的:为验证系统功能是否符合需求规格说明书的要求;

  • 2、性能并发测试
    解析:同时满足某些系统性能指标的前提下,让被测对象承担不同的工作量,以评估被测对象的最大处理能力及是否存在缺陷。
    目的:为验证系统性能指标是否符合需求规格说明书的要求;

  • 3、稳定性并发测试:
    解析:判断测试系统的长期稳定运行的能力。
    目的:为验证系统稳定性是否符合需求规格说明书的要求;

  • 4、异常性并发测试:
    解析:模拟系统在较差、异常资源配置下运行,以评估被测对象在资源不足的情况下的工作状态。
    目的:为验证系统的异常响应机制是否满足需求规格说明书的要求。


4. 设计思路整理


  • 1、需求分析
    首先找到并发测试对象,了解需求测试的功能有哪些,可以按照业务功能整理,不必深入细节。
    其次描述测试对象的重要性,如要求严格质量的核心功能、高频使用功能、占用系统资源较多的功能等。
    最后进行测试对象拆分,比如购买商品可以拆分成:搜索商品、锁定库存、提交订单、发送支付指令、接受处理支付结果、业务流水、短信及站内信通知、VX推送结果等。

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

  • 3、性能指标需求分析
    分析性能指标是否合理。

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


5. 测试方案设计

1、测试策略


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

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

    ①对于功能并发测试:要先进行测试单业务功能场景的并发测试,在进行混合业务功能场景的并发测试
    ②对于性能并发测试:同时满足某些系统性能指标的前提下,让被测对象承担不同的工作量,以评估被测对象的最大处理能力及是否存在缺陷。
    ③对于稳定性并发测试:判断测试系统的长期稳定运行的能力。该策略强度较小,一般趋向于客户现场日常状态下的压力强度。
    ④对于异常性并发测试:模拟系统在较差、异常资源配置下运行,如人为降低系统工作环境所需要的的资源,网络带宽、系统内存、数据帧等,以评估在资源不足情况下的工作状态。

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

2、测试方案
以两轮测试为例


  • 第一轮测试,以接口文档驱动测试,测试步骤及要点如下。
    编写接口测试代码:核对每个接口传入参数控制:长度限制、格式、必填项限制、正常值范围限制等。同时,确认报错提示信息是否准确、到位;
    异常数据测试:如渠道值设置负数、属性设置不存在、网络断开、数据库锁表等情况,检查数据是否出现异常;
    逐个接口进行并发事务测试:检查账户金额,用户流水、对账流水数据。核对数据的与用例调用结果是否一致;
    复合接口并发测试:将各种充值、交易类型的接口按照一定的顺序进行并发,校验账户收支金额、流水是否与用例调用结果是否一致;

  • 第二轮测试,以业务场景驱动测试,测试步骤及要点如下。
    统一动作并发:相同订单并发支付,并发退款;
    混合交易场景:秒杀抢购,集中退货、到货确认;
    绕过页面操作:通过抓包,抛送异常值进行交易测试。


6. 指标分析

1、整理并发需求


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

  • 性能指标需求
    ① 打开速度<3s,订单提交成功<5s;
    ②订单成功率达到99.5%以上;
    ③在100个并发用户的高峰期,订单处理能力至少达到900TPS。

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

①并发订单数
②成功订单数
③成功订单响应时间
④订单成功率
⑤成功订单的总响应时间
⑥成功订单的平均响应时间
⑦Tps

3、性能指标分析

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

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

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

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

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

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

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


7. 代码实战

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

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2021-3-6
"""
import hashlib
import threading
from time import *
from datetime import datetime,timedelta
import requests
import json&#39;&#39;&#39;初始化全局变量&#39;&#39;&#39;#自定义全局变量需要的线程数,10
thread_num = 10
#自定义全局变量每个线程需要循环的数量,10
one_worker_num = 10
#设定最开始的总时间
sum_time = 0.00
#设定最开始的成功连接数
success_count = 0&#39;&#39;&#39; 后台登录常规操作&#39;&#39;&#39;username = &#39;carldj&#39;
password = hashlib.md5(b&#39;123456&#39;).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&#39;&#39;&#39;订单发送请求&#39;&#39;&#39;def order():#引用全局变量global cglobal sum_timeglobal success_count#获取执行发送订单请求前时间t1 = time()#设定url、form_data进行创建订单url1 = "http://www.xxx.com/energy/create_order/"from_data1 = {"restaurant_id":1136,"menu_item_total":&#39;12.00&#39;,"menu_item_data": [{&#39;id&#39;:2667868,&#39;p&#39;:22,&#39;q&#39;:3}]}make_responst = requests.post(url1,data=from_data1,COOKIEs = c)#获取请求结果res = make_responst.text#结果转换成字典赋值给变量idid = json.loads(res)[&#39;order_id&#39;]#断言判断是否提交成功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": &#39;carl_dj&#39;,"mobile_number":username,"delivery_address":"address message","pay_type":&#39;cash&#39;,"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)+ &#39;\n&#39;)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&#39;&#39;&#39;嵌套指定循环次数的order()函数&#39;&#39;&#39;def working()global one_worker_numfor i in range(0,one_worker_num):order()&#39;&#39;&#39;自定义main()函数,来执行多线程&#39;&#39;&#39;
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_numavg_time = sum_time/success_count&#39;&#39;&#39;执行完之后,需要把数据写入到txt文件中&#39;&#39;&#39;#订单并发总数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()

8. 总结

关于并发测试,性能测试,小鱼的博文,确实不少,在这里,小鱼再重新罗列一下,
毕竟小鱼喜欢做助人为乐的事情,


我不会承认,我只看妹子的颜值


性能篇
《看过这篇《性能分析流程》后,和面试官聊天都有底气了!!!》
《性能调优怎么做,看过这一篇,菜鸟变大佬!》
《MySQL性能监控(sql命令语句 & MONyog工具)全掌握,这一篇足以!》
《深聊性能测试,从入门到放弃之:初识性能测试》
《深聊性能测试,从入门到放弃之:如何对IO进行性能调优》

性能篇之Locust

《深聊性能测试,从入门到放弃之:Locust性能自动化(一)初识Locust》
《深聊性能测试,从入门到放弃之:Locust性能自动化(二)代码实战》
《深聊性能测试,从入门到放弃之:Locust性能自动化(三)如何提高Locust性能》
《深聊性能测试,从入门到放弃之:Locust性能自动化(四)自定义客户端测试》
《深聊性能测试,从入门到放弃之:Locust性能自动化(五)API汇总整理(上)》
《深聊性能测试,从入门到放弃之:Locust性能自动化(五)API汇总整理(下)》
《深聊性能测试,从入门到放弃之:Locust性能自动化(六)自定义生成负载图形形状》
《深聊性能测试,从入门到放弃之:Locust性能自动化(七)HAR-files→locustfiles自动转换 :Transformer的使用》

并发篇
《我这样回答多线程并发,面试官非要跟我做朋友!》
《常见的并发问题有哪些都不知道,还怎么说自己是大佬!!》
《接口测试开发之:Python3,接口并发测试框架(多线程)》
《接口测试开发之:Python3,订单并发性能实战》
《接口测试开发之:一篇搞懂 Cache、COOKIE及Session的爱恨情仇》

自动化篇
Web UI自动化篇(从入门到实战),清点这里
App自动化篇(从入门到实战),清点这里

爬虫篇
爬虫实战及代码讲解,请点击这里

Python开发篇
Python3 开发实战 及代码讲解,请点击这里


推荐阅读
  • Golang与微服务架构:构建高效微服务
    本文探讨了Golang在微服务架构中的应用,包括Golang的基本概念、微服务开发的优势、常用开发工具以及具体实践案例。 ... [详细]
  • 帝国cms各数据表有什么用
    CMS教程|帝国CMS帝国cmsCMS教程-帝国CMS精易编程助手源码,ubuntu桥接设置,500错误是tomcat吗,爬虫c原理,php会话包括什么,营销seo关键词优化一般多 ... [详细]
  • 时序数据是指按时间顺序排列的数据集。通过时间轴上的数据点连接,可以构建多维度报表,揭示数据的趋势、规律及异常情况。 ... [详细]
  • 深入浅出:Hadoop架构详解
    Hadoop作为大数据处理的核心技术,包含了一系列组件如HDFS(分布式文件系统)、YARN(资源管理框架)和MapReduce(并行计算模型)。本文将通过实例解析Hadoop的工作原理及其优势。 ... [详细]
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 本文详细解析了Java中流的概念,特别是OutputStream和InputStream的区别,并通过实际案例介绍了如何实现Java对象的序列化。文章不仅解释了流的基本概念,还探讨了序列化的重要性和具体实现步骤。 ... [详细]
  • 本文详细探讨了 HAProxy 的基本概念及其与 LVS(Linux Virtual Server)的比较,特别是在内核空间与用户空间的工作差异。文章还深入介绍了 HAProxy 独有的数据结构——弹性二叉树,以及其在高并发场景下的表现。 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 本文介绍了如何使用Workman框架构建一个功能全面的即时通讯系统,该系统不仅支持一对一聊天、群组聊天,还集成了视频会议和实时音视频通话功能,同时提供了红包发送等附加功能。 ... [详细]
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • 对于初次购买阿里云服务器的新手用户来说,如何高效地利用服务器资源并成功部署网站是一个重要的课题。本文将详细指导您完成从购买服务器到网站上线的六个关键步骤。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 解决远程桌面连接时的身份验证错误问题
    本文介绍了如何解决在尝试远程访问服务器时遇到的身份验证错误,特别是当系统提示‘要求的函数不受支持’时的具体解决步骤。通过调整Windows注册表设置,您可以轻松解决这一常见问题。 ... [详细]
author-avatar
手机用户2502870457
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有