JMeter主要是一个用于load/stress test的工具。由于它具有一套专门的术语和概念,对于我等不是专门做测试的人员来说初次使用它时确实有点无从下手的感觉。只有搞清楚了它的几个基本概 念,用起来才能做到心中有数。虽然JMeter的用户文档讲得很详细,但是那里毕竟没有结合JMeter所有概念讲一个综合应用的例子(实际测试中的 Test Plan往往需要综合运用很多概念的),不失为一个小小的遗憾。 本文结合一个webapplication测试的例子介绍JMeter的完整概念。

JMeter使用的概念有:Thread,Sampler,LogicController, Config Element(配置元素),Timer,Pre-/Post Processor,Assertions, Listener。

从整体结构上来讲,首先一个测试就是一个Test Plan(测试计划),每一个Test Plan可以设定Thread Group,Thread Group下面的树形结构就是下面设置的测试配置信息。

下面是本实例的一个整体配置:

(图1)

一个Thread模拟单个测试用户,例如下面的是ThreadGroup元素中的配置信息,它表示模拟100个用户的访问,ramp-up表示100个用户线程5秒钟之内才能全部启动完成。

(图2)

*****Sampler是核心概念:

要通过http访问web server,免不了需要使用Sampler(对于这里的Web测试是HttpRequest Sampler)。所谓Sampler就是对Server的访问,相当于浏览器(但是不解析html/css和javascript),每一次访问请求得 到的响应在JMeter中作为一个Sample保存并通过Listener让用户察看HTTP response的结果和统计图表。所以Sampler是JMeter的核心概念。其他的概念都是围绕着Sampler服务的,比如Pre- processor(预处理器)可以在Sampler向Server发送请求之前定义一些变量或做处理(比如本例图1中的User Parameters);而Post-Processor可以在得到Response之后作一些操作(比如本例图1中的“RegEx extractor - tableuseid”)。图1中包括的Sampler有四个:

1) Login.action(在Once Only Controller下面)

2) Main.action (位于Simple Controller下面)

3) Click Table(afterSelectTable_ajax.action) (位于SimpleController下面)

4) CreateOrder(doOpenGuestTable_ajax.action) (位于SimpleController下面)

下面围绕着以上四个samplers介绍JMeter的其他概念。

*****如何设置多个HTTP Requests的缺省值:

首先在测试一个web application的时候,每个Sampler都需要设定web server的主机IP地址等信息,而这些信息在每个Sampler中是相同的,因此可以通过一个Config Element—Http Request Defaults将这些共同信息(比如Web Server主机IP)提取出来保存,然后在上面四个Samplers中就不需要再设置了。

(图3)

*****Once Only Controller:

Login.action是web程序的login功能,每一个用户(Thread)都需要单独login,但是在一个 用户的所有HTTP requests中(即一个session)只需要login一次。因此如果可以将这个Sampler放到Once Only Controller下面,保证login只在一个session中执行一次。Once Only Controller是JMeter中的另一个概念--Logic Controller。Logic Controller类似于编程语言中的for循环那样的控制结构,它可以控制树形结构下面包含的Samplers的执行方式。常用的Logic Controller有Simple Controller(就是一个简单的容器,将树形结构下面的Samplers放到一起,见图1), 这里的Once Only Controller,还有Interleave Controller(上一次执行下面的一个某个Sampler A,下一次执行下面的一个某个Sampler B)等。

下图是Login.action这个Sampler的设置:

(图4)

*****Sampler中每一个用户可以有不同的URL参数值:

从上图中可以看到在调用login.action的URL参数中使用了一个参数funcType,它的值是从另外一个变量${FUNCTYPE}中 读取的。那么FUNCTYPE变量在那里定义的呢?答案是User Parameters中定义了该变量。前面说过,User Parameters是一个Pre-processor,只在Sampler执行之前使用该元素,所以在执行Login.action之前,其中一个变量 FUNCTYPE可以从User Parameters中设置。在本例中,我们模拟了100个用户,希望每一个用户可以从funcType的两个值{1,2}中依次选一个,因此User Parameters的作用就是在每个Sampler执行之前,给它设置一个funcType值,每一个funcType变量可以设定多个用户,比如本例 中设置了user1和user2,但是实际上测试用户数是100,这种情况下就轮流从user1和user2中选取(比如用户3使用user1的值,用户 4使用user2的值,用户5使用user1的值)。

下图是本例中UserParameters的设置:

(图5)

*****Cookie管理:

几乎所有的Web Application都需要cookie管理,JMeter可以模拟浏览器的做法管理cookie,只需要添加一个Config Element – HTTP Cookie Manager(如上图所示)。

*****如何定义变量:

另外在Simpler Controller下面有一个UserDefined Variables,它也是一个Config Element。在本例中,由于其中一个Sampler “ClickTable(afterSelectTable_ajax.action)”需要一个参数tableId作为输入,但是又不希望把这个参数值 hard code进去,因此设置一个用户定义的变量TABLEID(注意图中变量的作用域是Simpler Controller下的三个Samplers,但是只有Main.action中用到该变量):

(图6)

*****如何在Http Request Sampler中使用变量:

然后在Sampler “Click Table(afterSelectTable_ajax.action)”中可以按${TABLEID}的方式引用这个变量:

(图7)

*****Regular Expression Extractor提取Http Response信息并保存成变量:

除了上面使用User Defined Variables的方法定义变量之外,本例中还是用了Regular Expression Extractor从HTTP response的输出结果中获取一个字符串作为一个变量。Regular Expression Extractor是JMeter中的另一个概念—Post-processor,它的作用是得到HTTP响应后,对结果(比如一个html标签页面的内 容或json输出数据等)进行处理,通过regular expression抽取字符值,存成一个变量给后面的Sampler使用。

例如在Click Table(afterSelectTable_ajax.action)这个Sampler执行完一次HTTP Request之后得到如下的HTTP Response(一个json格式的输出):

{"free":false,"hasError":false,"singleEntry":true,"table_nr":"05","tableid":5,"tableuseid":130}

现在要得到tableuseid的值130,可以用这样一个regular expression:

^.+?"tableuseid":([^} ,]+).*$

上面括号中的内容就是提取130的值,用括号的作用是可以把该值作为一个组,并存成一个变量以便在下一个Sampler--CreateOrder(doOpenGuestTable_ajax.action)中使用。

注:可以用下面的perl命令行交互式测试正则表达式:
perl -n -e '/^.+?"tableuseid":([^} ,]+).*$/ && print "$1\n"'

(图8)

*****在另一个Sampler中使用RegEx提取的变量:

按照上图的设置,在CreateOrder(doOpenGuestTable_ajax.action)中如何引用该变量呢?根据JMeter的用户参考文档,应该是${tableuse_g1}。

下图是该变量在Sampler--CreateOrder(doOpenGuestTable_ajax.action)中的使用。

(图9)

*****JMeter的函数:

在上图中,还有一个URL参数nocache,它使用一个函数${__time}获取client中的当前时间。

*****Timer:

在上图的Sampler--CreateOrder(doOpenGuestTable_ajax.action)下面 有一个constant timer--delay executing CreateOrder,它的作用是在执行完上一个Sampler(这里的Click Table)之后,延时一个时间段,这样不至于给服务器造成过多的影响。

*****HTTP Response的html内容校验:

在CreateOrder(doOpenGuestTable_ajax.action)的HTTP响应(一个html标签页面的内容)中,我们需 要检测是否包含一个单词“Beer”,如果没有这个单词,说明HTTP响应出错。这就是自动化的功能测试的思想。可以使用JMeter的另外一个概念— Assertion完成这项工作,本例中使用ResponseAssertion,如下图所示:

(图10)

*****测试结果的显示:

测试结果可以输出每一个Sample的HTTP Request/Response的内容,也可以用图表统计所有的Samples,并保存到文件中。在JMeter中使用Listener这个概 念,Listener的作用就在每个Sample执行之后根据设置做相应的统计处理。本例中使用到的Listener有两个:View Results Tree和Graph Results。

参考图1(为方便起见,重新贴在下面),总结一下本例Test Plan中用的元素和它们在JMeter中的概念对应关系:

1. Thread: 模拟一个用户

2. Sampler:

1) Login.action(在Once Only Controller下面)

2) Main.action (位于Simple Controller下面)

3) Click Table(afterSelectTable_ajax.action) (位于SimpleController下面)

4) CreateOrder(doOpenGuestTable_ajax.action) (位于SimpleController下面)

3. Logic Controller:Once Only Controller和SimpleController
4. Config Element: HTTP Request Defaults, HTTP Cookie Manager和User DefinedVariables

5. Timer: delay executing CreateOrder

6. Pre-Processor:User Parameters

7. Post-Processor:RegEx extractor - tableuseid

8. Assertions: Response Assertion

9. Listener: View Results Tree和Graph Results

总结:以上介绍的是JMeter的核心概念,JMeter还有很多其他功能,比如分布式测试(在一台机器上测试受单机的性能限制,往往压力测试结果 不能反映真实情况),无图形界面(non-GUID)的测试等等。但是掌握了这些核心的概念,已经可以自如地应对普通的测试方案了。

转载于:https://my.oschina.net/vdroid/blog/393076

通过一个实例掌握测试工具JMeter的一些基本概念相关推荐

  1. 图解 CSS (1): 先做一个样式表测试工具

    一直没有把样式表系统一下, 春节假期有空, 不能再等了. 为了方便学习, 先写了一个样式表测试工具: CssTest(点击下载) 工具非常简单, 写了 10 行左右的代码; 运行效果图: 代码文件: ...

  2. python监听多个udp端口_用Python写一个UDP端口测试工具(一)

    需求 最近有个运维需求,需要测试客户端的UDP端口与服务器的连通性. 需求也很简单:客户端测往服务端发UDP包,服务端收到包后响应客户端,当客户端能收到服务端的响应则可断定端口是可达的.但是客户端需要 ...

  3. python+ tkinter做的一个项目辅助测试工具

    python+tkinter 写的一个项目测试工具 目的是能够自动按照模板向禅道系统 提交bug,自动打包日志并上传到禅道上 以及结合进 项目中一些其他的功能,提升测试效率 主要是记录下 tkinte ...

  4. 图文详解压力测试工具JMeter的安装与使用

    压力测试是目前大型网站系统的设计和开发中不可或缺的环节,通常会和容量预估等工作结合在一起,穿插在系统开发的不同方案.压力测试可以帮助我们及时发现系统的性能短板和瓶颈问题,在这个基础在上再进行针对性的性 ...

  5. 【Jmeter】压力测试工具 Jmeter 使用

    运行 下载后运行: 启动后可以看到一个java编写的图形界面. 一个简单的压测实例 现有一个http请求接口http://127.0.0.1:5000/example_analysis/,要使用Jme ...

  6. 压力测试工具Jmeter的简单使用

    目录 介绍 下载地址 安装 简单配置 永久设置中文界面 设置字体大小和图标 插件安装 插件使用 填坑-修改了相关配置,字体依然很小,无语 实战-简单的压力测试过程 创建线程组 配置元件 取样器-构造H ...

  7. 3dm显卡测试软件,3DMark新版发布:全球第一个DirectX 12测试工具

    Futuremark今天宣布了新的3DMark API Overhead系统开销性能测试.它基于2013年发布的3DMark,加入了对DX12.DX11.AMD Mantle API的性能差异性独立测 ...

  8. 测试工具jmeter清理缓存关闭java进程

    上周用jmeter跑接口,发现创建接口的请求body一直用的是修改之前的请求body,重新安装了jmeter也没有用. 经了解需要关闭java进程,tasklist查看java进程普通的强制关闭一直也 ...

  9. 转载一个很经典的--C# Socket TCP和UDP报文及端口测试工具的开发(提供源码)

    转载地址:http://www.ltmonitor.com/blog/?p=285 因为自己经常做Socket开发,经常要调试各种协议,如TCP.UDP和SIP等协议,还要维护多个服务器端和客户端的通 ...

  10. jmetery压力测试工具

    Tomcat调优测试方案我们刚才学了这么多的JVM参数调优的,你们总结一下基本原则是什么原则,在做JVM参数调优的时候,基本原则是减少垃圾回收的次数,尽量让老年代的空间大于新生代的空间,在TOMCAT ...

最新文章

  1. Git + BeyondCompare
  2. 一文带你了解java面向对象的三大特性:继承、封装、多态
  3. Hibernate关联关系映射-----单向一对一映射配置
  4. MySQL分区表概述
  5. 标识响应式html,第一个html5+响应式页面
  6. python try catch打印到日志_django 捕获异常和日志系统过程详解
  7. 开发门槛被低代码降低,传统企业IT岗的活路在哪里
  8. (二)设置hexo支持mermaid
  9. 设计模式学习(三):创建型模式【转】
  10. 自由曲面透镜设计matlab,led自由曲面准直透镜的优化设计方法.pdf
  11. mac安装仿宋GB2312字体
  12. 计算机excel还原,3种方法找回电脑上已删除的Excel文档
  13. 大学计算机系三年论文6000字,计算机论文6000字范文_计算机论文_计算机应用论文...
  14. 机器学习笔记(10)——逻辑回归算法优化之随机梯度下降法
  15. 英语学习的方法(1)
  16. A1489. 抽奖(乔明达)
  17. 51妹子图客户端,开放源代码啦,欢迎拍砖
  18. 2022A特种设备相关管理(电梯)复训题库及模拟考试
  19. 使用java实现语音朗读
  20. Word快速删除所有英文、数字或中文

热门文章

  1. unity player 显示播放错误时的解决办法
  2. ZOJ 3430 Detect the Virus(AC自动机 + 模拟)题解
  3. Java(31)_JDBC连接mysql数据库(一)
  4. 爬虫(七):爬取猫眼电影top100
  5. Java学习——HashMap
  6. 胡明浩 160809313 (我就会三个)
  7. R语言并行计算的原理和案例
  8. 全军覆没!麻省理工零录取中国学生,斯坦福取消中国大陆面试! 这是怎么了?...
  9. pyqt5 登录跳转
  10. Codeforces - 346A - Alice and Bob - 简单数论