保姆级教学--黑马点评,批量获取用户登录token及jemeter多线程测试

前言

本文基于黑马点评项目进行编写,对优惠券秒杀接口处用户token的获取和jemeter测试配置进行讲解。

登录过程

controller层

less 复制代码
public class UserController {
    /**
     * 登录功能
     * @param loginForm 登录参数,包含手机号、验证码;或者手机号、密码
     */
    @PostMapping("/login")
    public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){
        // 实现登录功能
        return userService.login(loginForm,session);
    }
}

可以看出请求路径为http://localhost:8081/user/login

service层

ini 复制代码
public Result login(LoginFormDTO loginForm, HttpSession session) {
        // 1.校验手机号
        String phone = loginForm.getPhone();
        if (RegexUtils.isPhoneInvalid(phone)) {
            // 2.如果不符合,返回错误信息
            return Result.fail("手机号格式错误!");
        }
        // 3.从redis获取验证码并校验
/*        String cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);
        String code = loginForm.getCode();
        if (cacheCode == null || !cacheCode.equals(code)) {
            // 不一致,报错
            return Result.fail("验证码错误");
        }*/


        // 4.一致,根据手机号查询用户 select * from tb_user where phone = ?
        User user = query().eq("phone", phone).one();

        // 5.判断用户是否存在
        if (user == null) {
            // 6.不存在,创建新用户并保存
            user = createUserWithPhone(phone);
        }

        // 7.保存用户信息到 redis中
        // 7.1.随机生成token,作为登录令牌
        String token = UUID.randomUUID().toString();
        // 7.2.将User对象转为HashMap存储
        UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
        Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),
                CopyOptions.create()
                        .setIgnoreNullValue(true)
                        .setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));
        // 7.3.存储
        String tokenKey = LOGIN_USER_KEY + token;
        stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
        // 7.4.设置token有效期
        stringRedisTemplate.expire(tokenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);
        // 8.返回token
        return Result.ok(token);
    }

如上注释掉验证码验证的逻辑即可。

编写批量获取用户token脚本

创建一个测试类:

java 复制代码
package com.hmdp;

import org.springframework.boot.test.context.SpringBootTest;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

@SpringBootTest
public class GetTokenTest {

    public static void main(String[] args) {
        String loginUrl = "http://localhost:8081/user/login"; // 登录接口
        int count = 1000; // 生成 1000 个 token

        try (BufferedWriter writer = new BufferedWriter(new FileWriter("tokens.txt"))) {
            for (int i = 0; i < count; i++) {
                // 1. 生成手机号
                String phone = String.format("138%08d", i);

                // 2. 构造 JSON,每次 code 和 password 固定为 "123456"
                String json = String.format(
                        "{"phone":"%s","code":"123456","password":"123456"}",
                        phone
                );

                try {
                    // 3. 调用登录接口
                    HttpURLConnection conn = (HttpURLConnection) new URL(loginUrl).openConnection();
                    conn.setRequestMethod("POST");
                    conn.setDoOutput(true);
                    conn.setRequestProperty("Content-Type", "application/json");

                    try (OutputStream os = conn.getOutputStream()) {
                        os.write(json.getBytes(StandardCharsets.UTF_8));
                    }

                    // 4. 读取响应
                    StringBuilder sb = new StringBuilder();
                    try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
                        String line;
                        while ((line = br.readLine()) != null) {
                            sb.append(line);
                        }
                    }
                    String response = sb.toString();

                    // 5. 提取 token(假设返回格式 {"success":true,"data":"<token>"})
                    String token = response.replaceAll(".*"data"\s*:\s*"([^"]+)".*", "$1");

                    // 6. 写入文件
                    writer.write(token);
                    writer.newLine();
                    System.out.println("生成 token: " + token);

                } catch (Exception e) {
                    System.err.println("请求失败,手机号:" + phone + ",错误:" + e.getMessage());
                }
            }

            System.out.println("已生成 1000 个 token,保存在 tokens.txt");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

可能url也就是请求地址需要更改,按自己所需改一下即可。

运行即可,结果如下图

当然,读者大大可以按需更改count改变用户数量,进行不同压力的测试。

jemeter配置

jemeter的安装就不过多赘述了,去官网下载即可。

添加线程组

添加http请求

并做如下配置:

  1. POST请求;
  2. 端口号为自己服务器的端口号,我这里是8081;
  3. 优惠券的id要在自己的数据库中看,不一定是我这里的11.

添加请求头

先添加一个存放token的文件

复制token.txt的文件路径

右键打开,如下:

添加CSV配置文件

并做如下配置:

  1. 取名,在后面发送http请求时引用,我这里以tokens为例;

  2. 配置tokens.txt的路径。

配置请求头

并做如下配置:

  1. 请求头名称为authorization;
  2. 值为&{tokens},花括号为上述CSA中设置的名字。

添加监听者

这里是看它的总体报告。

至此,批量获取token和测试配置讲解完毕。

相关推荐
IT大白鼠2 天前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz2 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
lbb 小魔仙2 天前
OpenClaw + cpolar 实战:远程 NAS、分享小游戏、RDP,再配置公网 AI 入口
数据库·人工智能·redis·oracle·prometheus
夕除2 天前
redis--018
redis
两锭子2 天前
Redis基础
redis
烟沙九洲2 天前
Redis 缓存穿透、缓存击穿、缓存雪崩
数据库·redis
字节探索2 天前
Redis 只会当缓存用?这 10 大实战场景,让你的系统快到飞起
redis·后端
于樱花森上飞舞2 天前
【Redis】哨兵详解
java·开发语言·数据库·redis
Rain的Java大神之路2 天前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
Wang's Blog2 天前
Java 接入Redis: 通用命令与键管理
java·服务器·redis