最近开始使用jmeter做接口测试,遇到的主要问题在这里记录一下。
测试场景:
线程组1-登录-P1接口用例
线程组2-登录-P2接口用例
如果线程组1和2用同一个用户登录,线程组2用例执行会提示用户登录超时相关信息,这个时候就要考虑线程组1中的参数codeKey和loginCode能在线程组2中使用就解决问题了,另外一种没办法的办法就是用2个账号登陆,这样设置的全局变量数据不能共用了,也很麻烦。
1.线程组1中的参数保存到文件中,线程组2通过读取文件中的数据实现数据共享
线程组1登录用例添加后置处理器beanshell postprocessor。脚本内容如下:
String filePath = System.getProperty("user.dir") + "\\loginMsg.txt";
vars.put("filePath",filePath);
File file = new File(filePath);
try {
if (file.exists()){
file.delete();
}
file.createNewFile();
FileWriter fs = new FileWriter(filePath,true);
BufferedWriter bw = new BufferedWriter(fs);
bw.write(vars.get("codeKey")+"?");
bw.write(vars.get("loginCode"));
bw.write(System.getProperty("line.separator"));
fs.flush();
bw.close();
fs.close();
}catch(IOException e) {
e.printStackTrace();
}
线程组2中通过csv数据文件设置读取文件中的数据,这个也可以实现,但个人觉得没必要这么麻烦。
2.通过函数助手__setProperty和后置处理器beanshell postprocessor实现跨线程参数共享
登录参数codeKey和loginCode

就是把通过正则获取到的${codeKey}值设置为全局变量,并以新的名字newcodeKey来引用

在登录请求添加后置处理器beanshell postprocessor

这样codeKey和loginCode就已经设置为全局变量了。发现用setProperty log中会报错显示变量未定义:ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``${codeKey}; ${loginCode} : Attempt to access property on undefined variable or class name
WARN o.a.j.e.BeanShellPostProcessor: Problem in BeanShell script: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``${codeKey}; ${loginCode} : Attempt to access property on undefined variable or class name
使用vars和props定义beanshell变量没问题,具体什么原因导致的,还不太清楚,有时间再研究一下。
props.put("newCodeKey",vars.get("CodeKey"));
props.put("newLoginCode",vars.get("LoginCode"));
线程组2中使用__P函数来调用以上参数:

这样就实现了多线程组共用同一账号登陆的场景。
避免线程组间用例执行顺序杂乱无章,在测试计划中勾选“独立运行每个线程组”:

