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的字节数是否是所请求网页的正常大小值,如果不是则说明发生了丢包现象,也不是完全成功。
在下面还有几个参数:
- 样本数目:也就是上面所说的请求个数,成功的情况下等于你设定的并发数目乘以循环次数
- 平均:每个线程请求的平均时间
- 最新样本:表示服务器响应最后一个请求的时间
- 偏离:服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布(这个我不是很理解)。
术语:
- 线程组:测试里每个任务都要线程去处理,所有我们后来的任务必须在线程组下面创建。可以在“Test Plan(鼠标右击) -> 添加 ->Threads(Users) -> 线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。
- 取样器(Sampler):可以认为所有的测试任务都由取样器承担,有很多种,如:HTTP请求。
- 断言:对取样器返回的请求结果给出判断是否正确。
- monitor:它的功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等
https://blog.linuxeye.com/335.html
- 什么是压力测试
- 做压力测试的常用工具
- 做压力测试的步骤如下:
- 本文做压力测试的例子
- 第一步: 使用CSV Data Set Config 来参数化
- 第二步:添加HTTP Request.
- 第三步: 使用Thread Group, 控制模拟多少用户
- 第四步: 添加Summary Report 用来查看测试结果
- 第五步: 运行一下
- 下载源代码
什么是压力测试
顾名思义:压力测试,就是 被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定(资源占用情况)
比如: 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的基本用法。本文的最后提供了本篇文章的脚本。 不喜欢看文章的同学直接看脚本也能看懂
阅读目录
- Jmeter介绍
- 如何学好Jmeter
- Jmeter下载和运行
- 实际测试的例子
- 第一步: 新建Thread Group
- 第二步: 新建HTTP Request
- 第三步: 新建HTTP Header Manager
- 第四步: 新建 View Results Tree
- 第五步: 运行测试,查看结果
- 第六步: 添加Assertion和Assertion Results
- 第七步: 使用用户自定义变量
- 第八步: 关联
- 源代码下载
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 JMeter是Apache组织开发的基于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,所有的请求必须在玩家登陆的前提下,所以登陆逻辑放到了公共的抽象类:
- package com.u9.jrobot;
- public abstract class AbstractJmeterClient extends AbstractJavaSamplerClient {
- private static final Logger logger = LogManager
- .getLogger(AbstractJmeterClient.class);
- private String tableIp = "172.16.1.37";
- private int port = 1470;
- private Player player;
- private String lobbyIp="172.16.1.34";
- private SampleResult result;
- protected static int robotId = 0;
- // private String path;
- // private
- // 设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter的参数列表中
- public Arguments getDefaultParameters() {
- Arguments args = new Arguments();
- args.addArgument("lobbyIp", lobbyIp);
- args.addArgument("tableIp", tableIp);
- args.addArgument("port", "" + port);
- args.addArgument("startId", "" + robotId);
- return args;
- }
- // 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行
- public void setupTest(JavaSamplerContext context) {
- // 加载当前目录下的logback配置文件
- result = new SampleResult();
- result.sampleStart(); // 事务的起点
- tableIp = context.getParameter("tableIp");
- port = context.getIntParameter("port");
- lobbyIp = context.getParameter("lobbyIp");
- if (robotId == 0) {
- robotId = context.getIntParameter("startId");
- }
- String name = "robot" + robotId++;
- Map<String, Object> map = HttpManager.getInstance().login(lobbyIp,
- name, "qqqqqq");
- int retcode = (Integer) map.get("s");
- if (retcode == 1) {
- //玩家登陆游戏的逻辑
- }
- // JobManager.getInstance().start();
- }
- @Override
- // 测试执行的循环体,根据线程数和循环次数的不同可执行多次
- public SampleResult runTest(JavaSamplerContext arg) {
- boolean success = true;
- // result.sampleStart(); // 事务的起点
- try {
- result.setSuccessful(this.runTest(player));
- } catch (Exception e) {
- success = false;
- } finally {
- // result.sampleEnd(); // 事务的终点
- result.setSuccessful(success); // 设置本次事务成功或失败
- }
- return result;
- }
- public abstract boolean runTest(Player player) throws Exception;
- // 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行
- public void teardownTest(JavaSamplerContext context) {
- result.sampleEnd(); // 事务的终点
- robotId = context.getIntParameter("startId");
- GameClient gameClient = player.getGameClient();
- try {
- PlayerManager.getInstance().remove(gameClient.getChannelId());
- gameClient.disconnect();
- } catch (ServiceException e) {
- }
- }
- }
实现具体的压力测试类:
- public class ShootRequest extends AbstractJmeterClient {
- private static final Logger logger = LogManager
- .getLogger(ShootRequest.class);
- private int[] array = { 1, 5, 10, 20, 30, 40, 50, 100 };
- private static int token = 0;
- @Override
- public boolean runTest(Player player) throws Exception {
- // KeepAlive_S2C_Msg ret=client.keepAlive(msg.build());
- <span style="white-space:pre"> </span>//具体射击逻辑实现
- return true;
- }
- }
用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