1.Jmeter基本使用
為了驗證秒殺優(yōu)化的效果,我們使用了Jmeter進行壓力測試。這里就簡單總結(jié)下Jmeter的基本使用。
-
首先添加一個測試計劃,點擊File->New。右鍵Test Plan,Add->Threads->Thread Group添加線程組。在這里,我們設(shè)置線程個數(shù)為5000,0s內(nèi)創(chuàng)建好,即立即創(chuàng)建并發(fā)起請求。
線程組 -
添加一個默認請求,設(shè)置請求協(xié)議 ip 端口等基本信息,這樣后面的請求就可以不用再輸入這些參數(shù)了。右鍵Thread Group,Add->Config Element->Http Request Defaults
默認請求 -
添加一個聚合報告,用于展示測試結(jié)果。右鍵Thread Group,Add->Listener->Aggregate Report
聚合報告 -
添加一個待測試的Http請求。右鍵Thread Group,Add->Sampler->Http Request。填入method path等基本信息,由于之前已經(jīng)建了一個默認的請求,所以ip 端口等信息就不需要重復(fù)輸入了。
Http請求 -
點擊Start(即頂部的綠色箭頭),就可以開始測試了
開始測試
2.模擬登錄用戶
因為我們的請求都要求在登錄的情況下才能進行,否則攔截器會直接重定向到登錄頁面。所以需要在請求時設(shè)置cookie信息,模擬已登錄的用戶。
- 首先向MySQL插入5000個用戶,并使用這5000個用戶登錄系統(tǒng),將生成的JSESSIONID寫入文件。
/**
* 準備Jmeter測試需要的數(shù)據(jù)
*
*/
@Controller
public class BeforeTest {
@Autowired
UserService userService;
/**
* 生成用戶,并插入數(shù)據(jù)庫
*
* @param count
* @throws Exception
*/
@RequestMapping("/prepareUser")
@ResponseBody
public String prepareUser(int count) throws Exception {
List<User> users = new ArrayList<User>(count);
// 生成用戶
for (int i = 1; i <= count; i++) {
User user = new User();
user.setId(i);
user.setName("user" + i);
user.setPassword("admin");
users.add(user);
}
System.out.println("create user");
// 插入數(shù)據(jù)庫
userService.insert(users);
System.out.println("insert to db");
return "success";
}
/**
* 用數(shù)據(jù)庫中的所有用戶執(zhí)行登錄,并將sessionId存入文件中
* @param users
* @param session
* @throws IOException
*/
@RequestMapping("/prepareLoginUser")
@ResponseBody
public String prepareLoginUser(HttpSession session) throws IOException {
List<User> users = userService.findAllUser();
File file = new File("D:/tokens.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("http://localhost:8080/prepareLogin");
HttpURLConnection co = (HttpURLConnection)url.openConnection();
co.setRequestMethod("POST");
co.setDoOutput(true);
OutputStream out = co.getOutputStream();
String params = "name="+user.getName()+"&password="+user.getPassword();
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 sessionId = new String(bout.toByteArray());
raf.seek(raf.length());
raf.write(sessionId.getBytes());
raf.write("\r\n".getBytes());
}
raf.close();
return "success";
}
@RequestMapping("/prepareLogin")
@ResponseBody
public String prepareLogin(HttpServletRequest request,HttpSession session) {
User paramUser = new User(request.getParameter("name"), request.getParameter("password"));
User dbUser = userService.login(paramUser);
if(dbUser != null) {
//登錄成功,將用戶放入session
session.setAttribute("user", dbUser);
}
return session.getId();
}
}
-
在Jmeter中添加CSV配置文件,指向上一步生成的配置文件。Thread Group右鍵,Add->Config Element->CSV Data Set Config。設(shè)置變量名,后面會通過該變量名來引用;設(shè)置變量分割符,當然我們這里只有一個變量。
添加CSV配置文件

-
為請求添加cookie信息,右鍵Thread Group,Add->Config Element->Http Cookie Manager。設(shè)置cookie的名字;值為上一步驟的變量名的引用,像EL表達式一樣,也是${};設(shè)置domain path。
添加cookie
這樣在所有請求中,都會攜帶已登錄用戶的cookie信息。
完整的jmeter配置文件,可以參看bargainsDash.jmx
附:所有代碼在github上






