内容概要
1、上传下载的原理
2、如何在jmeter中实现上传、下载
3、上传文件、下载的接口如何做参数化
4、下载接口如何断言
5、保存jmeter下载的文件
6、内容拓展学习
上传下载的原理
上传原理:浏览器将本地文件内容通过HTTP发送到服务端,服务端接受到数据后,创建创建一个文件
下载原理:同上传原理,下载是服务器把文件内容发送客户端,客户端接收到内容后,创建文件储存;
最终来说:传输的是数据而不是文件!
如何在jmeter中实现上传、下载
文件上传方式
表单方式
上传文件、下载的接口如何做参数化
使用CSV配置元件循环读取,脚本准备如下举例,大小用于断言;
注意:大小值的是文件属性里的字节大小。
下载接口如何断言
针对指定文件上传后,再下载时的对比得知,响应头里的Content-Length(这里文件内容的总长度,包括最后的回车)值等于文件的大小。
即,可以使用大小断言进行下载结果的断言
另,不同的接口返回的值可能不一样,可根据实际调试后取不同的断言方式,如下图的请求结果,返回的大小会大于文件的实际大小,是因为这个大小包含了请求头、请求内容等非文件的内容,所以结果上是大于文件的本身,这个时候可以使用大于等于断言。
保存jmeter下载的文件
通过‘上传下载的原理’得知,通过页面下载文件时,创建文件其实是浏览器的行为,并不是HTTP本身提供的能力,而JMeter本身也不会自动帮我们创建。
所以,如下图,请求下载接口后,得到是一串看不懂的数据流,这说明下载接口请求是没有问题的,若想要把下载请求到的内容展示出来,需要在JMeter里额外做处理。
添加BeanShell 后置处理程序并配置:
文件类型需跟进实际进行修改,或也可根据链接进行动态生成~
import java.io.*;
byte[] result = prev.getResponseData(); //这个是获取到请求返回的数据,prev是获取上个请求的返回
//单个下载
//String file_name = "D:\\apache-jmeter-5.1.1\\data\\7891.xls";
//批量下载
String file_name = "D:\\"+System.currentTimeMillis()+".xlsx"; //代表存放文件的位置和文件名,将每次下载的文件都重命名,后缀为xlsx(防止相同文件被覆盖)
File file = new File(file_name);
FileOutputStream out = new FileOutputStream(file);
out.write(result);
out.close();
下载结果展示:
变量形式下载文件
期望通过${num},使每次下载的文件名自动递增,如:
import java.io.*;
byte[] result = prev.getResponseData();
String file_name = "D:\\六年级\\"+${num}+".jpg";
File file = new File(file_name);
FileOutputStream out = new FileOutputStream(file);
out.write(result);
out.close();
但是发现会有这样的错误:
2022-08-27 11:06:11,121 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: `` import java.io.*; byte[] result = prev.getResponseData(); //这个是获取到请求返回的数据,prev . . . '' Token Parsing Error: Lexical error at line 9, column 25. Encountered: "\u516d" (20845), after : "\"D:\\"
2022-08-27 11:06:11,121 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: `` import java.io.*; byte[] result = prev.getResponseData(); //这个是获取到请求返回的数据,prev . . . '' Token Parsing Error: Lexical error at line 9, column 25. Encountered: "\u516d" (20845), after : "\"D:\\"
解决办法是在文件路径再增加一个 \ ,如下:
import java.io.*;
byte[] result = prev.getResponseData();
String file_name = "D:\\\六年级\\\"+${num}+".jpg";
File file = new File(file_name);
FileOutputStream out = new FileOutputStream(file);
out.write(result);
out.close();
其实没明白为什么会这样,百度说是$转义了。
内容拓展学习
1、上传文件multipart form-data与boundary 说明
4、文件的上传和下载