Jmeter 专题

Jmeter是一个非常好用的压力测试工具。  Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好。

 
为什么要建立线程组?原因很简单,因为我们要模拟多个线程(用户)来访问LinuxEye(linux运维笔记 - 学习记录Linux系统运维工作心得和生活体会 - https://blog.linuxeye.com)
线程属性部分中,线程数是启动多少个线程,这里填写的是10,Ramp-Up Period (in seconds)表示线程之间间隔多少时间允许,单位是秒,比如如果填写10,那么10/10=1表示10个线程间每隔1秒钟请求网站。
循环次数:60个线程运行完毕算是一次,循环次数就是这样的一个请求过程运行多少次,我这里测试就填写的是2。
每次修改一个设置后,别忘记了保存一下。


鼠标右键点击线程组,在弹出的菜单中选择添加->监听器->用表格查询结果

各属性如下:

  • Sample:每个请求的序号
  • Start Time:每个请求开始时间
  • Thread Name:每个线程的名称
  • Label:Http请求名称
  • Sample Time:每个请求所花时间,单位毫秒
  • Status:请求状态,如果为勾则表示成功,如果为叉表示失败。
  • Bytes:请求的字节数

如果Status为叉,那很显然请求是失败了,但如果是勾,也并不能认为请求就一定完全成功了,因为还得看Bytes的字节数是否是所请求网页的正常大小值,如果不是则说明发生了丢包现象,也不是完全成功。

在下面还有几个参数:

  • 样本数目:也就是上面所说的请求个数,成功的情况下等于你设定的并发数目乘以循环次数
  • 平均:每个线程请求的平均时间
  • 最新样本:表示服务器响应最后一个请求的时间
  • 偏离:服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布(这个我不是很理解)。

术语:

  1. 线程组:测试里每个任务都要线程去处理,所有我们后来的任务必须在线程组下面创建。可以在“Test Plan(鼠标右击) -> 添加  ->Threads(Users) -> 线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。
  2. 取样器(Sampler):可以认为所有的测试任务都由取样器承担,有很多种,如:HTTP请求。
  3. 断言:对取样器返回的请求结果给出判断是否正确。
  4. monitor:它的功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等

https://blog.linuxeye.com/335.html

阅读目录

  1. 什么是压力测试 
  2. 做压力测试的常用工具
  3. 做压力测试的步骤如下:
  4. 本文做压力测试的例子
  5. 第一步: 使用CSV Data Set Config 来参数化
  6. 第二步:添加HTTP Request.
  7. 第三步: 使用Thread Group, 控制模拟多少用户
  8. 第四步:  添加Summary Report 用来查看测试结果
  9. 第五步: 运行一下
  10. 下载源代码

什么是压力测试 

顾名思义:压力测试,就是  被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定(资源占用情况)

比如: 2000个用户同时到一个购物网站购物,这些用户打开页面的速度是否会变慢,或者网站是否会奔溃

做压力测试的常用工具

做压力测试,一般要使用工具, 人工是没办法做的。   最常用的工具是LoadRunner, 但是LoadRunner毕竟是收费软件,而且使用上也比较复杂。 现在越来越多的人开始使用Jmeter来做压力测试。 免费, 而且使用上非常简单。

做压力测试的步骤如下:

1. 写脚本 或者录制脚本

2. 使用用户自定义参数

3. 场景设计

4. 使用控制器,来控制 模拟多少用户。

5. 使用监听器, 查看测试结果

本文做压力测试的例子

本文举的实例是: 在一台电脑用Jmeter模拟200个用户,同时去使用bing搜索不同的关键字, 查看页面返回的时间是否在正常范围内。

第一步: 使用CSV Data Set Config 来参数化

首先我们把测试需要用到的2个参数放在txt文件中,

新建一个data.txt文件,输入些数据, 一行有两个数据,用逗号分隔。

 

启动Jmeter, 先添加一个Thread Group (打开Jmeter时,默认会创建一个名为 TestPlan的ThreadGroup), 然后添加一个CSV Data Set Config (Add -> Config Element -> CSV Data Set Config)

第二步:添加HTTP Request (构建一个请求).

我们添加http 请求,发送get 到 http://cn.bing.com/search?q=博客园+小坦克

选择Thread Group 右键 (Add ->Sampler -> HTTP Request),  需要填的数据如下:

 

第三步: 使用Thread Group, 控制模拟多少用户(模拟用户)

选中Thread Group

 

Number of Threads(users):     一个用户占一个线程,  200个线程就是模拟200个用户

Ramp-Up Period(in seconds):   设置线程需要多长时间全部启动。如果线程数为200 ,准备时长为10 ,那么需要1秒钟启动20个线程。也就是每秒钟启动20个线程。  //RUP时间

Loop Count: 每个线程发送请求的次数。如果线程数为200 ,循环次数为10 ,那么每个线程发送10次请求。总请求数为200*10=2000 。如果勾选了“永远”,那么所有线程会一直发送请求,直到选择停止运行脚本。

第四步:  添加Summary Report 用来查看测试结果 (查看结果)

选中Thread Group 右键(Add -> Listener -> Summary Report)

 

如果想看每个请求的执行情况,可以再添加 View Result Tree:

 

第五步: 运行一下

到目前为止, 脚本就全写好了, 我们来运行下, 如何看下测试的结果

下载源代码

 点击这里【小坦克】下载源代码,  要注意修改data.txt的路径

 某一时间点,有100个用户同时进行。
比如说100用户并发登录,大概是100个用户进行初始化到达登录的前奏,等到100个用户都到达登录的前奏时,就会同时释放100个用户进行登录操作。

1、“线程数=5,RUP=5,循环=永远”
[线程数]:模拟的并发数
[RUP]:过渡时间,告诉JMeter需要多久可达到选择的所有线程数。如果使用5线程,ramp-up period过渡时间为10秒,那么JMeter会在10内将所有5个线程启动并运行起来
[循环=永远]:会一直跑下去

2、“感觉实际发出的请求数大于并发5”
可以先设置“循环=1”,看下跑一次的情况下请求数是多少。

 http://www.cnblogs.com/TankXiao/p/4059378.html

http://www.cnblogs.com/TankXiao/p/4059378.html

Jmeter是一款优秀的开源测试工具, 是每个资深测试工程师,必须掌握的测试工具,熟练使用Jmeter能大大提高工作效率。

熟练使用Jmeter后, 能用Jmeter搞定的事情,你就不会使用LoadRunner了。

【小坦克Jmeter教程】,将会覆盖Jmeter的各个功能,并且会通过丰富的实例,让读者快速掌握Jmeter的各种用法 。

本文将通过一个实际的测试例子, 来讲解Jmeter的基本用法。本文的最后提供了本篇文章的脚本。 不喜欢看文章的同学直接看脚本也能看懂

阅读目录 

  1. Jmeter介绍
  2. 如何学好Jmeter
  3. Jmeter下载和运行
  4. 实际测试的例子
  5. 第一步: 新建Thread Group
  6. 第二步: 新建HTTP Request
  7. 第三步: 新建HTTP Header Manager
  8. 第四步: 新建 View Results Tree
  9. 第五步: 运行测试,查看结果
  10. 第六步: 添加Assertion和Assertion Results
  11. 第七步: 使用用户自定义变量
  12. 第八步: 关联
  13. 源代码下载

 

Jmeter 介绍

Jmeter  是一款使用Java开发的,开源免费的,测试工具, 主要用来做功能测试和性能测试(压力测试/负载测试). 

而且用Jmeter 来测试 Restful API, 非常好用。

 

如何学好Jmeter

如果你用Jmeter去对Web进行功能测试,或者性能测试。 你必须熟练HTTP协议,才能学好Jmeter。 否则你很难理解Jmeter中得概念。

不熟悉HTTP协议的话, 可以参考我的 【小坦克:HTTP 协议教程】

 

Jmeter  下载和运行

官方网站:http://jmeter.apache.org/

解压后, 运行  “bin/jmeter.bat”   

Jmeter 是支持中文的, 启动Jmeter 后, 点击 Options -> Choose Language  来选择语言

 

实际测试的例子

目标: 获取城市的天气数据:

第一步: 发送request 获取城市的城市代号
http://toy1.weather.com.cn/search?cityname=上海 

从这个请求的response 中获取到上海的城市代码. 比如:

上海的地区代码是101020100

上海动物园的地区代码是:  10102010016A

第二步:  发送request 到: http://www.weather.com.cn/weather2d/101020100.shtml   可以得到该城市的天气数据

 

第一步: 新建一个Thread Group

必须新建一个Thread Group,  jmeter的所有任务都必须由线程处理,所有任务都必须在线程组下面创建。

 

第二步:新建一个 HTTP Request

比如我要发送一个Get 方法的http 请求: http://toy1.weather.com.cn/search?cityname=上海 

可以按照下图这么填

 

第三步 添加HTTP Head Manager

选中上一步新建的HTTP request. 右键,新建一个Http Header manager. 添加一个header

 

第四步: 添加View Results Tree

View Results Tree 是用来看运行的结果的

 

第五步:运行测试,查看结果

到这里。 我们已经成功运行起来了。

 

第六步:添加Assertion和Assert Results

 选择HTTP Request, 右键 Add-> Assertions -> Response Assertion.  添加 Patterns To Test

然后添加一个Assetion Results 用来查看Assertion执行的结果. 

选中Thread Group 右键  Add -> Listener -> Assertion Results. 

运行后, 如果HTTP Response中没有包含期待的字符串。 那么test 就会Fail. 

 

第7步: 使用用户自定义变量

我们还可以在Jmeter中定义变量。 比如我定义一个变量叫 city.    使用它的时候用  ${city}

添加一个 User Defined Variables.  选中Thread Group: 右键 Add -> Config Element -> User Defined Variables.

我们添加一个变量: city

然后在Http Request中使用这个变量

 

第八步:关联

所谓关联, 就是第二个Requst, 使用第一个Request中的数据

我们需要在第一个Http Requst 中新建一个正则表达式,把Response的值提取到变量中,提供给别的Http Request 使用

选择第一个Http Request, 右键 Add -> Post Processors -> Regular Expresstion Extractor

现在新建第二个Http Request,     发送到: http://www.weather.com.cn/weather2d/${citycode}.html 

${citycode} 中的数据, 是从Regular Expression Extractor 中取来的

到这, 脚本就全部写好了, 运行下,看下最终结果

 

 

源代码下载

点击这里[小坦克]下载源代码

http://www.cnblogs.com/TankXiao/p/4045439.html

在使用Jemeter做压力测试的时候,往往需要参数化用户名,密码以到达到多用户使用不同的用户名密码登录的目的.这个时候我们就可以使用CSV Data Set Config实现参数化登录:

首先通过Test Plan或者Thread Group的Add->Config Element->CSV Data Set Config添加



 以下是CSV Data Set Config各个参数的简要说明:

  • FileName:即同目录下csv文件的名称
  • File Encoding: 默认为ANSI
  • Varible Names: 定义文本文件中的参数名,参数之间逗号分隔.定义后可在脚本在以Shell变量的同样的方式引用
  • Allow Quoated data: 双引号相关
  • Recycle on EOF: 设置为True后,允许循环取值
  • Stop Thread on EOF: 当Recycle on EOF为false并且Stop Thread on EOF为true,则读完csv文件中的记录后,停止运行
  • Sharing Mode: 设置是否线程共享

设置2个线程去运行,结果如下:



成功读取CSV中的参数.

最后,我们需知Jmeter还有如下方式可以进行参数化:

  • User Defined Varibles: 一般对不需要改变的参数进行
  • User Parameters:
  • 通过系统函数: Options->Function Helper Dialog,通过自己输入参数值,点击"Generate" 按钮产生

 本文出自"lijingshou"博客,转载请务必保留此出处http://lijingshou.iteye.com/blog/2047613

Apache JMeterApache组织开发的基于Java的压力测试工具。用于对软件做压力测试,相比其他HTTP测试工具,JMeter最主要的特点在于扩展性强。JMeter能够自动扫描其lib/ext子目录下.jar文件中的插件,并且将其装载到内存,让用户通过不同的菜单调用。并且能自动生成压力测试报告。

1. 下载JMeter

http://jmeter.apache.org/download_jmeter.cgi

我用的是JMeter 2.9 r1437961 ,JDK 7u40

2.启动JMeter

运行bin/jmeter.bat

3.添加线程组

测试计划->添加->Threads(users)->线程组

线程数:要模拟的并发用户量。

Ramp Up Period (in seconds):在多长时间内均匀启动所有的线程。比如Number of Threads设为3000,Ramp Up Period设为300,则jmeter每隔0.1秒启动1个线程。

循环次数:单用户任务重复执行的次数。可以设为永远,这样jmeter就不会自动停止,需要强制终止。

线程组->添加->sampler->Java请求

把我们基于Jmeter 的JAVA请求选中,ShootRequest,向鱼群发射炮弹的业务逻辑.

其中界面上的参数为程序中指定的,比如服务器IP端口之类的。

4.实现Java Request

建立JAVA工程,引入库ApacheJMeter_core.jar,ApacheJMeter_java.jar,实现个抽象类,AbstractJmeterClient,所有的请求必须在玩家登陆的前提下,所以登陆逻辑放到了公共的抽象类:

  1. package com.u9.jrobot;  
  2. public abstract class AbstractJmeterClient extends AbstractJavaSamplerClient {  
  3.     private static final Logger logger = LogManager  
  4.             .getLogger(AbstractJmeterClient.class);  
  5.     private String tableIp = "172.16.1.37";  
  6.     private int port = 1470;  
  7.     private Player player;  
  8.     private String lobbyIp="172.16.1.34";  
  9.     private SampleResult result;  
  10.     protected static int robotId = 0;  
  11.   
  12.     // private String path;  
  13.     // private  
  14.     // 设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter的参数列表中  
  15.     public Arguments getDefaultParameters() {  
  16.         Arguments args = new Arguments();  
  17.         args.addArgument("lobbyIp", lobbyIp);  
  18.         args.addArgument("tableIp", tableIp);  
  19.         args.addArgument("port", "" + port);  
  20.         args.addArgument("startId", "" + robotId);  
  21.         return args;  
  22.     }  
  23.   
  24.     // 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行  
  25.     public void setupTest(JavaSamplerContext context) {  
  26.         // 加载当前目录下的logback配置文件  
  27.         result = new SampleResult();  
  28.         result.sampleStart(); // 事务的起点  
  29.         tableIp = context.getParameter("tableIp");  
  30.         port = context.getIntParameter("port");  
  31.         lobbyIp = context.getParameter("lobbyIp");  
  32.   
  33.         if (robotId == 0) {  
  34.             robotId = context.getIntParameter("startId");  
  35.         }  
  36.         String name = "robot" + robotId++;  
  37.         Map<String, Object> map = HttpManager.getInstance().login(lobbyIp,  
  38.                 name, "qqqqqq");  
  39.         int retcode = (Integer) map.get("s");  
  40.         if (retcode == 1) {  
  41.     //玩家登陆游戏的逻辑  
  42.         }  
  43.     //  JobManager.getInstance().start();  
  44.     }  
  45.   
  46.     @Override  
  47.     // 测试执行的循环体,根据线程数和循环次数的不同可执行多次  
  48.     public SampleResult runTest(JavaSamplerContext arg) {  
  49.         boolean success = true;  
  50.         // result.sampleStart(); // 事务的起点  
  51.         try {  
  52.             result.setSuccessful(this.runTest(player));  
  53.         } catch (Exception e) {  
  54.             success = false;  
  55.         } finally {  
  56.             // result.sampleEnd(); // 事务的终点  
  57.             result.setSuccessful(success); // 设置本次事务成功或失败  
  58.         }  
  59.         return result;  
  60.     }  
  61.   
  62.     public abstract boolean runTest(Player player) throws Exception;  
  63.   
  64.     // 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行  
  65.     public void teardownTest(JavaSamplerContext context) {  
  66.         result.sampleEnd(); // 事务的终点  
  67.         robotId = context.getIntParameter("startId");  
  68.         GameClient gameClient = player.getGameClient();  
  69.         try {  
  70.             PlayerManager.getInstance().remove(gameClient.getChannelId());  
  71.             gameClient.disconnect();  
  72.         } catch (ServiceException e) {  
  73.         }  
  74.     }  
  75. }  

实现具体的压力测试类:

  1. public class ShootRequest extends AbstractJmeterClient {  
  2.   
  3.     private static final Logger logger = LogManager  
  4.             .getLogger(ShootRequest.class);  
  5.     private int[] array = { 1, 5, 10, 20, 30, 40, 50, 100 };  
  6.     private static int token = 0;  
  7.   
  8.     @Override  
  9.     public boolean runTest(Player player) throws Exception {  
  10.   
  11.         // KeepAlive_S2C_Msg ret=client.keepAlive(msg.build());  
  12. <span style="white-space:pre">      </span>//具体射击逻辑实现  
  13.         return true;  
  14.     }  
  15. }  


用ant打包成jrobot.jar,不要设主类,jrobot.jar和lib文件放到apache-jmeter-2.9libext下,然后启动,选择相应的压力测试类,设置参数,启动JMeter

5.添加Listener

//TODO

ps:每个玩家都要单独启动个线程,如果3000玩家就要启动3000个线程组,感觉这设计有点郁闷,程序的很多消耗都在切换线程了。是不是我理解或者用错了?

 http://blog.csdn.net/z69183787/article/details/47019859

原文地址:https://www.cnblogs.com/softidea/p/5744624.html