jmeter详解性能测试

博主介绍:  


🩵✌资深程序员陈哥,拥有7年开发经验,粉丝量超过11万,作为优质Java创作者,专注于Java技术、小程序开发以及毕业项目实战。✌🩵

🍅文末获取源码联系QQ924144980 🍅

Java精品实战案例《1000套》

2024-2026年Java毕业设计1000个热门选题推荐✅

💫文章末尾获取源码+数据库💫
如果感兴趣,可以先收藏起来。另外,在毕业设计选题(提供免费咨询和指导)、项目开发、以及论文编写等相关问题上,大家都可以随时留言咨询我。希望能够帮助到更多的同学。

目录:

博主介绍:  

目录:

技术栈介绍:

需求分析:

系统功能实现截图:

部分代码参考:  

项目论文:

源码获取:


技术栈介绍:


开发语言:Java
后端框架:Spring boot
前端:react
数据库:mysql
系统架构:B/S
开发工具:idea,vscode

Apache JMeter 是一个开源的性能测试工具,主要用于测试 Web 应用的负载、压力和性能。JMeter 支持多种协议,如 HTTP、HTTPS、SOAP、FTP、JDBC、LDAP 等,适用于各种类型的性能测试。

 1. 性能测试的基本概念


性能测试主要用于评估应用在特定负载下的响应时间、并发处理能力、稳定性等。常见的性能测试类型包括:

- 负载测试(Load Testing):测试系统在特定负载下的性能表现。

- 压力测试(Stress Testing):测试系统超出设计负载时的表现,找出系统的崩溃点。

- 容量测试(Capacity Testing):确定系统在保证性能前提下能够处理的最大负载。

- 稳定性测试(Stability Testing):长时间运行下的系统性能和稳定性。

 2. 性能指标


在性能测试中,常见的性能指标包括:

- 响应时间:系统对请求的响应时间,一般以毫秒(ms)为单位。

- 吞吐量:单位时间内系统处理的请求数,通常以每秒请求数(TPS)或每秒事务数(Transactions Per Second)表示。

- 并发用户数:同时对系统发起请求的用户数量。

- 错误率:测试过程中请求失败的百分比。

- 资源使用率:CPU、内存、磁盘、网络等系统资源的使用情况。

 3. JMeter 主要元件介绍


在 JMeter 中,测试计划由一组元件组成,每个元件都有特定的功能。以下是 JMeter 中的一些主要元件:

1. 测试计划(Test Plan):
   - 测试计划是 JMeter 中的最高级别元素,它包含了所有测试场景和测试脚本。

   - 测试计划中可以定义用户变量、线程组、配置元件等。

2. 线程组(Thread Group):
   - 线程组定义了用户的行为模拟,指定测试中虚拟用户的数量、启动方式、执行时间等。

   - 线程组中的每个线程代表一个虚拟用户,线程组可以包含多个采样器。

3. 采样器(Sampler):
   - 采样器用于模拟用户请求,支持多种协议如 HTTP、FTP、JDBC、SOAP 等。

   - 常用的采样器包括 HTTP 请求、JDBC 请求、FTP 请求等。

4. 逻辑控制器(Logic Controller):
   - 逻辑控制器用于控制采样器的执行顺序和条件,可以构建复杂的测试场景。

   - 常用的逻辑控制器包括 If Controller、Loop Controller、Transaction Controller 等。

5. 监听器(Listener):
   - 监听器用于收集和展示测试结果,支持图表、表格、日志等多种格式的结果展示。

   - 常用的监听器包括 View Results Tree、Aggregate Report、Summary Report 等。

6. 定时器(Timer):
   - 定时器用于控制请求之间的等待时间,模拟真实用户的请求间隔。

   - 常用的定时器包括 Constant Timer、Gaussian Random Timer、Uniform Random Timer 等。

7. 断言(Assertion):
   - 断言用于验证响应结果是否符合预期,如响应码、响应时间、响应内容等。

   - 常用的断言包括响应断言、持续时间断言、XPath 断言等。

8. 配置元件(Configuration Element):
   - 配置元件用于配置和共享测试计划中的通用设置,如 HTTP Header Manager、CSV Data Set Config 等。

   - 常用的配置元件包括 User Defined Variables、HTTP Cookie Manager、HTTP Request Defaults 等。

9. 后置处理器(Post-Processor):
   - 后置处理器用于在请求执行后对响应数据进行处理,如提取信息、记录日志等。

   - 常用的后置处理器包括 Regular Expression Extractor、JSON Extractor、XPath Extractor 等。

10. 前置处理器(Pre-Processor):
    - 前置处理器在请求执行前运行,用于设置一些环境或处理特殊情况。

    - 常用的前置处理器包括 HTTP URL Re-writing Modifier、User Parameters 等。

4 JMeter 性能测试实战案例及代码示例


下面是一个完整的 JMeter 性能测试实战案例,涵盖从测试计划的创建到结果分析的全过程。这个案例将模拟对一个电商网站的登录和商品搜索功能的性能测试。

 1. 准备环境
假设我们要测试一个运行在 `http://example.com` 的电商网站,测试内容包括用户登录和商品搜索。我们将使用 JMeter 进行性能测试。

 2. 创建测试计划
 2.1 添加线程组
- 线程组:设定虚拟用户数量、Ramp-Up 时间和循环次数。

- 参数设置:

  - 线程数(Number of Threads):100

  - Ramp-Up 时间(Ramp-Up Period):10 秒

  - 循环次数(Loop Count):10 次

 2.2 添加 HTTP 请求默认值
- 设置目标服务器的基本信息,减少重复输入。

- 参数设置:

  - 服务器名称或 IP(Server Name or IP):`example.com`

  - 端口号(Port Number):80(假设使用 HTTP 协议)

 3. 模拟用户登录
 3.1 添加 HTTP 请求
- 添加一个 HTTP 请求,模拟用户登录。

- 参数设置:

  - 请求路径(Path):`/login`

  - 请求方法(Method):POST

  - 参数(Parameters):

    - `username=sampleUser`

    - `password=samplePassword`

3.2 添加正则表达式提取器
从登录响应中提取会话 ID,以便在后续请求中使用。

参数设置:

正则表达式(Regular Expression):sessionId=(.+?)

模板(Template):$1$

匹配数字(Match No.):0(提取第一个匹配的值)

变量名称(Reference Name):sessionId

4. 模拟商品搜索
4.1 添加 HTTP 请求
添加一个 HTTP 请求,模拟用户在登录后搜索商品。

参数设置:

请求路径(Path):/search

请求方法(Method):GET

参数(Parameters):

query=smartphone

sessionId=${sessionId}

5. 添加监听器以查看结果
5.1 添加结果树查看器
用于查看每个请求的详细响应,帮助调试和分析。

5.2 添加汇总报告
用于生成测试的汇总数据,查看关键性能指标如吞吐量、响应时间和错误率。

6. 运行测试
点击 JMeter 工具栏上的绿色箭头按钮,启动测试计划。

监控监听器中的实时数据,确保测试顺利进行。

7. 分析测试结果
7.1 响应时间分析
查看 Summary Report 中的 Average 列,确定平均响应时间是否在可接受范围内。

7.2 吞吐量分析
查看 Summary Report 中的 Throughput 列,评估系统在不同负载下的处理能力。

7.3 错误率分析
检查 Summary Report 中的 Error % 列,确保错误率在可接受范围内。

8. 优化与重测
根据初次测试的结果,可以采取以下措施优化系统性能:

优化服务器端代码:减少响应时间,提升处理效率。

调整数据库索引:加速查询,减少数据库瓶颈。

增加缓存:通过引入缓存减少数据库查询次数。

部分代码参考:  

package com.entity;
 
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 
/**
 * 用户实体类
 */
@TableName("users")
public class UserEntity implements Serializable {
    private static final long serialVersionUID = 1L;
 
    @TableId(type = IdType.AUTO)
    private Long id;
 
    /**
     * 用户账号
     */
    private String username;
 
    /**
     * 密码(已加密)
     */
    private String password;
 
    /**
     * 用户类型
     */
    private String role;
 
    private Date addtime;
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = new BCryptPasswordEncoder().encode(password);
    }
 
    public String getRole() {
        return role;
    }
 
    public void setRole(String role) {
        this.role = role;
    }
 
    public Date getAddtime() {
        return addtime;
    }
 
    public void setAddtime(Date addtime) {
        this.addtime = addtime;
    }
}
 
@RestController
@RequestMapping("users")
public class UserController {
 
    @Autowired
    private UserService userService;
 
    @Autowired
    private TokenService tokenService;
 
    /**
     * 用户登录
     */
    @IgnoreAuth
    @PostMapping("/login")
    public R login(String username, String password, String captcha, HttpServletRequest request) {
        UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
        if (user == null || !new BCryptPasswordEncoder().matches(password, user.getPassword())) {
            return R.error("账号或密码不正确");
        }
        String token = tokenService.generateToken(user.getId(), username, "users", user.getRole());
        return R.ok().put("token", token);
    }
 
    /**
     * 用户注册
     */
    @IgnoreAuth
    @PostMapping("/register")
    public R register(@RequestBody UserEntity user) {
        if (userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) != null) {
            return R.error("用户已存在");
        }
        user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
        userService.insert(user);
        return R.ok();
    }
 
    /**
     * 用户退出
     */
    @GetMapping("/logout")
    public R logout(HttpServletRequest request) {
        request.getSession().invalidate();
        return R.ok("退出成功");
    }
 
    /**
     * 密码重置
     */
    @IgnoreAuth
    @PostMapping("/resetPass")
    public R resetPass(String username) {
        UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
        if (user == null) {
            return R.error("账号不存在");
        }
        user.setPassword(new BCryptPasswordEncoder().encode("123456"));
        userService.updateById(user);
        return R.ok("密码已重置为:123456");
    }
}

项目论文:


选择我的理由:
    作为一名拥有多年软件开发经验的程序员,我亲自参与和负责每一个项目的开发与辅导,避免中介的介入,确保了高效的直接对接。同时博主与高校紧密合作,积累了丰富的经验,开发和辅导了多名学生的项目。在博主这里通过一对一指导,为学生提供最专业和实用的技术支持。
 

    自己开发的网站:为了方便同学们选题和定制,博主开发了自己的网站,同学们可以在上面选题参考。

源码获取:

2025-2026年最值得选择的Java毕业设计选题大全:1000个热门选题推荐✅✅✅

Java精品实战案例《1000套》

下方名片联系我即可~
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值