• 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

  • 相关阅读:
    [ZZ]终极期望
    推荐一部好电影
    读书笔记:《Java2 教程》(五)
    波音飞机的消息
    雪景
    [ZZ]候捷谈Java反射机制
    关于J2ME开发的感想(20060505更新)
    读书笔记:《Java2 教程》(七)
    读书笔记:《Java2 教程》(六)
    注册了Bloglines
  • 原文地址:https://www.cnblogs.com/softidea/p/5744624.html
Copyright © 2020-2023  润新知