1.性能测试怎么做?性能测试的流程是什么?
性能团队组建[Project stakeholders]-测试计划创建(了解系统架构[System Architecture],明确性能指标[Performance Indicators],确定测试策略[Test Strategy],准备测试场景[Test Scenario])-环境搭建-准备数据-工具选择-脚本编写-执行测试-性能瓶颈分析[Performance Bottleneck]-回归调优[Performance Tuning]-测试报告
2.性能测试的分类:
①瞬发测试(并发测试)(验证秒杀等业务)
②负载测试(Load Testing):确定在各种工作负载下系统的性能,目标是测试负载逐级增加是,查看系统各项性能指标的变化情况(确定系统性能拐点),看看系统工作怎么样
③压力测试:(Stress Testing):评估超过预期负载时,系统的运行情况。通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试,以出错位目标。可以认为是高负载下的负载测试。也需要观察负载下降时,系统是否能恢复正常
④稳定性测试(Stability Testing):增加系统资源占用,系统长时间的大并发运行或者正常流量的系统访问,确定系统长期稳定工作的能力
⑤配置测试 (Configuration Testing):通过修改系统配置确定系统性能
⑥灾难测试(Failover Testing):大型系统的部分在故障不可避免时确定系统仍可用,通过Chaos实现。
3.常见的性能指标以及专有名词有哪些?分别是什么含义?
①性能指标:
VU:虚拟用户数(也就是并发量)
tps:每秒事务量,代表了系统的处理能力,tps越高,性能越好,TPS=并发量(VU)/平均响应时间(Runtime+Thinktime+Pacetime)
响应时间:一般指平均响应时间,从发出请求到接受到系统响应数据所花费的时间,响应时间越短,性能越好
吞吐量:网络上行和下行流量的总和,吞吐量是网络瓶颈定位的重要指标
错误率:在压测过程中系统出现错误的比例
②专有名词:
PV:页面浏览量
4.性能测试计划应包括的内容:
①系统概述:描述系统使命,系统功能
②测试环境描述:描述生产环境,测试环境,客户端环境。描述不同环境造成的影响。
③需求分析:描述系统性能需求,描述需求范围
④测试策略:描述测试手段,如测试工具,如果处理第三方系统
⑤测试场景确定:描述如何组合业务场景
⑥测试准备:描述测试环境如何搭建,测试数据如何准备
⑦测试计划时间表:描述时间进度安排
⑧测试组织架构:描述测试相关干系人,干系人职责
⑨交付物清单:性能测试计划,性能测试报告,性能测试脚本,数据构造脚本
⑩测试风险描述:描述可能存在的项目风险,以及如何应对
5.如何进行性能测试的需求分析?
第一步:采集需求
①理想状况-从需求文档
②现实状况-性能测试人员主动采集相关需求:了解系统架构-量化业务量-了解业务时段-了解业务扩展趋势-了解是否有数据归档-采集在线用户数-了解是否有第三方系统(确定是否需要做挡板)-了解系统硬件指标(如果可以)
第二步:分析需求
①确定性能测试的范围
理想状况-BA,PO确认
现实状况-性能测试人员确认:确定高频次业务;确定性能影响大的业务;确定功能的可验证性
②明确性能指标:
理想状况-BA,PO确认
现实状况-性能测试人员确认:PV TPS 响应时间 成功率
③分析业务趋势:
理想状况-BA,PO确认
现实状况-性能测试人员确认:计算系统应承担业务量
④估算TPS,估算基础并发量
理想状况-BA,PO确认
现实状况-性能测试人员确认
6.如果没有性能指标怎么做性能测试?如果让你预估性能指标,怎么预估?
估算需求TPS:
第一步:估算需求高峰单位PV(如一个小时):
新系统:①竞品数据 ②经验
老系统:①LOG业务统计 ②新需求指标
第二步:估算的TPS=[高峰单位PV✖80%] / [3600✖20%] (以一小时为例,根据二八法则计算)
估算基础并发量:
第一步:估算系统响应时间(Runtime+Thinktime+Pacetime)
新系统Runtime:使用业内的响应时间标准①1s 2s 3s标准 ②2s 5s 10s标准
老系统Runtime:①抓包观测不同接口的响应时间②新需求指标
Thinktime:使用业内标准-3s, 如果确实相关页面thinktime较长则适当增加thinktime时间
Pacetime:根据具体业务确定
第二步:估算的基础并发量=估算的TPS✖(Runtime+Thinktime+Pacetime)
7.性能测试的测试场景如何划分?
①按场景类型划分:基准测试场景,配置测试场景,负载测试场景,稳定性测试场景
②按业务划分:根据UserStory与相关负责人(PM PO BA等)确认具体的业务场景)
8.列举常用的线程(用户)?
①线程组
②Stepping Thread Group(阶梯压力模拟)
③Ultimate Thread Grpup(波浪压力模拟)
9.列举常用的Jmeter的Sampler(取样器)
①HTTP请求②JDBC请求③GRPC请求④TCP请求
10.列举Jmeter的断言方式
①响应断言②大小断言③JSON断言④XML断言⑤BeanShell断言
11.列举Jmeter的逻辑控制器
①事务控制器 :一组接口的集合作为衡量的指标
②并发控制器(Parallel):一组接口同时发出,取最长响应时间
③while控制器:判断条件为False时终止循环
④吞吐量控制器:不能控制吞吐量,控制取样器访问数量比例或数量
⑤简单控制器:对执行无任何影响,仅用于分组
⑥循环控制器(Loop):实际循环次数=线程组循环次数*循环控制器循环次数
⑦if条件控制器:通过某个条件控制节点下的元件是否运行
12.Jmeter的前置后置处理器
前置处理器:①BeanShell预处理程序
后置处理器:①BeanShell后置处理程序 ②正则表达式提取器③json提取器
13.固定定时器和测试活动的区别
①固定定时器是在每个sampler(采样器)之前执行的,而不是之后,测试活动是在sampler执行完之后再等待
②固定定时器往往时间很难控制,但是测试活动可以通过停止,循环等减少等待时间
测试活动可以设置期望循环的部分而跳过部分步骤
14.取样器:HTTP请求高级选项中Java和httpclient4的区别
Java:选择压测时,链接是复用的(10个线程循环十次,显示10个TCP连接)
httpclient4:压测时,每请求一次都创建一个新的链接(10个线程循环10次,显示100个TCP连接),(jmeter5.0以前默认关闭了连接复用,5.0上是打开的:即每请求一次都会创建一个新的链接)。默认为HttpClient4。
15.局域网中模拟多个IP地址请求访问
①以太网-属性-Internet Protocol Version 4(TCP/IPv4)-局域网内无占用得IP,设为同一子网掩码
②CSV数据文件设置变量名称设置为IP
③HTTP请求->高级->源地址:IP/主机名参数化IP
16.要求TPS非常高,性能测试怎么做?
使用分布式
①jmeter.properties文件修改远程host的IP与端口号
②UI界面:运行->远程启动
或者命令行执行: /jmeter -n -t test.jmx -l test.jtl Jmeter命令参数: -n 表示非界面模式 -t 表示要测试的脚本 -l 表示执行的结果文件 -R 表示启用远程服务,后面跟远程机器,即slave机器列表。 -r 表示启动所有配置的远程压力机 如果是本机压测就无需要带-r参数
17.给你一种Jmeter暂不支持的协议的系统,怎么测试
a> 先了解协议的格式,数据交互
b> 查找压测工具是否支持本协议
c> 如果不支持,通过自己写代码的方式发送协议包进行测试
18.tps压不上去,可能有哪些方面的原因?
a)压力机本身性能瓶颈
b)网络IO瓶颈
c)中间件(tomcat/nginx/mysql)连接数限制
b)Java线程的阻塞、等待
e)本系统资源的瓶颈(cpu、内存、磁盘、网络等)
f)其他外部系统响应时间过长,造成本系统的time-wait
19、测试数据怎么构造?你一般都是采用哪些方法来造数据?
a)调用业务接口构造数据
b)直接写jdbc代码造数据
c)存储过程造数据
20、什么是集合点,什么场景下需要用集合点
集合点是测试脚本中的一个标记,当每个虚拟用户执行到标记处时,会停留在标记处等待其他的虚拟用户,当达到预期设置的并发数时,标记处的所有用户同时启动执行后续的请求
集合点会产生瞬间高并发,但是也会降低平均压力。所以在压测过程中,如果有要求瞬间高并发的业务,就需要使用集合点,比如抢购,秒杀之类的业务。
没有类似业务则不需要加集合点
21.Jmeter保存cookie
①CookieManager.save.cookies设置为true
②添加一个空的cookie管理器
③添加Debug Sampler,添加对应结果树,运行一下,可以看到存储的cookie数据
④使用BeanShell PostProcessor进行提取,${__setProperty(cookie_2,${COOKIE_.AspNetCore.Culture},)}
⑤信息头管理器使用变量${__P(cookie_1,)
22.测试环境如何部署
a)首先线下必须要有专门的性能测试环境,尽量保证客户端与被测试服务器处于同一机房,同一网络环境下
b)线下环境单台机器配置和线上不能相差很大,可以通过单台的机器性能推算出多台机器性能(需考虑一定的性能损耗)
c)如果线下机器配置很差,只能测试出程序有无性能问题,这样线下测试出来的数据对线上没有太大参考意义
d)如果想获取比较准确的线上性能情况,建议最好做线上的性能测试
23.Jmeter中怎么做二次开发
①针对Java
a)通过eclipse等工具手动编写一个Java类,实现JavaSamplerClient接口
b)将要写的代码放到JavaSamplerClient接口对应的实现方法中,如果需要暴露出参数,将参数添加到getDefaultParameters方法中
c)脚本调试通过后,将写好的脚本达成runnable jar,将jar包和依赖的lib文件夹放到Jmeter的lib/ext下,重启Jmeter
d)在Jmeter中添加JavaSampler,选择jar包中的测试类
②针对Python
方法一:通过jmeter的BeanShell取样器,通过dos命令(间接)调用python脚本(可能存在性能瓶颈)
String command = "cmd /c python D:\\python_work\\automation\\mq_send_message.py";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
方法二:将相关需求做成python的web服务(使用flask)
24.对于Linux系统,主要的监控指标有哪些?他们的各自阈值是多少?
cpu使用率:<80%
load值:<cpu的核数
系统内存:使用率<80%
磁盘IO:<100%-90%
网络IO:<带宽上限
25.应用服务器cpu高和数据库服务器cpu高的分析思路是什么?
应用服务器的cpu高,先要看tps和响应时间,如果tps比较高,我们认为是正常的cpu消耗;如果tps比较低,那么往往某些代码过于消耗cpu,可以考虑使用jprofiler分析下
数据库服务器cpu高,往往是因为sql语句执行效率比较低,可以通过对数据库慢查询是监控,结合执行计划进行分析,是否是相关表没有索引或索引未生效
26.如何找出系统瓶颈?