昨天,破冰分享主题是“性能测试”,对于我这个还没有接触过性能测试的人来说,真的是充满了膜拜,于自己而言,一头雾水……需要补充的知识有好多……
1.需要了解的基础知识
HTML语言基础:比如post请求、元素、属性、链接、表单、url等都需要了解
C语言基础:后期使用Loundrunner,它有些东西是基于c语言写的,基本的知识即可
http协议:后期要对接口做性能测试,了解http请求,如get、post请求,请求返回的状态码,请求报头信息等
xml:与html类似
JSON:如post请求,其中都是用json传输数据
数据库:增删改查,操作后要确认数据是否正常
2.性能测试基础介绍
(1)性能测试重要性与功能测试区别
从功能测试向性能测试转变的时候,需要注意的是:需要把功能测试的思想去掉,往性能测试上转换
(2)性能测试分类
负载测试:看一下系统指标达到的极限,达到哪个极限的时候系统处于饱和的状态
压力测试:有时候也叫强度测试,cpu、内存都在100%使用的情况下,系统处理各自任务的能力,是否会出现错误
并发测试:用户同时向一个应用发送请求,看系统多久可以将并发的数据完成
配置测试
可靠性测试
(3)多角度看待性能
没有一个准确的标准,从不同的角度看,解释就不一样.
从用户来看,软件性能就是软件对于用户操作的响应时间;从运维的角度看,软件性能表现在系统是否能够提供给用户稳定、可靠的服务;从开发角度看,软件性能表现在如何通过调整代码的设计和实现,使其达到最高。
角度不一样,性能的理解是不一样的,不一定都是提高软件的运行速度,如银行软件,并不要求速度高,需要的是稳定运行,保证数据不出错
需要站在不同的角度看
(4)性能测试主要术语
并发数:也叫做虚拟用户数,在同一时间点向系统发送产生的交互数量,如12306抢票,八点开始抢,八点整大家一起开始抢票,如果有100个人正在抢,那这个100就是一个并发数
注册用户数:指当前系统中全部注册的用户数量,和并发数不一样,并发数指和系统产生交互操作的数量,注册数量只是注册,并没有产生交互
在线用户数:当前系统时间段内,登录系统的用户数量,但在线用户数并不一定都和系统产生了交互
事务:比如登录网站,输入用户名、密码、点击登录,这三个操作就可以看成一个事务,即登录事务
TPS:每秒通过的事务数,即每秒处理的事务数量,它是衡量系统处理能力的重要指标
吞吐量:比如被测系统所产生的数据流量,点击网页,网页是10M,这10M就是产生的数据流量,如果有10个人点击,那就是10*10的数据流量,即为网页的吞吐量
每秒点击率:客户端每秒真正发给服务端请求的数量,比如有个接口,每秒向这个接口发送多少请求,这个不能反映系统的性能,只能反映客户端向服务端发送请求的数量
思考时间:用户访问这个网页的停顿时间,比如输入用户名和密码,要确定用户名和密码是否正确,这个等待时间就叫做思考时间
资源利用率:如cpu占用率,内存使用率,IO等使用率和时间,需要后台监控,才能看出来
3.性能测试流程
一般写性能测试脚本时,要进行的操作:
需求分析,测试点提取(分析后,要对哪些功能进行性能测试,比如是要求网页的tps达到1000还是2000,还是说吞吐量达到多少;上面所说的性能指标,每一个性能指标就是一个测试点,究竟要测试哪一个,这里就要确定;如何提取测试点:一般参考历史数据,历史上测试点有哪些;客户提出的;参考同行业、通项目性能测试的指标;业界通用的规则,大家都达到的一个性能指标)
指标的评估:比如tps,要达到多大值,如果是新系统,会以自己测试标准为准或者内部制定标准,以这个标准为起点进行性能测试,循序渐进,慢慢提高
制定计划:制定好后,和其他组进行评估,如果没评估通过,继续制定,如果通过了,就进行下一步
搭建测试环境,编写用例,执行用例,调试用例,调试完查看是否达到要求
4.测试框架体系
(1)LoundRunner
Loundrunner:分为三个小的功能点,即三大组件:编写代码组件、场景组件、分析组件
编写代码组件、场景组件、分析组件都要使用起来,一般都是先把脚本写好,去掉脚本中没用的信息,再进行场景设计,如每隔多少秒添加一个用户,登录场景:每隔多少秒登录多少个用户,多长时间达到一个最大用户数,中途连续执行多长时间,达到连续时间后每隔多少秒减少多少用户,多长时间把最大用户减为0,跑完后就会有个报告,然后用分析组件进行分析,便会产生一些参数值或信息
不要指望软件就会提供系统的性能问题,性能指标都是人工分析出来的,软件永远不会提供,性能测试并不是对性能测试工具的了解,而是长期的经验积累。
Loundrunner也可以做接口性能测试。
(2)Jmeter
主要做接口性能测试。可以单独做接口测试,也可以做接口性能测试
资源利用率:IO利用率、内存、cpu利用率,如果服务器是linux的,需要在linux服务器下添加插件,监控系统的指标,跑性能测试脚本的时候(shell脚本或插件),会将这段时间的cpu等的指标收集起来,Jemeter/Loundrunner生成的报告和linux监控信息综合起来,具体确定哪个地方会产生问题
常用的:Jenkins+Jmeter+Ant
(3)Soapui
(4)Linux
(5)服务器中间件调优
tomcat、appach、ant等,主要是一些配置文件的优化,如果会appach优化,tomcat也就会了,参数大多数是一样的,比如请求数、最大链接数
MaxRequestsPerChild:每个子进程在其生存期内允许伺候的最大请求数量,默认为10000。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。
中间件配置优化,并不是某些参数配的越高越好,讲究一个平衡,各个参数平衡,才能最优
(6)数据库:mysql优化
抓取大范围,牵扯小范围。如:mysql下,把慢查询打开,查到10条,挑出一条最慢的,进行分析,是没做索引?还是链接太长?一般是先加索引,如果还没有优化,便可以把它拆开,并不是所有的sql语句都要放到后端处理,可以拆开一部分放在前端,前端处理完后,传给后端,减轻了后端服务器的压力
一般的做法是:分库分表;多库多表;主从分离
(7)JVM调优
了解java基础知识:年轻代、年老代、持久代分清楚,java配置文件中有这几个代的占用内存大小的配置;jc,什么叫jc,jc是java中独有的管理垃圾回收的策略,系统自动执行,如果有些类、方法加载后,长期不使用,便会触发jc垃圾处理机制
jc内存泄露:监控jvm中年轻代、年老代以及类的占用内存大小的时候,如果看到一些内存信息被占用的越来越大,那就有可能存在内存泄漏了
一般jc之后,年轻代、年老代的内存占用率会回到一个很低的值,然后再慢慢加,加到一定程度,又会触发jc,再回到一个低点,如果很有规律,基本没有内存泄漏
一般系统运行很久之后,才能看出是否存在内存泄漏
jprofiler_windows:检测内存泄漏工具,可以模拟出当前代码是否存在内存泄漏
(8)项目+框架
每个网站刚开始做并不是就有一个很好的优化框架,都是一点点调优,网页结构最初都是web服务器、数据服务器、文档服务器组成
web数据从数据库直接读写,支撑不了了再加入一些静态数据库缓存,web服务器端和数据库服务器端加入cach缓存,如ridis,数据服务器就升级了
继续发展,流量增加、点击量增加,没法支撑,便会考虑部署集群,集群部署简单说就是多加几台服务器,这时候就牵扯到负载均衡,它来控制浏览数据的时候到哪个服务器上取数据
数据库越来越大,查询效率低,便会进行数据库分离,如分库分表、多库多表等,一般分为水平切分和垂直切分
不同业务存放到不同数据库,减轻压力,比如将经常用到的放到数据库A上,用的很少的放到数据库B
疑问解答
(1)数据库出现性能问题,一般有哪些原因组成:
答:锁表,锁表并不能影响性能,因为都无法进行操作,锁表不属于性能方面问题。一般都是索引设置不好,语句拼写太长,各种查询条件太多
(2)性能测试推荐书籍
答:如果没有基础,淘宝、京东随便找一本书都挺好的,先看一本。小强性能测试
性能测试,Jemeter、Loundrunner只是性能测试工具,比如Loundruner录制完,产生好多脚本,归根结底还是以接口的形式在向网站发送请求,所以一定要把接口弄明白
(3)Jemeter、Loundrunner、SoupUI都学会了,那应该怎么选择呢?什么情况下用?
答:webservice接口测试,可以选择soupui,基本不用编写代码
http协议的接口测试,建议使用jmeter、loundrunner
界面的性能测试,建议使用loundrunner
个人收获
(1)对于一个小白来说,只是听过性能测试这个名词,对它究竟怎么测?怎么衡量,需要哪些知识,根本没有概念,这次分享,真是涨知识了,开阔了自己的眼界。
(2)公司也是刚开始进行性能测试,现在也是在摸索阶段,之前开会听的时候有些东西因为没有概念,所以听别人讲起,只觉得很厉害,这次分享之后,自己也知道他讲的哪些是对的,哪些是错的了。
(3)对于性能测试,自己也知道如何下手了,先从掌握基础知识开始。