压力测试工具
- HP LoadRunner(商业软件)
- meter(Apache 开源工具)
Jmeter特点
基于Java的开源压力测试工具,轻量级、跨平台,支持多数通信协议
学习资料
- Jmeter官网:
- 推荐书籍:零成本实现Web性能测试—基于Apache JMeter
Jmeter 8大组件
-
Configuration Elements:配置元件
主要为采样器Sampler使用提前完成初始化工作,例如设置基础环境配置,设置公共变量参数 -
Pre Processors:前置处理器
主要用于在采样器Sampler正式工作之前修改采样器的配置信息或修改变量的值 -
Timers:定时器
定时器会让作用域内的每1个采样器都在执行前等待1个固定时长,如果不设定延迟,JMeter会在短时间内产生大量访问请求,导致服务器被大量请求所淹没。若为线程组添加了多个定时器,JMeter会将这些定时器时长叠加起来,共同影响作用域范围内的采样器。定时器可作为采样器或者逻辑控制器的子项,目的是只影响作用域内的采样器 -
Samplers:采样器
模拟发送请求给目标服务器并返回相应结果 -
Post-Processors:后置处理器
后置处理器会在采样器发出请求之后做一些特殊操作。若后置处理器附着在某个采样器之下,那么它只会在该采样器运行之后执行。后置处理器通常被用来处理服务器的响应数据,特别是服务器响应中提取数据 -
Assertions:断言 用户可以使用断言来检查从服务器获得的响应内容。通过断言可以测试服务器返回的响应与测试人员的期望是否相符
-
Listeners:监听器 监听器提供对JMeter测试期间收集数据的访问方法。
- "图形结果":监听器会将系统响应时长绘制在1张图片之中
- "查看结果树":监听器会展示采样器请求和响应的细节,还可以将测试数据导入到文件之中,以供后续分析特别注意:不同的监听器使用的数据都是一致的,不同的监听器只是对同1份数据的不同处理显示
-
Logic Controllers:逻辑控制器
逻辑控制器可以帮助用户控制Jmeter的测试逻辑,可以根据需要对采样器工作进行分组处理,类似编程语言的if/else、while、loop等逻辑工控功能
Jmeter 组件运行顺序
- 配置元件(Config Element)
- 前置处理器(Pre Processors)
- 定时器(Timer)
- 取样器(Sampler)
- 后置处理器(Post-Processors,结果可用情况下执行)
- 断言(Assertions,结果可用情况下执行)
- 监听器(Listener,果可用情况下执行)
注意:相同功能元件在同一层级,作用域按照配置的先后顺序执行
Jmeter 元件作用域
作用域由测试计划的的树型结构中元件的父子关系来确定
- Sampler:最为最底层原件,不与其他元件进行交互,不存在作用域
- Logic Controller:只对子节点采样器和逻辑控制器有效
- Sampler/Logic Controller其他元件:若父节点不是Sampler ,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)
测试计划案例
-
创建测试计划
-
创建线程组
-
创建采样器:HttpRequest采样器
-
创建监听器:View Results Tree
-
运行测试计划
模拟测试结果:
正常测试结果:
分析:
模拟测试结果和正常测试结果一致,表明测试计划成功运行
Tips:测试代码
package com.zhiwei;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/servlet")public class JmeterServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String requestParam01 = request.getParameter("name"); String requestParam02 = request.getParameter("passwd"); response.setContentType("text/html;charset=utf-8"); StringBuilder sb = new StringBuilder(); sb.append("Hello " + requestParam01); if (requestParam02 != null) { sb.append(";passwd=" + requestParam02); } sb.append("!"); System.out.println("后台返回数据:" + sb); response.getWriter().println(sb); response.getWriter().flush(); response.getWriter().close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { doGet(request, response); }}