Jmeter性能测试 及压测入门

时间:2023-12-16 11:18:14

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

为什么要建立线程组?原因很简单,因为我们要模拟多个线程(用户)来访问LinuxEye。
线程属性部分中,线程数是启动多少个线程,这里填写的是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性能测试 及压测入门

启动Jmeter, 先添加一个Thread Group, 然后添加一个CSV Data Set Config (Add -> Config Element -> CSV Data Set Config)

Jmeter性能测试 及压测入门

第二步:添加HTTP Request.

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

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

Jmeter性能测试 及压测入门

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

选中Thread Group

Jmeter性能测试 及压测入门

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)

第五步: 运行一下

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

Jmeter性能测试 及压测入门

下载源代码

点击这里【小坦克】下载源代码,  要注意修改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的所有任务都必须由线程处理,所有任务都必须在线程组下面创建。

Jmeter性能测试 及压测入门

第二步:新建一个 HTTP Request

Jmeter性能测试 及压测入门

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

可以按照下图这么填

Jmeter性能测试 及压测入门

第三步 添加HTTP Head Manager

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

Jmeter性能测试 及压测入门

Jmeter性能测试 及压测入门

第四步: 添加View Results Tree

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

Jmeter性能测试 及压测入门

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

Jmeter性能测试 及压测入门

Jmeter性能测试 及压测入门

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

第六步:添加Assertion和Assert Results

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

Jmeter性能测试 及压测入门

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

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

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

Jmeter性能测试 及压测入门

Jmeter性能测试 及压测入门

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

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

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

我们添加一个变量: city

Jmeter性能测试 及压测入门

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

Jmeter性能测试 及压测入门

第八步:关联

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

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

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

Jmeter性能测试 及压测入门

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

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

Jmeter性能测试 及压测入门

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

Jmeter性能测试 及压测入门

源代码下载

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

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

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

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

Jmeter性能测试 及压测入门
 以下是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个线程去运行,结果如下:

Jmeter性能测试 及压测入门
成功读取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)->线程组

Jmeter性能测试 及压测入门

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

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

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

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

Jmeter性能测试 及压测入门

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

实现具体的压力测试类:

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

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

5.添加Listener

//TODO

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

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