性能测试有时会遇到这样的场景:需要测试某系统并发查询时的性能,但是该系统的查询请求要求用户登录。
一般情况下,要求用户登录的请求中会包含session id,token之类的识别码,服务器通过对比这类识别码来核验用户身份。这类识别码一般会在用户成功登陆时做为登陆请求返回信息的一部分返回给用户。一般遇到这种情况,就需要通过关联来完成这类网络请求的模拟了。
关联:在Jmeter中,可以在登陆取样器中通过边界提取器或者正则提取器来提取session id,将提取到的session id作为参数保存。这样后续需要登录的请求就可以调用获取到的session id,完成网络请求了。
这种最基础的关联存在一个问题。那就是作为参数保存的session id不能跨线程使用。也就是说在同一个线程组内,若想实现需要验证的请求,必须先登陆。虽然可以令每个线程只登陆一次,然后循环去做目标请求。但是难免也会有误差。这里提供一种实现方法。
主要思路是通过set up线程组专门实现登陆请求,使用BeanShell组件将获取到的session id保存到txt文件中,主线程执行目标请求时从txt文件中获取session id。
关键点在BeanShell脚本的编写:
public static void save_id(){
String title="id";
String getdata="${id}"; //可以直接从Jmeter中获取变量值
String file_name="D:/id.txt";
try{
if(${__iterationNum}==1){
FileWriter writer=new FileWriter(file_name);
writer.write(title+"\r\n"+getdata+"\r\n");
writer.flush();
writer.close();
}
else if(${__iterationNum}==10){
FileWriter writer=new FileWriter(file_name,true);
writer.write(getdata);
writer.flush();
writer.close();
}
else{
FileWriter writer=new FileWriter(file_name,true);
writer.write(getdata+"\r\n");
writer.flush();
writer.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
save_id();