Jmeter聚合报告分析

Jmeter聚合报告分析电力线宽带
Label:每个 JMeter 的 element(例如 HTTP Request)都有⼀个 Name 属性,这⾥显⽰的就是 Name 属性的值
#Samples:表⽰你这次测试中⼀共发出了多少个请求,如果模拟10个⽤户,每个⽤户迭代10次,那么这⾥显⽰100
Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使⽤了 Transaction Controller 时,也可以以Transaction 为单位显⽰平均响应时间
Median:中位数,也就是 50%⽤户的响应时间
90% Line:90%⽤户的响应时间
Note:关于 50%和 90%并发⽤户数的含义,请参考下⽂
Min:最⼩响应时间
Max:最⼤响应时间
Error%:本次测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量——默认情况下表⽰每秒完成的请求数(Request per Second),当使⽤了 Transaction Controller 时,也可以表⽰类似 LoadRunner 的 Transaction per Second 数
KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
讲到测试,⼈们脑海中⾸先浮现的就是针对软件正确性的测试,即常说的功能测试。但是软件仅仅只是功能正确是不够的。在实际开发中,还有其它的⾮功能因素也起着决定性的因素,例如软件的响应速度。影响软件响应速度的因素有很多,有些是因为算法不够⾼效;还有些可能受⽤户并发数的影响。
在众多类型的软件测试中,压⼒测试正是以软件响应速度为测试⽬标,尤其是针对在较短时间内⼤量并发⽤户的访问时,软件的抗压能⼒。本⽂以 JMeter 为例,介绍了如何使⽤它来完成常⽤的压⼒测试:Web 测试、数据库测试和JMS 测试。
概述
JMeter 最早是为了测试 Tomcat 的前⾝ JServ 的执⾏效率⽽诞⽣的。到⽬前为⽌,它的最新版本是2.1.1,它的测试能⼒也不再仅仅只局限于对于Web服务器的测试,⽽是涵盖了数据库、JMS、Web S
ervice、LDAP等多种对象的测试能⼒。在最新的 2.1.1 中,它还提供了对于 JUNIT 的测试。
JMeter 的安装⾮常简单,从上下载,解压之后即可使⽤。运⾏命令在%JMETER_HOME%/bin 下,对于 Windows ⽤户来说,命令是 jmeter.bat。运⾏前请检查JMeter 的⽂档,查看是否具备相关的运⾏条件。对于最新版(即2.1.1),需要JDK的版本要求是JDK 1.4。
JMeter 的主要测试组件总结如下:
1. 测试计划是使⽤ JMeter 进⾏测试的起点,它是其它 JMeter 测试元件的容器。
2. 线程组代表⼀定数量的并发⽤户,它可以⽤来模拟并发⽤户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。
3. 负责收集测试结果,同时也被告知了结果显⽰的⽅式。
4. 逻辑控制器可以⾃定义JMeter发送请求的⾏为逻辑,它与Sampler结合使⽤可以模拟复杂的请求序列。
5. 断⾔可以⽤来判断请求响应的结果是否如⽤户所期望的。它可以⽤来隔离问题域,即在确保功能正确的前提下执⾏压⼒测试。这个限制对于有效的测试是⾮常有⽤的。
6. 配置元件维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。
7. 前置处理器和后置处理器负责在⽣成请求之前和之后完成⼯作。前置处理器常常⽤来修改请求的设置,后置处理器则常常⽤来处理响应的数据。
8. 定时器负责定义请求之间的延迟间隔。
JMeter的使⽤⾮常的容易,在 ONJava 上的⽂章提供了⼀个⾮常好的⼊门。
常⽤测试
压⼒测试不同于功能测试,软件的正确性并不是它的测试重点。它所看重的是软件的执⾏效率,尤其是短时间内访问⽤户数爆炸性增长时软件的响应速度,压⼒测试往往是在功能测试之后进⾏的。在实际的开发过程中,软件潜在的效率瓶颈⼀般都是那些可能有多个⽤户同时访问的节点。
就⽬前 Java EE 的平台下开发的软件来说,这种节点通常可能是:Web 服务器、数据库服务器和 JMS 服务器。它们都是请求主要发⽣的地点,请求频率较其它的节点要⾼,⽽且处于请求序列的关键路径之上。如果它们效率⽆法提⾼的话,对于整个软件的效率有致命的影响。⽽且在这些节点上⼀般都会发⽣较⼤规模的数据交换,有时其中还包含有业务逻辑处理,它们正是在进⾏压⼒测试时⾸先需要考虑的。
本⽂以这三种节点为例,介绍如何使⽤ JMeter 来完成针对于它们的压⼒测试。
Web 服务器
对于⼤多数的项⽬来说,并不会⾃⾏开发⼀个Web 服务器,因此Web 服务器压⼒测试的对象实际就是--发布到Web 服务器中的软件。最简单的Web 测试计划只需要三个 JMeter 的测试元件,如下图:
其中:
在线程组中定义线程数、产⽣线程发⽣的时间和测试循环次数。
htc a310在http 请求中定义服务器、端⼝、协议和⽅法、请求路径等。
表格负责收集和显⽰结果。
这种设置对于包含了安全机制的 web 应⽤是不够的,典型的 web 应⽤⼀般都会:
1. 有⼀个登录页,它是整个应⽤的⼊⼝。当⽤户登录之后,应⽤会将⽤户相关的安全信息放到session 中。
2. 有⼀个 filter ,它拦截请求,检查每个请求相关的 session 中是否包含有⽤户安全信息。如果没有,
那么请求被重定向到登录页,要求⽤户提供安全信息。
在这种配置下应⽤上⾯的测试计划,那么除了登录页之外的其它请求都将因为缺少⽤户安全信息,⽽使请求实际定位到登录页。如果不加断⾔,那么在看来所有的请求都是成功。⽽实际上,这些请求最终都没有到达它们应该去的地⽅。显然,这种测试结果不是我们所期望的。
为了成功的测试,⾄少有2种⽅法:
⽅法⼀,去掉程序的安全设置,如filter ,使得不需要⽤户安全信息也能访问受限内容;
⽅法⼆,不修改程序,使⽤JMeter 提供的"Http URL 重写修饰符"或"Http Cookie 管理器"。
对于第⼀种⽅法,有其局限性:
需要修改程序配置,如去掉l 中关于安全filter 的设置。需要维护多个版本的l ,如压⼒测试和功能测试分别各⾃的l ,增加了维护成本,⽽且有可能会在测试之后忘记将l 修改回来。对于⼀些需要⽤户安全信息的页⾯⽆能为⼒,如某些业务审计操作需要⽤户安全信息来记录。因为缺少这样的信息,注定了测试的失败。如果解决为了这个问题进⼀步的修改程序,那么因为存在多个版本的程序,那么其维护难度将⼤⼤增加。虽然,第⼆种⽅法配置难度增加了,但是它不⽤修改程序。⽽且还可将测试计划保存成⽂件,以便重复使⽤。因此,选⽤第⼆种⽅法是较为理想的做
法。下⾯以⼀个简化的例⼦说明使⽤⽅法⼆的配置步骤。
1. 例⼦由以下⼏个⽂件组成:
AuthorizenFilter.java ,过滤器负责检验session 中是否存在⽤户信息。如果没有,那么就转向到login.jsp 。它的主要⽅法 doFilter 内容如下:
public void doFilter(ServletRequest request,                    ServletResponse response,                    FilterChain chain)                    throws IOException, ServletException {    HttpServletRequest req = (HttpServletRequest)request;    HttpServletResponse res = (HttpServletResponse)response;    HttpSession session= Session();    User user = (Attribute("user");    if(null == user){        String uri= RequestURI();        //如果请求页是登录页,不转向        if( uri.equalsIgnoreCase("/gWeb/login.jsp")){            chain.doFilter(request, response);  } else{            res.sendRedirect("/gWeb/login.jsp");  } }else{        chain.doFilter(request, response);    }    }User.java ,⽤户类负责记录⽤户的信息。为了简化,这⾥的登录操作只允许指定⽤户名和密码。主要内容如下:
public class User { private String user; private String pwd; public User(String user, String pwd) {  this.user = user;  this.pwd = pwd; } public boolean login(){  return user.equals("foxgem") && pwd.equ
als("12345678"); } public String getUser() {  return user; } public void setUser(String user) {  this.user = user; }}
Login.jsp 和welcome.jsp 。其中 login.jsp 负责⽣成 User 对象,并调⽤ User 的login 。当 login 返回为true 时转向到 welcome.jsp 。其验证部分的代码:
<%  if( Parameter("Submit") != null) {  User ur= new User( Parameter("user"), Parameter("pwd"));      if( ur.login()){        session.setAttribute("user", ur);        response.sendRedirect("/gWeb/welcome.jsp");      } else{        session.setAttribute( "LOGIN_ERROR_MSG", "⽆效的⽤户,可能原因:⽤户不存在或被禁⽤。");        response.sendRedirect("/gWeb/index.jsp");        return;      }  }%&l ,配置 filter 拦截所有访问 JSP 页⾯的请求:
<filter>    <filter-name>authorizen</filter-name>    <filter-class>org.foxgem.jmeter.AuthorizenFilter</filter-class></filter><filter-mapping>    <filter-name>authorizen</filter-name> <url-pattern>*.jsp</url-pattern></filter-mapping>
2. 创建如下结构的Web 测试计划:
其中主要测试元件说明如下:
http 请求默认值负责记录请求的默认值,如服务器、协议、端⼝等。
第⼀个http 请求,请求login.jsp ,并附加验证所需要的参数
(user=foxgem ,pwd=12345678,Submit=Submit );其包含的响应断⾔验证url 中包含"welcome.jsp",这⼀点可以从程序中反应。第⼆个http 请求,请求是welcome.jsp ;其包含的响应断⾔验证响应⽂本中包含"foxgem",它是welcome.jsp 页⾯逻辑的⼀部分。http cookie 管理器负责管理整个测试过程中使⽤的cookie ,它不需要设置任何属性。
循环控制器设置发送第⼆个请求的循环次数,表格负责收集和显⽰第⼆个请求的测试结果。启动测试计划之后,执⾏的顺序是:⾸先,第⼀个请求登录页进⾏登录;成功登录之后,使⽤循环控制器执⾏第⼆个请求。请求welcome.jsp 时,响应断⾔⽤来验证是否确实是welocme.jsp 来处理请求,⽽不是因为其它页。在这个测试计划中需要注意的是http cookie 管理器。正是由于它的作⽤,使得第⼆个请求能顺利的发送到welcome.jsp 进⾏处理,⽽不是因为缺少⽤户安全信息转发到login.jsp 。在这个例⼦中,我们并没有在程序中使⽤cookie (使⽤的是session ),那么http cookie 管理器怎么会起作⽤呢?这是因为在servlet/jsp 规范中对于session 的状态跟踪有2种⽅式:
使⽤cookie ,保留和传递sessionid 。它不要求程序对于url 有什么特殊的处理,但是要求浏览器允许cookie 。在这个例⼦中,就是这种情形。使⽤url 重写,每次显式的在浏览器和服务器之间传递sessio
nid 。它要求程序对url 进⾏编码,对浏览器没有要求。
对于第⼆种情形,可以使⽤JMeter前置管理器中的http url重写修饰符来完成。对于Tomcat,Session 参数是jsessionid,路径扩展使⽤";"。使⽤url编码时需要注意,必须将浏览器的cookie功能关闭。因为url编码函数,如encodeURL,会判断是否需要将sessionid编码到url中。当浏览器允许cookie时,就不会进⾏编码。
如果cookie⽽不是session来保存⽤户安全信息,那么直接使⽤http cookie管理器就⾏了。此时,需要将使⽤的cookie参数和值直接写到管理器中,由它负责管理。对于其它的cookie使⽤,也是如此操作。
登录问题解决之后,对于 Web 服务器的测试就没什么难点了。剩下的就是根据实际需要,灵活运⽤相关的测试组件搭建编写的测试计划。(当然,对于安全问题还有其它的使⽤情景。在使⽤时需要明确:JMeter 是否⽀持,如果⽀持使⽤哪种测试组件解决。)
数据库服务器
数据库服务器在⼤多数企业项⽬中是不可缺少的,对于它进⾏压⼒测试是为了出:数据库对象是否可以有效地承受来⾃多个⽤户的访问。这些对象主要是:索引、触发器、存储过程和锁。通过对于SQL语句和存储过程的测
试,JMeter 可以间接的反应数据库对象是否需要优化。
JMeter 使⽤ JDBC 发送请求,完成对于数据库的测试。⼀个数据库测试计划,建⽴如下结构即可:
其中:
JDBC连接配置,负责配置数据库连接相关的信息。如:数据库url、数据库驱动类名、⽤户名和密码等等。在这些配置中,"绑定到池的变量名"(Variable Name Bound to Pool)是⼀个⾮常重要的属性,这个属性会在JDBC请求中被引⽤。通过它, JDBC请求和JDBC连接配置建⽴关联。(测试前,请将所需要的数据库驱动放到JMeter的classpath中)。
JDBC请求,负责发送请求进⾏测试。发电机集电环
图形结果,收集显⽰测试结果。
在实际的项⽬中,⾄少有2种类型的JDBC请求需要关注:select语句和存储过程。前者反应了select语句是否⾼效,以及表的索引等是否需要优化;后者则是反应存储过程的算法是否⾼效。它们如果效率低下,必然会带来响应上的不尽如⼈意。对于这两种请求,JDBC请求的配置略有区别:
Select语句
存储过程
如果对于Oracle,如果测试的是函数,那么也可以使⽤select语句来进⾏配置,此时可以使⽤:select 函数(⼊参) from dual形式的语句来测试,其中dual是oracle的关键字,表⽰哑表。对于其它⼚商的数据库产品,请查⼿册。
JMS服务器
MOM 作为消息数据交换的平台,也是影响应⽤执⾏效率的潜在环节。在 Java 程序中,是通过 JMS 与 MOM 进⾏交互的。作为 Java 实现的压⼒测试⼯具,JMeter 也能使⽤ JMS 对应⽤的消息交换和相关的数据处理能⼒进⾏测试。这⼀点应该不难理解,因为在整个测试过程中,JMeter 测试的重点应该是消息的产⽣者和消费者的本⾝能⼒,⽽不是MOM本⾝。
根据 JMS 规范,消息交换有2种⽅式:发布/订阅和点对点。JMeter针对这两种情形,分别提供了不同的Sampler进⾏⽀持。以下MOM我们使⽤ActiveMQ 3.2.1,分别描述这两种消息交换⽅式是如何使⽤ JMeter 进⾏测试。
1. 测试前的准备(两种情况都适⽤)
JMeter 虽然能使⽤ JMS 对 MOM 进⾏测试,但是它本⾝并没有提供JMS需要使⽤的包。因此,在测
试之前需要将这些包复制到 %JMETER_HOME%/lib 下。对于 ActiveMQ 来说,就是复制 %ACTIVEMQ_HOME%/lib。
%ACTIVEMQ_HOME%/optional 是可选包,可根据实际情况来考虑是否复制。
JMeter 在测试时使⽤了 JNDI,为了提供 JNDI 提供者的信息,需要提供 jndi.properties。同时需要将 jndi.properties 放到 JMeter 的 classpath 中,建议将它与 bin下的 ApacheJMeter.jar 打包在⼀起。对于 ActiveMQ,jndi.properties 的⽰例内容如下:
java.naming.factory.initial = org.activemq.jndi.ActiveMQInitialContextFactory
手动注油器java.naming.provider.url = tcp://localhost:61616
#指定connectionFactory的jndi名字,多个名字之间可以逗号分隔。
#以下为例:
#对于topic,使⽤(TopicConnectionFactory)context.lookup("connectionFactry")
#对于queue,(QueueConnectionFactory)context.lookup("connectionFactory")
connectionFactoryNames = connectionFactory
#注册queue,格式:
#queue.[jndiName] = [physicalName]
#使⽤时:(Queue)context.lookup("jndiName"),此处是MyQueue
queue.MyQueue = example.MyQueue
#注册topic,格式:
板凳筋# topic.[jndiName] = [physicalName]
#使⽤时:(Topic)context.lookup("jndiName"),此处是MyTopic
topic.MyTopic = example.MyTopic
2. 发布/订阅
在实际测试时,发布者和订阅者并不是需要同时出现的。例如,有时我们可能想测试单位时间内消息
发布者的消息产⽣量,此时就不需要消息发布者,只需要订阅者就可以了。本例为了说明这两种Sampler的使⽤,因此建⽴如下的测试计划:
其中JMS Publisher和JMS Subscriber的属性:选择"使⽤jndi.properties",连接⼯⼚是connectionFactory,主题是MyTopic,其它使⽤默认配置。对于JMS Publisher,还需提供测试⽤的⽂本消息。
启动ActiveMQ,运⾏测试计划。如果配置正确,那么与ActiveMQ成功连接之后,在JMeter的后台会打印出相关信息。在测试过程中,JMeter 后台打印可能会出现java.lang.InterruptedException 信息,这个是正常现象,不会影响测试过程和结果。这⼀点可以从 bin 下的 jmeter.log 看出。
3. 点对点
对于点对点,JMeter只提供了⼀种Sampler:JMS Point-to-Point。在例⼦中,建⽴如下图的测试计划:
其中:Communication style是Request Only。对于另⼀种风格:Request Response,会验证收到消息的JMS Header中的JMSCorrelationID,以判断是否是对请求消息的响应。tvline
结论

本文发布于:2024-09-23 03:26:23,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/223665.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:请求   测试   需要   软件   信息   是否
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议