性能测试及Jmeter的使用

1. 什么是性能?

        定义:性能就是软件质量属性中的“效率”特性,包括时间特性和资源特性。时间特性表示系统处理用户请求的响应时间;资源特性表示系统运行过程中,系统资源的消耗情况,包括cup、内存、磁盘等。

2. 什么是性能测试?

        定义:使用自动化工具,模拟不同的场景,对软件各项性能指标进行测试和评估过程。

3. 性能测试的作用是什么?

        评估当前系统能力;寻找性能瓶颈,优化性能;评估软件是否能够满足未来的需求

4. 性能测试的流程有哪几个步骤?

        性能测试需求分析

        性能测试计划和方案

        性能测试用例设计

        性能测试执行:建立测试环境、编写测试脚本、配置性能监控指标、执行测试脚本

        性能测试分析和调优

        性能测试报告总结

5. 性能测试的指标

        定义:指标是一组数据,该数据用来量化衡量某种操作的性能好坏。

        常见指标:响应时间、并发数、吞吐量、错误率、资源利用率

        响应时间:指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的结果,整个过程所耗费的时间;包括服务器处理时间+网络传输时间

        并发数:单位时间内发送给服务器的请求数

        吞吐量:单位时间内处理的客户端请求数量(直接体现软件系统的性能承载能力);TPS(Transactions Per Second),每秒事务数,控制服务器每秒处理的事务请求的数量;RPS(Request Per Second),每秒请求数,控制服务器每秒处理指定请求的数量。

        错误率:系统在负载情况下,失败业务的概率,错误率=(失败业务数/总业务数)

        资源使用率:系统各种资源的使用情况,一般用“资源的已使用量/总的资源可用量”,形成资源利用率的数据;资源指标通常情况下的要求:cpu不高于75%-80%、内存不高于80%、磁盘IO不高于90%、网络不高于80%

6. 如何获取性能需求指标?

        一、当需求直接给出时,可以直接将其作为性能测试的指标依据

        二、根据历史运营数据分析:1)提取进行性能测试的功能模块:业务维度提取,技术维度提取;2)获取各功能的实际业务量;3)性能指标计算:正常场景TPS=(请求数*0.8)/(运行时间*0.2)(28原则);峰值场景TPS=峰值请求数*系数/峰值时间

        三、竞品分析,获取同类型软件的性能指标/历史运营数据

7. 负载测试

       概念:测试系统所能够承受的最大负载量(压力)是否满足产品设计要求。

        怎么做:1)逐步增加系统负载;2)满足系统的性能指标;3)测试系统所能够承受的最大负载量

8. 性能测试工具Jmeter与Loadrunner对比

        相同点:都可以模拟大量用户;都能支持多协议;都有监控及分析报表功能

        不同点:1)模拟用户量L比J多;2)分析报表:L精确到秒,J是分钟;3)IP欺骗:L支持IP欺骗,J不支持;4)L收费,J免费;5)软件大小:L大,J小;6)可扩展性:L不能扩展,J由扩展组件

9. Jmeter的元件与组件

        元件:多个类似功能组件的容易(类似于类)

                取样器:发送请求

                逻辑控制器:控制语句的执行顺序

                前置处理器:对请求参数进行预处理

                后置处理器:对响应结果进行提取

                断言:检查接口的返回结果是否与预期结果一致

                定时器:设置等待

                测试片段:封装一段代码,供其他脚本调用

                配置元件:测试数据的初始化配置

                监听器:查看Jmeter脚本的运行结果

        组件:实现独立的某个功能(类似于方法)

10. Jmeter发送HTTP请求

        HTTP请求取样器:

                作用:想服务区发送http请求

                位置:线程组--取样器--http请求

        发送GET请求(请求参数在路径中):

                取样器:请求URL:协议、服务器域名或者IP、端口、方法GET、路径、编码格式

                        请求参数:1)在路径还添加请求参数;2)在参数列表中添加请求参数

                消息体管理器:请求头:请求头名称、值

        发送POST请求(请求参数在消息体数据中):

                取样器:请求URL:协议、服务器域名或IP、端口、方法POST、路径、编码格式

                        请求参数:1)在消息体数据中添加请求体(form/json);2)在参数列表中添加参数(form)

                消息体管理器:请求头:请求头名称、值

11. 响应结果出现乱码

        1)找到JMETER安装目录下的bin目录

        2)找到jmeter.properties文件修改sampleresult.default.encoding=UTF-8

        3)重启JMETER

12. JSON断言

        作用:对HTTP请求的JSON格式的响应结果进行断言

        位置:HTTP请求--断言--JSON断言

        需填写参数:Assert JSON Path exists(填写:实际结果-json路径)

                              Additionally assert value 勾选

                              Expected Value 填写(期望结果)

13. 响应断言

        作用:对HTTP请求的任意格式的响应结果进行断言

        位置:HTTP请求--断言--响应断言

        断言设置:测试字段(要检查的项,实际结果)

                          模式匹配规则(比较方式)

                          测试模式(预期结果)

14. 聚合报告-监控性能指标

        聚合报告可以收集性能测试结束后,系统的各项性能指标。包括:响应时间、吞吐量、错误率

15. 第三方插件下载

        首先要下载插件管理器:1)下载包管理工具jar包;2)将包管理工具jar包添加到Jmeter放入到lib\ext目录下;3)重启Jmeter

        然后就可以安装第三方插件了:1)工具栏点击选项,选择Plugins Manager插件管理器;2)选择Available Plugins;3)选择所需插件下载

16. PerfMon组件监控资源指标

        作用:用于监控服务端的性能资源指标的工具,包括cpu、内存、磁盘、网络等性能数据

        原理:需要在服务器端安装监听服务程序,启动并收集资源指标,使用PerfMon总资源指标并展示

        监控服务器资源指标步骤:

                1)下载安装包ServerAgent,链接:http://github.com/undera/perfmon-agent;

                2)上传到服务器上,并解压ServerAgent;

                3)启动,如果是windows运行startAgent.bat,如果是linux运行startAgent.sh

                        【可选】指定端口运行:java -jar ./CMDRunner.jar --tool PerfMonAgent --udp-port 4444 --tcp-port 4444

                4)启动这个工具后,jmeter的插件jpgc-PerfMon Metrics Collector就可以收集服务端的资源使用率,并在jmeter中查看了

        注:当出现以下情况,可能是你的ServerAgent没有启动

17. 线程组参数说明

        作用:线程组就是控制Jmeter执行测试的一组用户,可以模拟多人操作

18. 性能测试环境搭建特点

        1)独占性

        2)尽量保证性能测试环境与真实生产环境的一致性:

                硬件环境(找运维):包括服务器配置、网络环境等;当硬件环境不足时,需要进行数据的等比缩放

                软件环境(找开发):版本一致性和配置一致性,包括操作系统、数据库、被测应用程序、第三方软件

                使用场景的一致性(测试自己准备):基础业务数据的一致性;业务操作模式的一致性:尽量模拟真实场景下用户的使用情况

19. 构造性能测试数据

        重要性:测试数据尽量与生产环境中数据量一致,才能更真实的模拟用户的实际业务场景

        构造方式(python):导包pymysql--连接数据库--创建游标--执行SQL语句--关闭游标--关闭连接

import pymysql
connect = pymysql.Connect(host='localhost',port=3306,user='root',password='',database='tinyshop',charset='utf8')
cursor = connect.cursor()
sql = "INSERT INTO `tinyshop`.`tiny_user`(`id`, `name`, `password`, `email`, `head_pic`, `validcode`, `status`) VALUES ({}, '{}@qq.com', 'ab7bac8728f1346bcb834d825749d5ca', '{}@qq.com', NULL, ',dpMNE<~', 1);"

for i in range(1,100):
    id = '100'+str(i)
    name = 'demo'+id
    email = 'demo'+id
    cursor.execute(sql.format(id,name,email))

cursor.close()
connect.close()

20. 生成随机函数Random

        为了模拟不同用户登录系统,需要将登录时的用户名参数化,每次使用不同的用户名登录。

21. Json提取器

        作用:对Json格式的响应结果数据进行提取

        参数说明:

                Name of created variables:存放提取出的值的参数名称,后续引用时:${参数名}

                Json Path expressions:Json路径的表达式,$.data.token

                Match No:如果Json路径匹配出许多结果,则可以选择哪一个。0表示随机,-1表示所有结果,1表示第一个结果

22. 常数吞吐量定时器

        作用:让Jmeter按指定的吞吐量执行,以每分钟为单位

        参数介绍:目标吞吐量表示每个用户每分钟发送的请求数

23. 压力测试

        在强负载下的测试,查看系统在峰值情况下是否具有功能隐患、系统是否具有良好的容错能力和可恢复能力。

        压力测试就是负载测试的延续,在满足系统日常性能指标下,进一步增加负载,已验证峰值情况下的系统处理能力。

24. HTTP请求默认值

        作用:高效维护http请求的IP/port信息,对http请求中的公共部分进行统一设置

        位置:测试计划--配置元件--HTTP请求默认值

25. 计数器

        作用:创建一个计数工具,可循环计数,并且生成的计数值在线程组内可以应用

26. 事务控制器

        作用:将多接口串联的场景自动的分类,更易于分类识别整个场景的响应时间

        任何添加:1)将所有HTTP请求添加到事务控制器的子节点下;2)勾选‘Generate parent sample’

27. 并发测试

        在极短时间内,发送多个请求,来验证服务器对并发的处理能力

28. csv数据文件设置

        作用:让不同用户在多次循环时,可以从数据文件中提取到不同的值

29. 同步定时器

        作用:阻塞线程,当在规定的时间内到达一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大压力。

        参数说明:

                模拟用户的数量:表示同时释放的线程数的数量

                超时时间:表示多少毫秒之后同时释放制定的线程数;设置为0时,该定时器将会等待线程数达到了设置的线程数才释放,若没达到会一直死等;设置大于0时,那么如果超过Timeout中设置的最大等待时间还没到达设置的线程数,则会不再等待,立即释放已有的线程数。

30. 稳定性测试

      在服务器稳定运行(用户正常的业务负载下)的情况下,进行长时间测试,并最终保持服务器能满足线上业务需求。  

        用户正常的业务负载:1)用户进行的主要业务操作;2)每种业务操作的并发/负载量

31. HTML测试报告

        作用:Jmeter支持生成HTML测试报告,以便从测试计划中获得图表和统计信息。

        命令:jmeter -n -t [jmx file] -l [result file] -e -o [html report folder]

        参数描述:-n:非GUI模式执行Jmeter;-t  [jmx file]:测试计划保存路径及.jmx文件名;-l [result file]:保存生成测试结果的文件,jtl文件格式;-e:测试结束后,生成测试报告;-o [html report folder]:存放生成测试报告的路径

        注:如果执行命令时,result file和 html report folder已存在,必须先删除。

32. 性能分析和调优

        确定问题:测试人员确定是否存在性能问题

        确定原因:开发人员对问题进行分析,找出问题产生的原因(服务器资源瓶颈、JVM瓶颈、数据库瓶颈、程序内部实现机制、压测机瓶颈)

        给出解决方案:开发人员确定调整目标和解决方案(增加硬件资源配置、修改服务器参数配置、修改代码)

        验证问题:测试人员按照给出的解决方案,重新进行回归测试

        分析调优结果:开发和测试人员分析问题的性能指标是否有题提升,关注其他指标未下降

33. 服务器资源瓶颈

        CPU瓶颈:每个程序运行都需要占用CPU,CPU使用率过高时运行速度会下降。CPU可以分为用户态、系统态和空闲态。用top命令查看

        内存瓶颈:内存不足时,操作系统会使用虚拟内存,从虚拟内存读取数据,影响处理速度。用free命令查看内存使用率,用vmstat命令查看虚拟内存使用情况

        磁盘I/O瓶颈:磁盘I/O繁忙,导致执行时在I/O出等待。使用iostat命令查看IO等待和IO队列的时间占比

        网络瓶颈:网络传输速度对比总带宽占比较大时,就会造成网络传输时间长

34. 数据库瓶颈

        慢查询:帮助定位查询速度较慢的SQL语句

                查看慢查询参数:show variables like 'slow_query%'; 慢查询日志开启状态

                                             slow_query_log_file:慢查询日志存放位置

                                             long_query_time:慢查询时长设置

                开启慢查询并配置:set global slow_query_log='ON'; 开启慢查询日志

                                                set global slow_query_log_file='path'; 设置慢查询日志存放位置

                                                set global long_query_time=1; 设置慢查询时间标准

        数据库连接池:负责分配、管理和释放数据库连接,允许应用程序重复使用一个现有的数据库连接, 而不是新建一个,这样可以提高对数据库操作的性能

                当客户请求数据库连接时的4种情况:1)首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;2)如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没有达到就重新创建一个连接给请求的客户;3)如果达到就按设定的最大等待时间进行等待;4)如果超出最大等待时间,则抛出异常

                查看最大连接数:show variables like '%max_connections%';

                查询已建立连接数:show status like 'Threads_connected';

        数据库死锁:Mysql主要有两种锁:表级和行级。表级锁针对整张表进行加锁,行级锁针对表中的一行记录进行加锁。

                死锁是指两个或两个以上的进行在执行过程中,因争夺资源而造成的一种相互等待的现象。若无外力作用,它们都将无法推进下去,此时称为系统处于死锁状态或系统产生了死锁,表级锁不会产生死锁。

                初步确定死锁:show processlist;

                手动杀死死锁:kill process_id;

35. JVM内存分析

         定义:java虚拟机在执行Java程序的过程中所管理的不同的内存数据区域,可分为堆内存和非堆内存。非堆内存是保存虚拟机自己的静态数据,存放加载的Class类级别静态对象,如类、方法等;堆内存是存放new关键字创建的对象,所有对象实例以及数组都在堆上分配。

        JVM堆内存管理机制(垃圾回收机制):1)年轻代存储“新生对象”,我们新创建的对象存储在年轻代中;2)当年轻内存占满后,会触发Minor GC,清理年轻代内存空间;3)老年代存储长期存活的对象和大对象,年轻代中存储的对象,经过多次GC后仍存活的对象会移动到老年代中存储;4)老年代空间占满后,会触发Full GC,Full GC是清理整个堆空间,包括年轻代和老年代。

        常见问题:1)内存泄漏,内存泄漏是指程序在申请内存后,无法完全释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光;2)内存溢出:内存溢出是指程序在申请内存时,没有足够的内存空间供其使用。内存泄漏最终会导致内存溢出。

36. JVM内存监控

        使用本地jvisualvm远程监控服务器:1)添加应用程序启动参数,并启动服务;2)进入本地jdk安装目录bin目录,找到jvisualvm.exe并启动;3)右键“远程”选择“添加远程主机”,并输入主机IP;4)右击主机选择“添加JMX连接”,输入JMX端口

        启动参数:java -server -Dfile=UTF-8 -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=服务器IP -Dcom.sun.management.jmxremote.port=10086(端口号) -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar jar包所在目录(litemall-all-0.1.0-exec.jar) &

37. 压测机瓶颈

        Jmeter分布式原理:分布式测试时,选择其中一台作为控制机,其他作为代理机。执行时,控制机会把指令下发到每台代理机上;代理机收到指令后开始执行,代理机执行时不需要启动Jmeter界面;执行完成之后,代理机会把结果回传给控制机,控制机会收集所有代理机的信息并汇总。

        配置--修改bin/jmeter.properties文件:

                代理机:修改服务端口,保证每个代理机都能正常启动,如果是在同一台机器上演示,需要使用不同的端口,将server_port=2999进行修改

                              将rmi_ssl设置为禁用,server.rmi.ssl.disable=true

                控制机:配置代理机远程地址,配置每个代理机的IP+port,多个代理机之间用 ‘,’ 连接,如remote_hosts = 127.0.0.1:8080,127.0.0.1:8081

                               将rmi_ssl设置为禁用,server.rmi.ssl.diable=true

38. 性能测试报告内容

        测试过程回顾--测试目的、测试范围、测试环境、测试使用的工具

        测试问题记录及结果分析--性能测试过程中遇到的问题,分析过程和解决方案

        测试结论

        经验总结和教训

39. grafana监控平台

        无界面压测中进行实时监控,grafana+influxdb+jmeter组合

        优点:实时、美观、能够存储和对比

        原理:1)运行jmeter时,会将数据写入influxdb中;2)influxdb实时存储执行的结果;3)grafana连接influxdb,将数据转成图表形式展示。

        安装influxdb及部署:

                1)下载并解压

                2)修改配置文件:influxdb.conf

                        修改bind-address="0.0.0.0:8088"

                        修改[[graphite]]中的 enable=true   database="jmeter"

                3)启动influxdb

                        influxd -- config influxdb.conf

                        查看influxdb的ip地址和接口:influx 即启动influxdb命令

                4)使用influxdb创建数据库

                        create database name

                在jmeter脚本中增加后端监听器来连接influxdb

                 执行无界面压测,并查看jmeter数据库中是否有数据

                        select * from jmeter

        下载安装grafana,打开grafana界面,在Configuration中选择data sources来增加数据源,配置连接的url,之后点击保存,如果出现数据源正在工作,则表示连接成功

         之后可以配置仪表盘样式,在Dashboards中选择Browse,点击import,去grafana中选择合适的版本ID,之后即可

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值