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

 🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

引言

这篇是我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 hashlib
import threading
from time import *
from datetime import datetime,timedelta
import requests
import json'''初始化全局变量'''#自定义全局变量需要的线程数,10
thread_num = 10
#自定义全局变量每个线程需要循环的数量,10
one_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 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":'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#结果转换成字典赋值给变量idid = 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_numfor 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_numavg_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()

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑自动开机播放PPT的解决方案

客户有个需求&#xff0c;要求与LED大屏幕连接的电脑定时自动播放PPT。为了安全电脑在不播放的时段&#xff0c;必须关机。 目录 1、使用“时控插座”并进行设置 2、戴尔电脑BIOS设置&#xff08;上电开机&#xff09; 3、设置Windows自动登录 4、任务计划设置 5、启动Au…

谷粒商城【成神路】-【1】——项目搭建

目录 &#x1f95e;1.整体架构图 &#x1f355;2.微服务划分图 &#x1f354;3.开发环境 &#x1f354;4.搭建git &#x1f32d;5.快速搭建服务 &#x1f37f;6.数据库搭建 &#x1f9c2;7.获取脚手架 &#x1f953;8.代码生成器 &#x1f373;9.创建公共模块 …

springboot优雅停机

import org.springframework.context.annotation.Configuration;import javax.annotation.PreDestroy;Configuration public class DataBackupConfig {PreDestroypublic void backData(){System.out.println("开始备份..."System.currentTimeMillis());System.out.pr…

GPT-5不叫GPT-5?下一代模型会有哪些新功能?

OpenAI首席执行官奥特曼在上周三达沃斯论坛接受媒体采访时表示&#xff0c;他现在的首要任务就是推出下一代大模型&#xff0c;这款模型不一定会命名GPT-5。虽然GPT-5的商标早已经注册。 如果GPT-4目前解决了人类任务的10%&#xff0c;GPT-5应该是15%或者20%。 OpenAI从去年开…

【STM32】STM32学习笔记-硬件SPI读写W25Q64(40)

00. 目录 文章目录 00. 目录01. SPI简介02. W25Q64简介03. SPI相关API3.1 SPI_Init3.2 SPI_Cmd3.3 SPI_I2S_SendData3.4 SPI_I2S_ReceiveData3.5 SPI_I2S_GetFlagStatus3.6 SPI_I2S_ClearFlag3.7 SPI_InitTypeDef 04. 硬件SPI读写W25Q64接线图05. 硬件SPI读写W25Q64示例06. 程序…

gitlab.rb主要配置

根据是否docker安装,进入挂载目录或安装目录 修改此文件,我一般是在可视化窗口中修改,有时候也在命令行手敲 将下面的配置复制到该文件中 external_url http://192.168.100.50 # nginx[listen_port] = 8000 (docker安装的这一行不需要,因为端口映射导致此处修改会导致访问…

RX4901CE (RTC模块)

RX4901CE是一个集成了32.768 kHz数字温度补偿晶体振荡器(DTCXO)的RTC模块。高稳定性&#xff0c;低电流消耗&#xff0c;时间戳功能&#xff0c;当外部或内部事件发生时&#xff0c;可以记录多达32个日期和时间&#xff0c;以及基本的RTC功能&#xff0c;如时间和日历&#xff…

python flask学生管理系统

预览 前端 jquery css html bootstrap: 4.x 后端 python: 3.6.x flask: 2.0.x 数据库 mysql: 5.7 学生管理模块 登录、退出查看个人信息、修改个人信息成绩查询查看已选课程选课、取消选课搜索课程课程列表分页功能 教师模块 登录、退出查看个人信息、修改个人信息录入…

Oracle Linux 9.3 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

【模拟算法系列】详解5道题

本文讲解模拟算法系列的5道经典题&#xff0c;在讲解题目的同时提供AC代码&#xff0c;点击题目即可打开对应OJ链接 目录 模拟算法的介绍 1、替换所有的问号 2、提莫攻击 3、 Z 字形变换 4、外观数列 5、数青蛙 模拟算法的介绍 题目中明确告诉你要干什么&#xff0c;思路…

软件测试练手项目,可以写进简历里面的项目实战

最近收到许多自学自动化测试的小伙伴私信&#xff0c;学习了理论知识后&#xff0c;却没有合适的练手项目。 测试本身是一个技术岗位&#xff0c;如果只知道理论&#xff0c;没有实战经验&#xff0c;在面试中很难说服面试官&#xff0c;比如什么场景下需要添加显示等待&#x…

苹果Find My市场需求火爆,伦茨科技ST17H6x芯片助力客户量产

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…

java SSM自助快递服务平台myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM自助快递服务平台是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

《游戏-03_3D-开发》之—新输入系统人物移动攻击连击

本次修改unity的新输入输出系统。本次修改unity需要重启&#xff0c;请先保存项目&#xff0c; 点击加号起名为MyCtrl&#xff0c; 点击加号设置为一轴的&#xff0c; 继续设置W键&#xff0c; 保存 生成自动脚本&#xff0c; 修改MyPlayer代码&#xff1a; using UnityEngine;…

Web04--Flex布局

1、flex布局 1.1 flex认识 1.2 flex组成 1.3 flex布局 1.3.1 主轴对齐方式 <!DOCTYPE html> <html lang"CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

基于密码技术的身份认证——基于对称密码体制的身份认证

一、符号说明&#xff1a; A→B&#xff1a;表示通信实体A向通信实体B发送消息&#xff1b; Ek(x)&#xff1a;表示用认证双方共享的密钥K对x进行加密&#xff1b; Text1&#xff0c;Text2&#xff0c;……&#xff0c;Text n属于可选项&#xff1b; ||&#xff1a;表示比特…

正确看待华为鸿蒙……是盲目跟风吗?

先要了解纯血鸿蒙是什么&#xff1f;与之前的套壳Android版本区别在哪&#xff1f;了解这核心东西之后才会真正的看出“纯血鸿蒙”的未来与发展。 纯血鸿蒙全栈自研 HarmonyOS NEXT系统底座全线自研&#xff0c;去掉了传统的Linux内核以及AOSP等代码&#xff0c;仅支持鸿蒙内…

vulnhub靶场之Five86-1

由于这些文章都是从我的hexo博客上面复制下来的&#xff0c;所以有的图片可能不是很完整&#xff0c;但是不受影响&#xff0c;如果有疑问&#xff0c;可以在评论区留言&#xff0c;我看到之后会回复。 一.环境搭建 1.靶场描述 Five86-1 is another purposely built vulnerab…

Linux文本编辑器-vi/vim

一.vi/vim编辑器介绍 vi\vim是visual interface的简称, 是Linux中最经典的文本编辑器 同图形化界面中的 文本编辑器一样&#xff0c;vi是命令行下对文本文件进行编辑的绝佳选择。 vim 是 vi 的加强版本&#xff0c;兼容 vi 的所有指令&#xff0c;不仅能编辑文本&#xff0c;而…

【操作系统】实验九 写一个设备驱动程序

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…