性能测试 —— 性能测试流程!

简介: 性能测试:利用工具模拟大量用户操作,验证系统承受的负载情况。

性能测试:利用工具模拟大量用户操作,验证系统承受的负载情况。

性能测试的目的:找到潜在的性能问题或瓶颈,分析并解决;找出性能变化趋势,为后续扩展系统提供参考。

  • 测试监控:基准测试、配置测试、负载测试、稳定性测试,对硬件和中间件进行监控。

一、系统非功能需求采集

(1)系统架构:物理架构(硬件及部署策略)和逻辑架构(系统的功能与服务),包括中间件产品与配置、数据库配置等,供我们搭建测试环境时进行参考。

(2)业务流程:业务量和业务分布。采集业务(分析出哪些业务纳入性能测试范围)并量化业务、业务扩展趋势(年增长率或者未来的业务量)、业务发生时段(业务高峰的发生时间和高峰业务量)、业务分布(各项业务之间的比例)。

(3)用户信息:在线用户数、活动用户数、业务分布。有些系统用户量特别大,会对系统造成性能瓶颈,可以通过分析活动用户数和业务分布来分析负载情况。

(4)系统是否与第三方系统有关,是否需要做挡板(Mock程序)。

(5)系统是否有归档机制:如果数据库有归档机制???,可以把一些无用或者过时的信息移到归档库,这样就减少当前数据库的数据,有利于提高系统性能。

(6)性能指标:吞吐率、响应时间、事务成功率,CPU、内存、磁盘、带宽使用阀值。

二、系统非功能需求分析

确定性能测试范围

  1. 是否核心业务,是否要求严格的质量
  2. 是否高频次的业务
  3. 是否占用系统较多资源、或性能影响大的业务
  4. 使用人数多还是少
  5. 在线人数多还是少
  6. 确定此功能的可测性、可验证性:功能是否可验证(是否牵连到第三方程序,是否需要做挡板Mock程序)。

明确性能指标

业务性能指标

1. 吞吐量(PV)、吞吐率(TPS等)

2. 响应时间(RT)/ 应用响应时间(ART):3秒以内

3. 事务成功率:99%以上

4. 稳定波动正常范围

响应时间2-5-8原则

当用户在2秒以内得到响应时,会感觉系统的响应很快;

当用户在2-5秒之间得到响应时,会感觉系统的响应速度还可以;

当用户在5-8秒以内得到响应时,会感觉系统的速度很慢,但是还可以接受;

而当用户在超过8秒后仍然无法得到响应时,会感觉系统糟糕透了,或者认为系统已经失去响应。

硬件性能指标

CPU、内存、磁盘、网络带宽等。

系统硬件指标阀值

这些指标比较抽象,在监控分析时应该进一步细化。比如CPU的性能指标在Linux中分为用户利用率、系统利用率及平均负载等重要指标。以上指标具体数据来源于非功能需求、组织要求(公司运维总结出来的可行性指标)或者行业标准建议

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

分析业务量

测试数据的多少对测试结果会有影响。特别是数据成千万上亿条之后,性能影响明显,所以需要做足一定数量的历史数据。除此之外,还得关注业务的增长。如果系统需要满足未来三年的业务增长需求,那么在测试时就需要生成三年的存量业务数据。对于关系型数据库来说,数据最大时对性能的影响还是比较明显的。

估算TPS与并发数

一般我们会从运维那里得到整个系统在一天内按小时进行统计的PV趋势图。根据访问高峰业务量,估算出TPS与并发用户数等性能测试执行依据。一般采用二八原则,即80%的业务在20%的时间内完成。二八原则计算的结果是吞吐量(即TPS),而并发数 = TPS *(ThinkTime+RunTime)。

如果你的系统性能要求更高,也可以选择一九原则或更严格的算法,二八原则比较通用,一般系统性能比较接近这个算法而已,大家应该活用。

分析系统协议

一般性能测试脚本可以通过录制或者手动开发,而录制方式对协议的依赖性相当强。一般我们先分析系统协议(向开发团队咨询,或者截包分析),再评估用什么工具完成。HTTP可以用JMeter或者LoadRunner,Java接口可以用JMeter的JavaRequest元件与JUnit元件测试。

三、性能测试从哪里获取需求?

一般需求文档中会有一部分章节用于描述系统非功能性需求,但是多数需求文档对于性能需求的说明都比较笼统抽象。在需求不明确的情况下,通常需要性能测试工程师主动向需求提供方(BA团队、产品团队等)去征询。

对于升级、优化类的老系统,可考虑是否存有历史测试方案参考,或许可以省事很多。或者我们分析原型系统业务数据即可,最直接的办法就是分析原型系统的数据、统计业务量、业务分布等信息。

1、学习业务:

通过查看文档、手工操作系统对系统功能进行学习。

2、需求分析:

分析系统非功能需求(关注业务量、业务分布、用户规模、性能指标等信息),确定性能测试范围,了解性能指标。

3、工作评估:

工作量分解,评估工作量,计划资源投入(即需要多少人力,多少工作日来完成性能测试工作)。

4、设计模型:

圈定测试范围后,把业务模型映射成测试模型。

业务模型:业务流程,系统在某个时间段内运行的业务种类及其业务占比,即哪个业务在什么时段在运行,业务量是多少?

测试模型:从业务模型中分析整理出来的需要进行测试的业务。对业务进行拆分对象,实现这个完整的功能包含哪些流程、环节。比如“购买商品”,具体的流程环节包括“登录->搜索商品->提交订单->支付订单->退出”。接着,明确业务占比,重要程度,目的在于:

(1)明确重点测试对象,安排测试优先级

(2)建模,混合场景中,虚拟用户资源分配,针对不同业务功能施加不同的负载。

(3)明确下“需求分析-指标分析”中相关业务功能所需基础数据及数据量问题,因为那块需求分析时可能只是大致估算下,评估指标是否合理,需要认真再分析下。

有些因为特殊原因无法测试(比如第三方非开源加密程序,测试程序无法模拟)的业务,测试模型中将会去掉这部分业务,或者设计替代等价方案,比如第三方程序可以使用挡板程序实现。

性能测试场景:参照用户使用习惯设计负载场景,比如哪些业务的测试脚本一起运行,哪些业务有先后顺序,运行多少并发用户等。比如WMS系统(仓库管理系统),WMS中都会有盘点功能,此功能就不应该与日常功能混合在一起,因为盘点通常都是一个月一次。所以组织测试场景时尽量要与实际业务情况一致

5、编写计划

在文档中明确列出测试范围、人力投入、持续时间、工作内容、风险评估、风险应对策略等。

  • 系统概述:简述系统使命、系统功能,用于给非专业人士了解系统是做什么的。
  • 测试环境:生产环境、测试环境(服务器+负载机)的硬件架构和详细配置信息。
  • 需求分析:需要测试的业务模型及其信息采集,性能指标的采集和确定。
  • 测试策略:测试目的、测试执行的可行性分析、具体的测试手段及测试监控策略。
  • 测试场景:如何组合业务场景进行性能测试。
  • 测试准备:包括:测试工具的准备(负载工具、监控工具、文档管理工具);测试脚本及测试程序准备;测试数据准备;测试环境准备。
  • 时间计划:进行需求分析、测试策略后,就可以相对合理的估算测试资源及耗时。
  • 测试组织架构:测试相关干系人,明确不同干系人的工作职责。
  • 交付物清单:性能测试计划、性能测试脚本、性能缺陷报告、性能测试阶段性报告、性能测试报告(包括且不仅限于事务成功率、TPS、硬件性能指标等)。
  • 系统风险:风险预测及风险评估(包括且不仅限于人员风险、软件风险、进度风险、变更风险、系统风险、数据风险、环境风险),并提出应对策略。

6、开发脚本

录制脚本或手动开发,添加固定计时器模拟ThinkTime,增加同步定时器模拟集合点,增加IF条件控制器判断逻辑,添加后置处理器获取参数。脚本注意做断言???,验证事务是否成功。

开发挡板程序,开发测试工具等。

事务定义

合理的定义事务,能够方便分析耗时(特别是混合业务功能场景测试),进而方便分析瓶颈。比如,购买商品,我们可以把下订单定义为一个事务,把支付也定义为一个事务。

7、测试环境准备

测试环境包括服务器和负载机。找出这些:

  • 请求顺序、请求之间相互调用关系。
  • 数据流向,数据是怎么走的,经过哪些组件、服务器等。
  • 预测可能存在性能瓶颈的环节(组件、服务器等)。
  • 明确应用类型IO型,还是CPU消耗性、内存消耗型->弄清楚重点监控对象。
  • 关注应用是否采用多进程、多线程架构->多线程容易造成线程死锁、数据库死锁,数据不一致等。
  • 是否使用集群/是否使用负载均衡。

生产环境和测试环境的硬件架构和配置需要进行估算,否则结果会有很大的偏差。了解测试环境部署和生产环境部署差异,是否按1:1的比例部署。通常建议测试时先不考虑集群,采用单机测试,测试通过后再考虑使用集群,这样有个比较,比较能说明问题。

8、测试数据准备:

准备被测系统的主数据(保证系统能够正常运行的数据,比如论坛版块、角色、用户等数据)与业务数据(运行业务产生的数据,比如订单;订单出库需要库存数据,库存数据也是业务数据)。

我们知道数据量变会引起性能的变化。在制作测试数据时,一要注意,需要准备足够的存量/历史业务数据,二要注意数据的分布。比如我们计算出需要并发100个虚拟用户,我们至少需要准备100个以上账号,并对账号赋予相应的权限(浏览、发帖、删除、查询)。

那么准备多少数据够用呢?

往往性能测试需求会要求我们对系统进行定容定量,所以测试过程会经历如图的曲线变化;我们需要跨过③到达④这个阶段,所以至少需要准备在④这个点所需要的用户账号。

RT&TPS和Thread的趋势图

另外,为了更形象的模拟用户使用情况,我们会希望使用尽可能多的模拟用户(即并发用户数),通过ThinkTime来调节这些模拟用户产生的负载(因为,并发用户数=TPS*(ThinkTime+RunTime)。ThinkTime时间越长,所需要的并发数越大,请求数量越多,TPS也会相应增加)大小,用户越多越好。

数据制作方法

可以使用工具、SQL或者存储过程???来完成。建议使用SQL,同时还能够熟悉数据库的物理设计(索引、字段、范式、反范式等)和ER关系???

9、测试执行

测试执行是性能测试的关键,同样的脚本不同执行人员得出的结果可能差异较大。这些差异主要体现在场景设计与测试执行上。

场景设计

前面已经确定了测试模型。场景设计是根据测试模型与目标,组织虚拟用户、组合业务种类到一个测试单元。组织测试场景时尽量要与实际业务情况一致

基准测试

采用单业务场景单用户的方式执行脚本。用于验证测试环境、测试脚本,以及为后续的测试执行提供性能基准。比如一个登录系统,如果系统登录时间为8秒,那么这个系统也就没必要再进行性能测试,因为它连一般性能都达不到要求。

配置测试

配置测试场景一般为混合场景(多个业务同时执行),用于帮助分析系统软、硬件配置是否满足性能需求指标,优化配置使各项资源达到最优分配原则。测试过程是一个实验过程,先是找出不合理配置,然后进行修改,最后进行验证;周而复始到配置满足需求。

负载测试

负载测试的目的是分析性能变化趋势,找出性能拐点分析性能问题与风险,对系统进行定容定量;为系统优化、性能调整提供数据支撑。负载测试分为单场景混合场景;单场景有利于分析性能问题,因为排除了其他业务干扰;混合场景更贴近用户实际使用习惯,是一个综合的性能评估。建议先做单场景测试再做混合场景测试。

负载测试的性能变化曲线图见前面的 “RT&TPS和Thread的趋势图”,①可以理解为单业务、单用户时的系统性能,②通常是我们估算的满足性能需求的点,③是性能拐点,之后性能变差,在这个点系统吞吐量达到最大,④这个点已经过载,吞吐量开始减小。负载测试一般需要找到②③④这三个点,通常会因为一些配置、程序问题而受到干扰,所以执行测试也是一个耗时的工作。

稳定性测试

稳定性测试在正常性能阀值下尽量加大负载,长时间运行,确定系统的软、硬件环境是否运行稳定。什么是阀值呢?比如响应时间要求3s以内,3秒就是阀值;比如CPU利用率70%以下,70%就是阀值。假设满足性能要求的负载是B,那么稳定性测试时负载一般是1.5B~2B。执行时采用混合场景,按惯例执行时间不低于8小时。时间上越长越好,有些隐藏较深的诸如内存溢出的问题是需要长时间运行才能反映出来的。

测试监控

测试监控

测试执行

一般第三方性能测试会有一个测试准入条件(Checklist)。如果是项目组内的就没有这么严格了,但基本内容不变。

(1)检查网络环境

确保环境独立,不会对生产系统、外部系统等的使用造成影响。

确保环境可靠,不会因为生产系统、外部系统而影响测试结果。

为了方便分析问题,排除网络IO的影响,测试在局域网中进行。

(2)检查测试数据

确保基础数据完整,能够支持性能测试脚本对业务功能的覆盖。

确保基础数据量,能够支持性能测试脚本的参数化要求。

确保存量数据量,能够尽量真实反映系统数据环境。

确保存量数据分布,能够对结果施加有意义的影响。

(3)检查监控设备

监控工具是否已经准备完毕可用。

(4)脚本检查

确认脚本能够模拟业务场景。

确认脚本无性能风险不影响测试结果。

注:具体的测试执行详细见 场景设计与测试执行

10、缺陷管理

对性能测试过程中发现的缺陷进行管理。

11、性能分析和性能调优

性能测试工程师与开发人员一起来解决性能问题。

12、测试报告

如何由测试环境推算生产环境配置

对于报告人来说,报告的是工作,是对整个测试过程的报告。对于决策层(报告相关干系人)来说关心的是结果,决策层迫切的想知道Yes or No,系统能不能上线,如果不能上线,有什么问题,怎么能够尽快解决?这两方面的需求决定了测试报告需要包含以下内容。

  • 性能测试背景:测试原因,性能测试开展的必要性。
  • 性能测试目标:对系统进行定容定量、响应时间、配置、稳定性等测试,风险评估。
  • 性能测试范围:参考测试计划中的测试范围。
  • 名词术语:涉及专业名词的解释,参考测试计划。
  • 测试环境:报告结果基于的测试环境,不同的环境结果可能大相径庭。
  • 测试数据:报告测试数据量,参考测试计划。
  • 测试进度:报告测试过程,什么时候做什么工作,比如哪一天执行了哪些测试脚本。
  • 测试结果:基准测试、配置测试、负载测试、稳定性测试等,全面多方位的报告测试结果,TPS、ART、事务成功率、硬件资源使用率(CPU、内存、网络、IO等)。
  • 测试结论:分析给出测试结论,系统能否满足性能要求?存在什么问题?有哪些缺陷?解决了哪些问题?还有哪些问题没有解决?列出仍没有解决的系统缺陷。
  • 系统风险:报告系统可能存在的风险,帮助决策层应对风险。

测试报告要非专业人士也能看懂,做好指标对比、用图表表达性能变化趋势。

13、评审

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

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

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

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

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

相关文章

SpringCloudAlibaba-概述(一)

目录地址: SpringCloudAlibaba整合-CSDN博客 记录SpringCloudAlibaba的整合过程 一、简单概述一下项目情况 项目主要有4个模块和4个微服务; 项目结构如下: mall:父工程 -- common:公共组件,存放公用的实…

01 Hello Python

本节课重点知识点 1、函数: 在python中,函数是已经写好的,可以重复使用的,用来实现单一,或相关联功能的代码段。函数可以使代码模块化,提高重复利用率。 2、内置函数: 程序员已经写好的一些函…

1、Qt UI控件 -- qucsdk

前言:Qt编写的自定义控件插件的sdk集合,包括了各个操作系统的动态库文件以及控件的头文件和sdk使用demo。类似于Wpf中的LivChart2控件库,都是一些编译好的控件,可以直接集成到项目中。该控件是飞扬青云大神多年前开发的&#xff0…

【LeetCode热题100】【二叉树】验证二叉搜索树

题目链接:98. 验证二叉搜索树 - 力扣(LeetCode) 即左边的小于根小于右边的,不仅仅是这样,根必须得比左子树的都要大,比右子树的都要小,因此对于每个节点都需要小于某个值大于某个值 class Sol…

OV证书为什么更可信

在网络安全领域,SSL/TLS证书扮演着至关重要的角色,其中组织验证(Organization Validation,简称OV)证书以其深度验证机制和高度可信性脱颖而出。 OV证书为何更值得信赖,关键在于其严格的验证流程。 首先&am…

SOCKS代理概述

在网络技术的广阔领域中🌐,SOCKS代理是一个核心组件,它在提升在线隐私保护🛡️、实现匿名通信🎭以及突破网络访问限制🚫方面发挥着至关重要的作用。本文旨在深入探讨SOCKS代理的基础,包括其定义…

ai智能问答免费API接口

智能对话API接口,可以为网站或其他产品提供强大的智能交互功能,无需自行开发复杂的语义分析和自然语言处理算法。这使得开发者能够更专注于产品的核心功能和用户体验,加速产品上线速度并降低开发成本。 智能对话API接口的功能还包括对话内容…

DC40V降压恒压芯片H4120 40V转5V 3A 40V降压12V 车充降压恒压控制器

同步整流恒压芯片在现代电子设备中发挥着重要作用,为各种设备提供了稳定、高效的电源管理解决方案。 同步整流恒压芯片是一种电源管理芯片,它能够在不同电压输入条件下保持输出电压恒定。这种芯片广泛应用于各种电子设备中,如通讯设备、液晶…

CentOS7安装MySQL8.0教程

环境介绍 操作系统:Centos7.6 MySQL版本: 8.0.27 只要是8.0.*版本,那就可以按照本文说明安装 一、安装前准备 1、卸载MariaDB 安装MySQL的话会和MariaDB的文件冲突,所以需要先卸载掉MariaDB。 1.1、查看是否安装mariadb rpm -…

Igh related:Small Bug And Notes Record.

Write at the top My computer got some silly problem with the typing software that my Chinese IM does’t work again. So I’ll try to record the things happened in English. If any error,DM me plz. BUGs BUG1 Undefined symbol Identifier “CLOCK_MONOTONIC”…

NzN的数据结构--栈的实现

在前面我们已经学习了哪些线性数据结构呢?大家一起来回顾一下:C语言学过的数组,数据结构中的线性表和顺序表和链表。那我们今天再来介绍数据结构里的两个线性结构--栈和队列。 目录 一、栈的概念及结构 二、用数组实现栈 1. 栈的初始化和…

Windows系统Docker部署IT工具箱It- Tools结合内网穿透实现公网访问

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools,并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…

【springboot开发】PO、DTO等对象的基本概念

前言:java是面向对象的,java开发中由于多层开发结构,涉及到各种类别的实体类。 POJO 无规则简单java对象 PO 持久化对象数据库结构到java对象的映射PO平常不一定需要实现序列化,只是当采用分布式存储或者需要作为前端输出及远程调…

SpringCloudAlibaba-整合gateway(五)

目录地址&#xff1a; SpringCloudAlibaba整合-CSDN博客 gateway作为网关&#xff0c;是一个单独的模块 1.添加依赖 <!-- SpringCloud Alibaba Nacos --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter…

学习 Rust 的第一天:基础知识

如果你对 Rust 一无所知&#xff0c;那我来解释一下。 “Rust 是一种系统编程语言&#xff0c;其优先考虑性能、内存安全和零成本抽象。” 你好&#xff0c;世界 我之前研究过 Rust&#xff0c;并且对 Java、C、C 和 Python 的基本编程概念有相当了解。 今天&#xff0c;我…

node.js-入门

定义 Node.js是一个跨平台Javascript运行环境&#xff0c;使开发者可以搭建服务器端的Javascript应用程序 作用&#xff1a;使用Node.js编写服务器端程序 1&#xff09;编写数据接口&#xff0c;提供网页资源浏览功能等 2&#xff09;前端工程化&#xff1a;集成各种开发中…

[C++]map set

一、set 1、概念 set是按照一定次序存储元素的容器在set中&#xff0c;元素的value也标识它(value就是key&#xff0c;类型为T)&#xff0c;并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const)&#xff0c;但是可以从容器中插入或删除它们。在内部&…

4.9号驱动

1. ARM裸机开发和Linux系统开发的异同 相同点&#xff1a;都是对硬件进行操作 不同点&#xff1a; 有无操作系统 是否具备多进程多线程开发 是否可以调用库函数 操作地址是否相同&#xff0c;arm操作物理地址&#xff0c;驱动操作虚拟地址 2. Linux操作系统的层次 应用层…

在vite中限制node版本

1.修改package.json文件 {"name": "wine-store-frontend","version": "0.0.0","private": true,"type": "module","scripts": {"dev": "vite --open","build"…