对于产品和技术型公司来说产品是根本,产品精品化是快速推进项目的重要指标,因此产品要体系化。我们公司产品已经形成了体系化,公司产品在一个个项目中不断迭代升级,逐渐成熟稳定,这对于我们公司来说是一个重要突破,也是以后发展的重要环节。
产品是否是精品要从很多角度评价,需要从功能性、易用性、扩展性、稳定性、高性能等不同维度考察,其中高性能是检测产品运行是否流畅的指标,产品在测试阶段压力性能测试是重要环节。
整体介绍
最近在完善集成底座项目流程,进行IDM压力测试,这就需要外围工具JMeter,本文既是通过JMeter对监控提醒功能性能的检验的介绍,也是对JMeter的介绍。
1.产品介绍
IDM产品叫做统一身份管理平台,主要用于解决企业5A功能的需求,5A主要包括:Account账号管理、Authentication认证管理、Authorization授权管理、Audit审计管理、Application Control应用管控。
IDM身份管理平台满足对企业信息系统的统一用户管理、统一身份认证、统一授权管理以及安全审计的要求,能够实现各业务系统的统一登录和集中访问,实现用户身份和权限的统一认证与授权管理,为企业不同的业务系统提供统一的用户管理和认证服务。
2.功能架构
IDM的功能架构主要是从5A管控的角度出发总结的架构模型,5A分别是统一认证、统一授权、统一账户、统一审计、统一应用管控,其中统一应用管控包含对各个应用系统账户的下发情况的管控(统一账户)、对当前业务系统的用户认证情况管控(统一认证)以及对当前系统的权限资源同步监控管控(统一权限)。
3.需求说明
本次性能测试的测试策略是使用JMeter结合IDM平台,通过模拟IDM统一认证登录跳转的运行,测试业务场景的事务响应时间和相关服务器的资源消耗情况,为客户提供一份完整的测试报告,本篇报告着重对云平台性能进行压测和记录结果,从并发量、稳定性两方面测试,确保功能服务达到实际生产标准。
JMeter介绍
通过上述描述,相信大家已经知道产品性能的重要性,在开发时不仅需要注意开发规范,产品性能测试也是必须要做的事情,开发功能要进行一次压测,压测需要工具,而工具就要用JMeter。
1.环境搭建
注:在安装JMeter之前,请先检查下电脑有没有装JDK:开始→运行→然后输入cmd→进入命令行界面,输入java -version , 出现以下信息就是此电脑已安装了JDK。
JMeter下载官网:http://JMeter.apache.org/download_JMeter.cgi
1.首先在JMeter官网下载一个压缩包,解压放到自己创建的文件夹路径下。
2.然后点击JMeter目录下bin文件夹里的JMeter.bat就可以打开JMeter,具体最后打开的界面如下:
当出现这个页面,就说明JMeter环境已经搭建好。
启动方式:
1.GUI启动(主要用于编写,调试脚本)双击JMeter.bat启动界面模式。
2.命令行启动(用于压力测试):
-h 帮助→打印出有用的信息并退出;
-n 非 GUI 模式→在非GUI模式下运行JMeter;
-t 测试文件→要运行的JMeter测试脚本文件;
-l 日志文件→记录结果的文件;
-r 远程执行→启动远程服务;
-H 代理主机→设置JMeter使用的代理主机;
-P 代理端口→设置JMeter使用的代理主机的端口号。
例如:
JMeter -n -t test1.jmx -l logfile1.jtl -H 192.168.1.1 -P 8080
3.远程启动(用于分布式压力测试)
a)编辑apache-JMeter-3.1\bin下JMeter.properties文件,多台ip用逗号隔开;
b)复制一份JMeter应用到配置ip的机器上,并启动apache-JMeter-3.1\bin下JMeter-server.bat作为slaver;
c)master上远程启动slaver。
2.功能说明
下图是需要调用请求操作:
选择线程组后右键添加,然后选择取样器:
1.序号1:填写协议:http、https。
2.序号2:要调用服务器的ip或者域名。
3.序号3:端口。
4.序号4:请求方法:get、post。
5.序号5:访问路径。
启动时要选择相关压测指标:
1.序号1:线程数,是添加并发多少。
2.序号2:时间,多长时间。
3.序号3:调用次数。
3.组件介绍
典型、常用组件介绍:
1.测试计划:是使用JMeter测试的开始,是其他元件的容器;通常根据项目来为测试计划重命名。
2.用户定义的变量:可以赋予动态获取值,使用${变量名} 引用。
3.线程组:用来设置发送请求的用户数,即并发数,还有线程的时间间隔、循环次数。
4.取样器(HTTP请求):填写HTTP请求的协议,方法以及参数。
5.监听器:负责收集测试结果,并给出结果显示方式,常用查看结果树和聚合报告。
6.控制器:结合采样器sampler使用,可以模拟复杂的请求序列;常见的分逻辑控制器,循环控制器以及事务控制器。
7.断言:用来判断响应结果是否如用户所预期的,自动化测试接口,基本上都要加断言来判断响应结果。
8.配置元件:主要是参数化中用到CSV Data Set Config。
9.前置处理器:负责在生成请求之前完成工作,常用来修改请求设置。
10.后置处理器:负责在生成请求之后完成工作,常用来处理响应数据,主要是在动态关联中用到后置处理器的正则表达式。
11.定时器:负责定义请求之间的延迟间隔。
12.参数化设置,两种类型:一种是利用函数助手中的_Random 函数进行参数化设置; 另一种利用配置元件中的CSV Data Set Config 进行参数化设置。
13.动态数据关联:在HTTP 请求的参数中会遇到一些参数的值是从服务器响应返回的动态数据,这些数据需要进行关联才能使得下一次请求能成功地被服务器接收。在JMeter中,采用正则表达式提取器来获取这些动态数据。
测试过程
JMeter是一款非常流行和受欢迎的开源性能测试工具,像LoadRunner一样,它也提供了利用本地Proxy Server(代理服务器)来录制生成测试脚本的功能。
1.数据准备
JMeter测试我们首先要准备测试所需要的数据,账户信息如下:
2.脚本录制
下面以CAS认证脚本为例:
1.右键[测试计划]-[添加]-[线程]-[线程组]。
2.右键[线程组]-[配置元件]-[HTTP信息头管理器]。
3.右键[线程组]-[配置元件]-[HTTP Cookie管理器]。
4.右键[线程组]-[配置元件]-[用户定义的变量]。
5.右键[线程组]-[配置元件]-[CSV Data Set Config](添加数据文件配置)。
6.右键[线程组]-[取样器]-[HTTP请求](填写跳转CAS登录地址)。
7.右键[HTTP请求]-[后置处理器]-[正则表达式提取器](这里添加两个正则提取器:提取lt和execution后面登录要用到)。
8.右键[线程组]-[取样器]-[HTTP请求](填写CAS登录地址:这里我们需要添加passWord、empCode、service三个参数其中passWord和empCode是从数据文件中提取出来的)。
9.右键[线程组]-[取样器]-[HTTP请求](填写CAS登录请求地址:这里我们用到username、password、lt、execution、_eventld这5个参数其中lt和execution是第一个cas登录入口中通过正则提取出来的)。
10.右键[测试计划]-[添加]-[监听器]-[察看结果树]。
11.右键[测试计划]-[添加]-[监听器]-[聚合报告]。
12.在HTTP测试脚本录制下,填写代理服务器的端口:
a)Target Controller 修改为: “Test Plan>Thread Group>Recording Controller”;
b)Grouping 修改为: “Put each group in a new controller”。
13.设置完成后,可点击[启动],开始脚本录制。
3.结果说明
1.[view Resuls Tree]中可查看每个线程的运行情况,包括请求和返回两部分。绿色的代表线程运行成功,红色的代表线程运行失败。
2.可在请求体中查看请求是否正确。
3.可在相应数据体中查看线程运行失败的原因,查看是否报错。
Sample:本次测试场景共运行了多少线程。
1.Average:平均响应时间。
2.Median:统计意义上的响应时间中值。
3.90% Line:所有线程中90%的线程响应时间都小于xx的值。
4.Min:最小响应时间。
5.Maximum:最大响应时间。
6.Error:出错率。
7.Throughput:吞吐量。吞吐量以”requests/second、requests/minute、requests/hour”来衡量。
CAS认证
CAS认证是传统的CAS拦截认证,通过页面的强制拦截跳转,实现统一认证的效果,但是这种访问具有侵入性,非常不友好,并且一部分企业除了IDM本身的登录情况并没用到CAS的登录认证。
1.认证流程
1.AuthenticationFilter:当用户访问应用时首先会被AuthenticationFilter拦截,判断assertion是否为空,如果为空会跳转到登录页面。
2.Cas20ProxyReceivingTicketValidationFilter:在登录页面输入用户名密码提交表单进行CAS认证返回ticket票据,被Cas20ProxyReceivingTicketValidationFilter拦截,通过TicketValidator中的validate方法校验ticket票据是否合法。
3.HttpServletRequestWrapperFilter:ticket票据校验通过后HttpServletRequestWrapperFilter会将用户信息放到AttributePrincipal对象中,然后将AttributePrincipal对象放到session中。
4.XXXUserCasFilter:应用中扩展UserCasFilter拦截器,从session中获取AttributePrincipal对象实现登录认证过程。
5.CAS认证报错原因主要为以下两方面:
a)网络不通请求不到。
b)ticket票据过期。
2.测试脚本
首先我们需要把线程数和循环次数以及Ramp-Up时间设置为1如下所示:
点击启动按钮进行脚本的测试。
点击查看结果树查看是否登录失败等问题。
3.测试结果
1.CAS认证500并发,5分钟,JMeter聚合报告:异常率正常,平均值正常,吞吐量666.5,详情如下:
2.CAS认证外网1000并发,5分钟,JMeter聚合报告:异常率正常,平均值正常,吞吐量774.4,详情如下:
3.CAS认证外网1500并发,5分钟,JMeter聚合报告:异常率正常,平均值正常,吞吐量729.8,详情如下:
4.CAS认证2000内网并发,5分钟,JMeter聚合报告:异常率正常,平均值正常,吞吐量1506.5,详情如下:
5.CAS认证3000内网并发,5分钟,JMeter聚合报告:异常率正常,平均值正常,吞吐量1103.9,详情如下:
Oauth认证
Oauth2.0接口是IDM集团认证所用的接口,如果业务系统在进场时不需要子公司、分公司进行访问,那么他们可以进行这个接口的认证对接。所以在对接之前需要明确业务系统是通过哪种方式来与我们对接的。
1.认证流程
1.用户在访问业务系统登录时发起认证请求,通过URL跳转的方式请求IDM身份管理平台认证界面,传入client_id、redirect_uri、response_type、state,IDM根据参数返回code及state;
注意:state为状态位参数,请求系统在传递调用页面跳转时将state存储缓存中,后续调用请求是先判断state是否在缓存中已经存在,如果存在则为有效请求。
2.系统发起请求传入参数client_id、client_secret、redirect_uri、grant_type及code(页面返回的code),IDM身份管理平台进行认证,返回access_token。
3.系统根据获取的access_token触发IDM身份管理平台认证,IDM认证成功后返回用户信息Profile,返回至用户登录成功。
2.测试脚本
首先我们需要把线程数和循环次数以及Ramp-Up时间设置为1如下所示:
点击启动按钮进行脚本的测试。
我们点击查看结果树一个一个查看是否有出错的节点。
3.测试结果
1.Oauth认证500并发5分钟,JMeter聚合报告:异常率正常,平均值正常,吞吐量2134.2,详情如下:
2.Oauth认证1000并发5分钟,JMeter聚合报告:异常率正常,平均值正常,吞吐量2003.7,详情如下:
3.Oauth认证1500并发5分钟,JMeter聚合报告:异常率正常,平均值正常,吞吐量1448.7,详情如下:
问题总结
一般来说性能调优有一个前提条件,就是可以让本身产品在正常运行下不会暴露出来的问题,通过这种压力测试的情况将问题扩大化、明显化,这种方式不仅是在为后续的工作排查问题,也能在排查调优的过程中发现产品的不足。
1.问题排查
当压测过程中出现问题时可以通过以下几个方面进行排查:
1.检查产品是否已经停止运行;
2.服务器的内存是否已经满载;
3.检查日志,报错信息是否记录到了日志中,针对于报错问题进行相关的排查;
4.如果在压测的过程中出现了问题但是服务器并没有崩溃,那么可以打开后台日志查看错误时的报错信息,针对于报错信息进行排查;
5.在压测过程中也可以检查mysql,查看是否有sql堵塞的情况,根据堵塞问题进行处理和排查;
6.最后如果都没有问题可以看率减轻并发量,可能是已经达到了服务器的瓶颈。
2.压测调试
1.检查数据库的连接数配置;
2.产品中数据库的连接数调大,保证压测时并发执行的数据量;
3.IDM的用户在线人数计算时间降低,保证在线人数的数量;
4.检查接口是否在对数据库进行读写,如果读写需要进行调整。
3.压测技巧
压力测试是有很多技巧的,例如本次的认证接口的压测,在压测过程中对日志表的读写量是非常大的,那么在每次重新测试时需要清空日志表,保证日志表的量,其次在压测过程中也要考虑到产品本身的使用情况、服务器的存储等等。由于是压测,所以这些东西涨起来是非常快的,可以在每次压测之前针对日志的记录及不必要的日志文件进行清除,保证服务器在一个优质的环境中运行。
1.实时查看IDM日志表,保证日志表的数据量。
2.调整产品日志写入级别。
3.数据库最大连接数和最小连接数调整。
4.对服务器参数进行优化。
5.清除没必要的压测日志记录。
心得总结
通过使用进行JMeter环境压测的过程中学到很多的知识也有了很多的感悟与认知,将自己的心得体会从以下几个方面进行总结。
1.知识收获
JMeter是一个比较强大的测试工具,可以便捷地为测试人员提供自动化测试脚本,减低人员的工作量,但是在业务环节、业务脚本创建、模拟的过程中需要经过全面的考虑、设计,需要针对不同业务场景进行测试设计,通过本次的压测学习中对JMeter有了新的认知,并了解了一些常用的组件并对其进行简单的应用。
2.意识形态
在新工具学习的时候首先要了解工具的用途,通过快速看、相关查的模式,迅速了解工具的使用说明及典型的应用场景;结合工具自身所带样例模式搭建,了解样例运行方式;自己进行基于样例的扩展或者自己学习配置使用,输出相关记录文档及学习心得,避免人工的大量投入及漏测、测错的情况。
3.能力提升
首先在工作中要拓宽自己的理论知识面,加强自己对理论知识的应用,在日常工作中,遇问题多查阅资料,熟悉相关知识,从而进一步地提高自己在工作中解决实际问题的能力。
努力提升业务素质和解决问题的能力,做到加强学习、更新观念,对待日常工作,不要总找借口,要从自身出发,不断加强学习更新观念,不断分析认识提高自己,改变不执行不作为的不良习惯,自动自发地做好本职工作。
在实际工作中,要更加积极主动地向领导请教遇到的问题,并多与同事们进行沟通,学习他们处理实际问题的方法及工作经验。通过多学、多问、多想来不断提高自己的实际工作能力。
本文由@数通畅联原创,欢迎转发,仅供学习交流使用,引用请注明出处!谢谢~