一、配置建议
1、有多个请求访问相同IP时,在测试计划下新建HTTP请求默认值,定义默认协议、IP、端口号、内容编码,全局使用默认值,后续请求只需填写路径,降低工作量。
2、多个请求使用不同信息头的情况下就不要建公共信息头,且不要出现公共信息头、请求私有信息头混用的情况,否则会出现无私有信息头的请求在发送时调用临近的私有信息头的情况,导致请求报错。
3、经常会有从不同请求提取返回值作为其他请求的参数的情况,我习惯把这类提供参数的请求统一放到一个线程组里,放在测试计划的开头。
二、操作小技巧
1、存在多个线程组时,如果想跨线程组调用变量(如B线程组要调用A线程组下一个请求定义的变量),可以用beanshell后置处理器,将A线程组请求生成的变量保存为csv文件保存指定路径,在B线程组添加csv数据文件读取指定路径的变量。需要注意的一点是如果变量值是非固定的,在下一次执行测试计划时,B线程组会读取该csv文件的首行(即上一次执行测试计划生成的残留数据),可能导致出错。我的操作是在测试计划的末尾添加一个请求,挂载Beanshell后置处理器,删除本次测试计划执行生成的所有csv文件。
举例建一个获取token的请求,加入正则表达式提取器提取token;
再新建一个Beanshell后置处理器,将提取的变量access_token保存到指定路径,命名为access_token.csv;
内容如下,$(filePath}是引用的一个全局变量,记录的是本地文件夹的值,修改文件路径和文件名即可套用;
FileWriter fstream = new FileWriter("${filePath}/access_token.csv",true);
BufferedWriter out = new BufferedWriter(fstream);
out.write(vars.get("access_token")+"\n");
out.close();
fstream.close();
这样设置后运行该请求,将在指定路径生成access_token.csv文件,保存提取到的token;
另一个线程组的请求要调用access_token时,在线程组下添加csv数据文件设置,读取access_token;
在这两个线程组后面另添加一个线程组,加一个请求去挂载脚本,删除本地的access_token.csv文件。为避免前面线程组在调用access_token.csv时csv已经被删掉的情况,我给这个请求加了定时器(好像在测试计划设置按线程组顺序逐个执行也可以避免这个情况,这两个操作我都做了);
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
StringBuffer fileBuf=new StringBuffer();
String filePar = "${filePath}/access_token.csv";
File myPath = new File( filePar );
if(!myPath.exists())
{
Failure=true;
FailureMessage = "error, check";
}
else
{
Failure=false;
FailureMessage = "delete access_token.csv done!";
myPath.delete();}
到这一步为止完成【提取参数-保存为参数文件-引用参数-删除参数文件】的流程,运行起来干净又卫生。
2、有时需要按一定条件提取返回值,且这样的数据不是以表单形式返回,这种情况可以用JSON提取器提取。举例提取示例机构的magicId,添加JSON提取器,写法为【$.rows.[?(@.organizeIdName="示例机构")].magicId】。提取时注意要提取的值所在的层级,根据实际情况调整提取规则。
{
"msg": "",
"total": 2,
"code": 200,
"success": true,
"rows": [
{
"magicId": "6E8E275A38AE4094AE07236572CC93A1",
"updatedTime": "2022-03-17 14:38:05",
"organizeIdName": "示例机构",
"updatedUserName": "超级管理员",
"createUserName": "超级管理员"
},
{
"magicId": "9e0352e1356911ec8eb20242ac110006",
"updatedTime": "2021-10-25 15:06:13",
"organizeIdName": "",
"updatedUserName": "",
"createUserName": "",
}
]
}
3、当需要提取返回的全部数据的第N项时,可以用JSON提取器提取全部数据,在引用时写为【参数_N】的形式。举例提取返回的全部id,命名参数为newuserid。
其他请求要引用newuserid的第一项(id=509)时,写为${newuserid_1}。
4、上传文件请求。上传各类文件请求基本格式类似,关键点在于1)各类文件用的请求头往往会和请求关联的请求头冲突,因此上传文件的请求如无必要,不要在请求内添加请求头管理器;2)我调试的上传文件请求,都要在高级设置客户端实现方式为java才能使用,否则会出现各种错误,仅供参考。
写上传文件的请求,我是先用谷歌浏览器调试窗口查看文件用的content-type类型(点击请求的view source切换显示格式才能看),将该类型填写到jmeter请求的MIME类型字段。
举例上传图片的请求:
上传xls的请求:
上传PDF的请求: