保姆级教学--黑马点评,批量获取用户登录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和测试配置讲解完毕。

相关推荐
星辰_mya8 小时前
redis集群
数据库·redis·缓存
我爱学习好爱好爱13 小时前
Docker Compose部署SpringBoot2+Vue3+redis项目(Rockylinux9.6)
redis·docker·容器
典孝赢麻崩乐急14 小时前
Redis复习-------Redis数据类型
redis
Hello World呀17 小时前
登录时,redis出现错误
数据库·redis·缓存
企鹅侠客17 小时前
第02章—先导基础篇:初识Redis
数据库·redis·缓存
DemonAvenger18 小时前
Redis哨兵模式详解:自动故障转移与高可用保障
数据库·redis·性能优化
典孝赢麻崩乐急18 小时前
Redis复习----------Redis超高性能的原因
数据库·redis·学习·缓存
汪不止18 小时前
【 分布式唯一业务单号生成方案:Redis + 数据库双保险架构】
数据库·redis·分布式
典孝赢麻崩乐急18 小时前
Redis复习-------Redis事务
数据库·redis·缓存
橘子真甜~18 小时前
Reids命令原理与应用3 - Redis 主线程,辅助线程与存储原理
网络·数据库·redis·缓存·线程·数据类型·存储结构