????宏夏Coding網(wǎng)站,致力于為編程學(xué)習(xí)者、互聯(lián)網(wǎng)求職者提供最需要的內(nèi)容!網(wǎng)站內(nèi)容包括求職秘籍,葵花寶典(學(xué)習(xí)筆記),資源推薦等內(nèi)容。在線閱讀:https://hongxiac.com????
需求
現(xiàn)在有一個(gè)秒殺優(yōu)惠券的接口,需要模擬1000個(gè)不同登錄用戶下的秒殺場(chǎng)景,測(cè)試這個(gè)接口的性能。(黑馬點(diǎn)評(píng)項(xiàng)目秒殺接口多用戶壓力測(cè)試)
分析
1.如何模擬這1000個(gè)用戶?
我們可以使用for循環(huán)在數(shù)據(jù)庫(kù)中批量添加這1000個(gè)用戶,然后需要對(duì)這1000個(gè)用戶進(jìn)行登錄以獲取這1000個(gè)用戶的token,以便在jmeter發(fā)起的請(qǐng)求頭中攜帶這1000個(gè)token模擬1000個(gè)用戶。
2.如何批量獲取token?
編寫(xiě)腳本發(fā)起1000個(gè)登錄請(qǐng)求,并將響應(yīng)的token寫(xiě)入txt文件中。
實(shí)現(xiàn)
在編寫(xiě)腳本之前,我先聲明本項(xiàng)目的登錄流程、接口格式、響應(yīng)格式,方便大家進(jìn)行參照和修改。
1.登錄接口:
本項(xiàng)目使用的是手機(jī)號(hào)和驗(yàn)證碼登錄方式,這兩個(gè)參數(shù)攜帶在請(qǐng)求體(requestbody)中,而不是請(qǐng)求參數(shù)中(url路徑中),如果根據(jù)手機(jī)號(hào)登錄,需要將驗(yàn)證驗(yàn)證碼的代碼注釋掉(即注釋掉驗(yàn)證邏輯),以便直接根據(jù)手機(jī)號(hào)登錄而無(wú)需驗(yàn)證。
? ?/**
? ? * 登錄功能
? ? * @param loginForm 登錄參數(shù),包含手機(jī)號(hào)、驗(yàn)證碼;或者手機(jī)號(hào)、密碼
? ? */
? ?@PostMapping("/login")
? ?public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){
? ? ? ?String phone = loginForm.getPhone();
? ? ? ?String code = loginForm.getCode();
? ? ? ?if(phone == null){
? ? ? ? ? ?return Result.fail("手機(jī)號(hào)為空!");
? ? ? }
// ? ? ? if(code == null){
// ? ? ? ? ? return Result.fail("驗(yàn)證碼為空!");
// ? ? ? }
? ? ? ?return userService.login(loginForm, session);
? }
2.登錄流程:
用戶登錄成功后,服務(wù)端會(huì)將token作為data數(shù)據(jù)返回給客戶端,并將token存儲(chǔ)到Redis中。之后客戶端將token添加到請(qǐng)求頭Authorization中,每次發(fā)起請(qǐng)求都需要攜帶該請(qǐng)求頭,后端攔截器會(huì)根據(jù)請(qǐng)求頭進(jìn)行用戶身份驗(yàn)證。
3.響應(yīng)格式:
用戶登錄成功服務(wù)端響應(yīng)格式
{"success":true,"data":"301130fd-7e25-4c93-8a79-9eb7d54c6fed"}//響應(yīng)體
批量獲取token腳本(Java)
思路:使用userService從數(shù)據(jù)庫(kù)中獲取用戶集合(這里使用的是Mybatis-plus),遍歷集合中的每個(gè)用戶,將用戶的手機(jī)號(hào)添加到請(qǐng)求體中,使用Java的Http客戶端發(fā)起請(qǐng)求。之后從json響應(yīng)體中獲取token并寫(xiě)入txt文件中。
編寫(xiě)測(cè)試類(lèi)(即腳本):
package com.hmdp.utils;
?
import com.hmdp.entity.User;
import com.hmdp.service.IUserService;
?
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
?
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
?
import java.io.BufferedWriter;
import java.io.FileWriter;
?
import java.util.List;
@SpringBootTest
public class UserLoginBatch {
?
? ?@Autowired
? ?private IUserService userService;
? ?
? ?@Test
? ?public void function(){
? ? ? ?String loginUrl = "http://localhost:8080/api/user/login"; // 替換為實(shí)際的登錄URL
? ? ? ?String tokenFilePath = "tokens.txt"; // 存儲(chǔ)Token的文件路徑
? ? ?
? ? ? ?try {
? ? ? ? ? ?HttpClient httpClient = HttpClients.createDefault();
?
? ? ? ? ? ?BufferedWriter writer = new BufferedWriter(new FileWriter(tokenFilePath));
?
? ? ? ? ? ?// 從數(shù)據(jù)庫(kù)中獲取用戶手機(jī)號(hào)
? ? ? ? ? ?List<User> users = userService.list();
?
? ? ? ? ? ?for(User user : users) {
? ? ? ? ? ? ? ?String phoneNumber = user.getPhone();
?
? ? ? ? ? ? ? ?// 構(gòu)建登錄請(qǐng)求
? ? ? ? ? ? ? ?HttpPost httpPost = new HttpPost(loginUrl);
? ? ? ? ? ? ? ?//(1.如果作為請(qǐng)求參數(shù)傳遞)
? ? ? ? ? ? ? ?//List<NameValuePair> params = new ArrayList<>();
? ? ? ? ? ? ? ?//params.add(new BasicNameValuePair("phone", phoneNumber));
? ? ? ? ? ? ? ?// 如果登錄需要提供密碼,也可以添加密碼參數(shù)
? ? ? ? ? ? ? ?// params.add(new BasicNameValuePair("password", "user_password"));
? ? ? ? ? ? ? ?//httpPost.setEntity(new UrlEncodedFormEntity(params));
? ? ? ? ? ? ? ?// (2.如果作為請(qǐng)求體傳遞)構(gòu)建請(qǐng)求體JSON對(duì)象
? ? ? ? ? ? ? ?JSONObject jsonRequest = new JSONObject();
? ? ? ? ? ? ? ?jsonRequest.put("phone", phoneNumber);
? ? ? ? ? ? ? ?StringEntity requestEntity = new StringEntity(
? ? ? ? ? ? ? ? ? ? ? ?jsonRequest.toString(),
? ? ? ? ? ? ? ? ? ? ? ?ContentType.APPLICATION_JSON);
? ? ? ? ? ? ? ?httpPost.setEntity(requestEntity);
?
? ? ? ? ? ? ? ?// 發(fā)送登錄請(qǐng)求
? ? ? ? ? ? ? ?HttpResponse response = httpClient.execute(httpPost);
?
? ? ? ? ? ? ? ?// 處理登錄響應(yīng),獲取token
? ? ? ? ? ? ? ?if (response.getStatusLine().getStatusCode() == 200) {
? ? ? ? ? ? ? ? ? ?HttpEntity entity = response.getEntity();
? ? ? ? ? ? ? ? ? ?String responseString = EntityUtils.toString(entity);
? ? ? ? ? ? ? ? ? ?System.out.println(responseString);
? ? ? ? ? ? ? ? ? ?// 解析響應(yīng),獲取token,這里假設(shè)響應(yīng)是JSON格式的
? ? ? ? ? ? ? ? ? ?// 根據(jù)實(shí)際情況使用合適的JSON庫(kù)進(jìn)行解析
? ? ? ? ? ? ? ? ? ?String token = parseTokenFromJson(responseString);
? ? ? ? ? ? ? ? ? ?System.out.println("手機(jī)號(hào) " + phoneNumber + " 登錄成功,Token: " + token);
? ? ? ? ? ? ? ? ? ?// 將token寫(xiě)入txt文件
? ? ? ? ? ? ? ? ? ?writer.write(token);
? ? ? ? ? ? ? ? ? ?writer.newLine();
? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ?System.out.println("手機(jī)號(hào) " + phoneNumber + " 登錄失敗");
? ? ? ? ? ? ? }
? ? ? ? ? }
?
? ? ? ? ? ?writer.close();
? ? ? } catch (Exception e) {
? ? ? ? ? ?e.printStackTrace();
? ? ? }
? }
?
? ?// 解析JSON響應(yīng)獲取token的方法,這里只是示例,具體實(shí)現(xiàn)需要根據(jù)實(shí)際響應(yīng)格式進(jìn)行解析
? ?private static String parseTokenFromJson(String json) {
? ? ? ?try {
? ? ? ? ? ?// 將JSON字符串轉(zhuǎn)換為JSONObject
? ? ? ? ? ?JSONObject jsonObject = new JSONObject(json);
? ? ? ? ? ?// 從JSONObject中獲取名為"token"的字段的值
? ? ? ? ? ?String token = jsonObject.getString("data");
? ? ? ? ? ?return token;
? ? ? } catch (Exception e) {
? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ?return null; // 解析失敗,返回null或者拋出異常,具體根據(jù)實(shí)際需求處理
? ? ? }
? }
}
?
運(yùn)行之后可得到存儲(chǔ)了1000個(gè)用戶token的txt文件
Jmeter工具進(jìn)行壓力測(cè)試
這里使用到了Jmeter工具,如果不懂如何下載使用的后面會(huì)出一篇教程。
定義1000個(gè)線程即1000個(gè)用戶秒殺庫(kù)存100的優(yōu)惠券。
1.定義線程組
2.設(shè)置導(dǎo)入的tokens數(shù)據(jù)文件
3.設(shè)置HTTP信息頭管理器
4.設(shè)置HTTP請(qǐng)求
5.運(yùn)行并得到結(jié)果
100條訂單數(shù)據(jù)
完成測(cè)試?。?!可以根據(jù)結(jié)果進(jìn)行分析啦!
今天的內(nèi)容就介紹到這啦,若對(duì)你有幫助的話就點(diǎn)個(gè)贊??吧~文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-616539.html
關(guān)注博主,寶藏多多~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-616539.html
到了這里,關(guān)于批量獲取用戶token,并使用jmeter對(duì)秒殺接口進(jìn)行壓力測(cè)試(黑馬點(diǎn)評(píng))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!