前言
本文基于黑马点评项目进行编写,对优惠券秒杀接口处用户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请求

并做如下配置:
- POST请求;
- 端口号为自己服务器的端口号,我这里是8081;
- 优惠券的id要在自己的数据库中看,不一定是我这里的11.

添加请求头
先添加一个存放token的文件
复制token.txt的文件路径
右键打开,如下:

添加CSV配置文件

并做如下配置:
-
取名,在后面发送http请求时引用,我这里以tokens为例;
-
配置
tokens.txt的路径。

配置请求头

并做如下配置:
- 请求头名称为
authorization; - 值为
&{tokens},花括号为上述CSA中设置的名字。

添加监听者

这里是看它的总体报告。
至此,批量获取token和测试配置讲解完毕。