场景:
某待测文件管理系统,50并发下载大小为500MB的tif格式文件,保存到本地。
遇到的问题:
访问文件下载接口,请求成功响应,但是下载文件保存目录下找不到下载文件。想通过jmeter查看请求详情,可一旦从查看结果树中点击下载请求,jmeter便会卡死。
分析过程:
存在两个问题:
目录下找不到下载文件,有两种可能:
1.文件成功下载保存到本地,但不在该目录
2.文件并没有成功保存到本地
jmeter点击下载请求后卡死,最有可能的原因:
1.下载文件直接在请求的响应中打开,导致jmeter内存溢出,卡死
设计实验,验证猜想,确认问题原因:
1. 通过系统界面,执行下载,发现:
a.点击下载后,浏览器弹出窗口,用户可选择打开或保存
b.选择保存后,文件自动保存到浏览器的下载目录下
通过该实验初步推测,该系统文件下载的保存功能比较依赖于浏览器。
2.从文件管理系下载一个只有几kb大小,且文件名相对特殊的文件(如文件系统中没有可以自己通过记事本制造一个测试文件,上传到文件系统),使用jmeter访问下载接口下载该文件,发现:
a.请求成功后,使用everything工具在本地查找下载的文件,本地无该文件
说明:文件并没有成功保存到本地
b.在查看结果树种点击下载请求,查看请求响应,响应中展示的是下载文件的内容
说明:文件下载接口请求系统中文件,系统直接在请求响应中返回文件
总结:下载请求是成功的,下载脚本是正确的,但由于系统设计的原因,文件下载后并没有自动保存为文件。
要解决的问题:将jmeter请求的响应保存为本地文件。
解决方法:通过在beanshell后置处理器中编写js代码实现。
源码:
import java.io.*;
byte[] result = prev.getResponseData(); //getResponseData()方法获取请求响应数据,prev指上个请求
String file_name = "E:\\download\\test.tif"; //存放文件的位置和文件名
File file = new File(file_name);
FileOutputStream out = new FileOutputStream(file);
out.write(result); //写入到文件
out.close();