JMeter压力测试总结

简介: JMeter压力测试总结

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设为3000Ramp 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());
    //具体射击逻辑实现
    return true;
  }
}


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

5.添加Listener

//TODO

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

目录
相关文章
|
2月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【10月更文挑战第1天】Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
170 3
|
3月前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
124 2
|
4月前
|
测试技术 持续交付 Apache
深度挖掘:Python性能测试中JMeter与Locust的隐藏技能🔍
【8月更文挑战第5天】随着软件规模扩大,性能测试对系统稳定性至关重要。Apache JMeter和Locust是两大主流工具,各有千秋。本文探索它们在Python环境下的进阶用法,挖掘更多性能测试潜力。JMeter功能强大,支持多种协议,可通过命令行模式执行复杂测试计划,并与Python集成实现动态测试数据生成。Locust基于Python,通过编写简洁脚本模拟HTTP请求,支持自定义请求及与Python库深度集成。掌握这些技巧可实现高度定制化测试场景,有效识别性能瓶颈,提升应用稳定性。
133 1
|
4月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【8月更文挑战第5天】性能测试确保应用高负载下稳定运行。Apache JMeter与Locust是两大利器,助力识别解决性能瓶颈。本文介绍这两款工具的应用与优化技巧,并通过实战示例展示性能测试流程。首先,通过JMeter测试静态与动态资源;接着,利用Locust的Python脚本模拟HTTP请求。文中提供安装指南、命令行运行示例与性能优化建议,帮助读者掌握性能测试核心技能。
142 0
|
1月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
79 3
|
1月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
60 1
|
3月前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
120 10
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
2月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【10月更文挑战第1天】告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
85 4
|
3月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
270 7
Jmeter实现WebSocket协议的接口测试方法
|
3月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【9月更文挑战第10天】随着软件应用的不断扩展,性能测试成为确保系统稳定运行的关键环节。本文通过对比Apache JMeter和Locust,探讨了如何在Python环境中利用这两款工具挖掘更多性能测试潜力。JMeter是一款成熟且功能强大的开源工具,支持多种协议,适用于各种应用的测试;而Locust则基于Python,通过简单脚本模拟HTTP请求,更适合Web应用测试。
106 3