博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】使用JMeter 完成常用的压力测试(一)
阅读量:5288 次
发布时间:2019-06-14

本文共 3602 字,大约阅读时间需要 12 分钟。

  本文介绍了 JMeter 相关的基本概念。并以 JMeter 为例,介绍了使用它来完成最常用的三种类型服务器,即 Web服务器、数据库服务器和消息中间件,压力测试的方法、步骤以及注意事项。        

  讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试。但是软件仅仅只是功能正确是不够的。在实际开发中,还有其它的非功能因素也起着决定性的因素,例如软件的响应速度。影响软件响应速度的因素有很多,有些是因为算法不够高效;还有些可能受用户并发数的影响。

  在众多类型的软件测试中,压力测试正是以软件响应速度为测试目标,尤其是针对在较短时间内大量并发用户的访问时,软件的抗压能力。本文以 JMeter 为例,介绍了如何使用它来完成常用的压力测试:Web 测试、数据库测试和 JMS 测试。

  概述

  JMeter 最早是为了测试 Tomcat 的前身 JServ  的执行效率而诞生的。到目前为止,它的最新版本是2.1.1,它的测试能力也不再仅仅只局限于对于Web服务器的测试,而是涵盖了数据库、JMS、Web  Service、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.com 上的文章 Using JMeter 提供了一个非常好的入门。

  常用测试

  压力测试不同于功能测试,软件的正确性并不是它的测试重点。它所看重的是软件的执行效率,尤其是短时间内访问用户数爆炸性增长时软件的响应速度,压力测试  往往是在功能测试之后进行的。在实际的开发过程中,软件潜在的效率瓶颈一般都是那些可能有多个用户同时访问的节点。

  就目前 Java EE 的平台下开发的软件来说,这种节点通常可能是:Web 服务器、数据库服务器和 JMS  服务器。它们都是请求主要发生的地点,请求频率较其它的节点要高,而且处于请求序列的关键路径之上。如果它们效率无法提高的话,对于整个软件的效率有致命  的影响。而且在这些节点上一般都会发生较大规模的数据交换,有时其中还包含有业务逻辑处理,它们正是在进行压力测试时首先需要考虑的。

  本文以这三种节点为例,介绍如何使用 JMeter 来完成针对于它们的压力测试。

  Web 服务器

  对于大多数的项目来说,并不会自行开发一个Web服务器,因此Web服务器压力测试的对象实际就是--发布到Web服务器中的软件。最简单的Web测试计划只需要三个 JMeter 的测试元件,如下图:

  

    其中:

  在线程组中定义线程数、产生线程发生的时间和测试循环次数。 在http请求中定义服务器、端口、协议和方法、请求路径等。 表格监听器负责收集和显示结果。 这种设置对于包含了安全机制的 web 应用是不够的,典型的 web 应用一般都会:

  1. 有一个登录页,它是整个应用的入口。当用户登录之后,应用会将用户相关的安全信息放到 session 中。

  2. 有一个 filter,它拦截请求,检查每个请求相关的 session 中是否包含有用户安全信息。如果没有,那么请求被重定向到登录页,要求用户提供安全信息。

    在这种配置下应用上面的测试计划,那么除了登录页之外的其它请求都将因为缺少用户安全信息,而使请求实际定位到登录页。如果不加断言,那么在监听器看来所  有的请求都是成功。而实际上,这些请求最终都没有到达它们应该去的地方。显然,这种测试结果不是我们所期望的。

  为了成功的测试,至少有2种方法:

  方法一,去掉程序的安全设置,如filter,使得不需要用户安全信息也能访问受限内容; 方法二,不修改程序,使用JMeter提供的"Http URL重写修饰符"或"Http Cookie管理器"。 对于第一种方法,有其局限性:

  需要修改程序配置,如去掉web.xml中关于安全filter的设置。需要维护多个版本的web.xml,如压力测试和功能测试分别各自的  web.xml,增加了维护成本,而且有可能会在测试之后忘记将web.xml修改回来。          对于一些需要用户安全信息的页面无能为力,如某些业务审计操作需要用户安全信息来记录。因为缺少这样的信息,注定了测试的失败。如果解决为了这个问题进一  步的修改程序,那么因为存在多个版本的程序,那么其维护难度将大大增加。          虽然,第二种方法配置难度增加了,但是它不用修改程序。而且还可将测试计划保存成文件,以便重复使用。因此,选用第二种方法是较为理想的做法。下面以一个  简化的例子说明使用方法二的配置步骤。

  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= req.getSession();
  User user = (User)session.getAttribute("user");     if(null == user){
  String uri= req.getRequestURI();
  //如果请求页是登录页,不转向
  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.equals("12345678");
  }  public String getUser() {
  return user;  }
  public void setUser(String user) {
  this.user = user;
  }
  }

转载于:https://www.cnblogs.com/blongfree/p/4981017.html

你可能感兴趣的文章
结构体数组 and 结构体数组大小的内存
查看>>
1078. Hashing (25)
查看>>
ios开发所有的iCON 的大小
查看>>
20171108h5的文档扫尾,解决记录的相关问题
查看>>
go语言基础教程2
查看>>
单例模式的优化之路(java)
查看>>
当一个DBA离职时,如何清除掉数据库里属于他的那些“东西” (job所有者更新)...
查看>>
struts2学习笔记--总结获取servletAPI的几种方式
查看>>
design pattern notes [1] - Bridge and composite
查看>>
TCP 的那些事儿(上) SACK
查看>>
jquery 时间运算、格式化的方法扩张
查看>>
C语言中各种进制的表示
查看>>
打印数组
查看>>
删除菜品
查看>>
如何不让DataGridView自动生成列
查看>>
不用写代码的框架 - RobotFramework+Eclispe环境安装篇
查看>>
Android Studio占用C盘内存
查看>>
火狐浏览器设置页面缩放比例方法
查看>>
[COCI2017-2018 Contest5] Birokracija
查看>>
Cheatsheet: 2017 06.01 ~ 06.30
查看>>