刚入门Java的硕士宝宝,实验室没什么Java项目,看到网上的秒杀项目,跟着学习并且记录一下,可能错误会很多,欢迎大家指正。
前言
本文介绍系统压测模块,具体详细介绍JMeter的使用、用户测试、正式压测。
`
一、JMeter的使用
JMeter 主要用于对 Web 应用程序、Web 服务和数据库等进行性能测试、负载测试和压力测试,以评估系统的性能、稳定性和可靠性。
- 创建测试计划:
在 JMeter GUI 中,创建一个新的测试计划(Test Plan)。
右键点击测试计划,选择 “Add” -> “Threads (Users)” -> “Thread Group”,创建一个线程组,用于模拟并发用户。
- 添加 Sampler:
在线程组下右键点击,选择 “Add” -> “Sampler”,选择相应的 Sampler,比如 HTTP 请求。
配置 Sampler,输入需要测试的目标地址和其他参数。
- 添加 Listener:
在线程组下右键点击,选择 “Add” -> “Listener”,选择相应的 Listener,用于查看测试结果。
常用的 Listener 包括 Summary Report、View Results Tree、Graph Results 等。
- 配置线程组参数:
在线程组上右键点击,选择 “Add” -> “Config Element”,可以配置线程组的参数,如线程数、循环次数等。
运行测试:
配置完成后,点击工具栏上的 “Start” 按钮,或者按下 Ctrl+R(Windows)/Command+R(Mac)键,开始运行测试。
JMeter 会模拟多个并发用户发起请求,并收集相应的性能数据。
- 查看测试结果:
在 Listener 中可以查看测试结果,包括响应时间、吞吐量、错误率等信息。
可以通过图表、表格等方式查看测试结果,以便分析应用程序的性能和稳定性。
二、自定义变量
准备测试接口(用户信息):
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/info")
@ResponseBody
public RespBean info(User user){
return RespBean.success(user);
}
}
三、正式压测
生成用户工具类(压测秒杀接口):
public class UserUtil {
private static void createUser(int count) throws Exception {
List<User> users = new ArrayList<>(count);
//生成用户
for (int i = 0; i < count; i++) {
User user = new User();
user.setId(13000000000L + i);
user.setLoginCount(1);
user.setUsername("user" + i);
user.setRegisterDate(new Date());
user.setSalt("1a2b3c");
user.setPassword(MD5Util.inputPassToDbPass("123456", user.getSalt()));
users.add(user);
}
System.out.println("create user");
//插入数据库
Connection conn = getConn();
String sql = "insert into t_user(login_count, username, register_date,
salt, password, id)values(?,?,?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
pstmt.setInt(1, user.getLoginCount());
pstmt.setString(2, user.getUsername());
pstmt.setTimestamp(3, new Timestamp(user.getRegisterDate().getTime()));
pstmt.setString(4, user.getSalt());
pstmt.setString(5, user.getPassword());
pstmt.setLong(6, user.getId());
pstmt.addBatch();
}
pstmt.executeBatch();
pstmt.close();
conn.close();
System.out.println("insert to db");
//登录,生成token
String urlString = "http://localhost:8080/login/doLogin";
File file = new File("C:\\Users\\Administrator\\Desktop\\config.txt");
if (file.exists()) {
file.delete();
}
RandomAccessFile raf = new RandomAccessFile(file, "rw");
file.createNewFile();
raf.seek(0);
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
URL url = new URL(urlString);
HttpURLConnection co = (HttpURLConnection) url.openConnection();
co.setRequestMethod("POST");
co.setDoOutput(true);
OutputStream out = co.getOutputStream();
String params = "mobile=" + user.getId() + "&password=" + MD5Util.inputPassToFormPass("123456");
out.write(params.getBytes());
out.flush();
InputStream inputStream = co.getInputStream();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte buff[] = new byte[1024];
int len = 0;
while ((len = inputStream.read(buff)) >= 0) {
bout.write(buff, 0, len);
}
inputStream.close();
bout.close();
String response = new String(bout.toByteArray());
ObjectMapper mapper = new ObjectMapper();
RespBean respBean = mapper.readValue(response, RespBean.class);
String userTicket = ((String) respBean.getObj());
System.out.println("create userTicket : " + user.getId());
String row = user.getId() + "," + userTicket;
raf.seek(raf.length());
raf.write(row.getBytes());
raf.write("\r\n".getBytes());
System.out.println("write to file : " + user.getId());
}
raf.close();
System.out.println("over");
}
private static Connection getConn() throws Exception {
String url = "jdbc:mysql://localhost:3306/seckill? useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "root";
String driver = "com.mysql.cj.jdbc.Driver";
Class.forName(driver);
return DriverManager.getConnection(url, username, password);
}
public static void main(String[] args) throws Exception {
createUser(5000);
}
}
总结
以上就是今天要讲的内容,本文简单介绍了系统压测模块,具体参考 乐字节 Java电商秒杀项目。