在看普泽关于pezybase的测试报告的时候,发现里面有用到jmeter(http协议)并发测试下载文件,考虑到后面可能需要在公司pezybase的并发下载,把之前使用过的loadrunner下载文件脚本重新运行和整理一下。
一、http协议
loadrunner使用http协议是无法录制到下载过程的,只会往服务器发送一个下载请求,其实服务器已经把数据返回给客户端了,但是loadrunner是录制不到保存文件到本地这个过程,所以就是需要我们手动把收到的内容保存打本地即可。(http协议上传文件的完整过程是可以直接录制的,在UC中已经使用过)。
注意:下面脚本中用到的LR函数如下,还使用了一些C语言基本的文件操作方法。在脚本中还可以加入一些判断来进行事务是否成功以及文件大小是否正确等的判断;
web_reg_save_param:关联函数,放在http请求前面,保存请求返回的内容;
web_url:http请求函数,向指定的url发送请求,下载文件也就是直接往下载链接发送请求;
web_get_int_property:获取下载请求返回的文件长度;
web_set_max_html_param_len:设置web_set_max_html_param_len方法中参数的最大长度,要求大于需要下载文件的大小;
Action() { int flen;//定义一个整型变量保存获得文件的大小 long fileContent;//保存文件句柄,也就是文件的内容 char fileName[]="";//保存文件路径及文件名 char * strNumber; strNumber=lr_eval_string("test{NewParam}");//获取一个随机数并转化成字符串 ,NewParam设置参数为随机类型,这里根据自己需要进行参数化设置 strcat(fileName,"C:/test/");//将路径保存到file变量中 strcat(fileName,strNumber); //拼接文件名 strcat(fileName,".pdf");//拼接后缀名,根据需要设置,最后就完成了完整的路径和文件名 web_set_max_html_param_len("20000");//设置参数的最大长度,注意该值必须大于文件的大小 //使用关联函数获取下载文件的内容,在这里不定义左右边界,获得服务器响应的所有内容 web_reg_save_param("fcontent", //返回的内容全部存储在fcontent这个参数中 "LB=", "RB=", "SEARCH=BODY", LAST); lr_start_transaction("下载文件"); #设置的事务开始点 #web_url方法你可以直接编写,也可以在启动录制的时候,输入下载链接URL进行简单录制,主要注意URL和Resource这两个参数即可; web_url("file.php", #函数名,没有实际作用 "URL=http://forum.ubuntu.org.cn/download/file.php?id=129973&sid=78fc8d76767ef49b606595824ceb963d", #下载链接,也就是该链接输入到浏览器会提示下载,获取方法很多; "Resource=1", #1表示是下载资源,0表示是页面资源 "RecContentType=application/octetstream", "Referer=", "Snapshot=t1.inf", LAST); flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);//获取响应中的文件长度 if(flen > 0) { //以写方式打开文件 fileContent = fopen(fileName, "wb"); if(fileContent == NULL) #看是否正确打开了需要保存下载内容的文件,fileName是上面准备组织的文件路径; { lr_output_message("打开文件失败!"); return -1; } fwrite(lr_eval_string("{fcontent}"), flen, 1, fileContent);//写入文件内容 fclose(fileContent);//关闭文件 } lr_end_transaction("下载文件",LR_AUTO);#事务结束点 return 0; } |
二、java user协议
使用java user协议更简单,就是直接使用java编写一段从指定链接下载文件的脚本即可;
import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import lrapi.lr; public class Actions { public int init() throws Throwable { return 0; }//end of init public int action() throws Throwable { int DownLoadSize = 0; String path = "c:\\temp\\"; //设置下载文件保存路径 String vuid = String.valueOf(lr.get_vuser_id()); //获取当前虚拟用户ID并转换成字符串 DownLoadSize = UrlTools.getHttpFileByUrl("http://forum.ubuntu.org.cn/download/file.php?id=129973&sid=78fc8d76767ef49b606595824ceb963d",vuid,path); //调用UrlTools.getHttpFileByUrl() return 0; }//end of action public int end() throws Throwable { return 0; }//end of end } class UrlTools { public static int getHttpFileByUrl(String address,String userid,String path) { //定义下面需要用到的变量 URL url; URLConnection conn = null; int BUFF_SIZE = 1024; byte[] buf = new byte[BUFF_SIZE]; int DownLoadSize = 0; BufferedInputStream bis; FileOutputStream fos = null; int size = 0; try { url = new URL(address); //address为传递进来需要下载的链接 conn = url.openConnection();//使用url实例化需要下载的链接 bis = new BufferedInputStream(conn.getInputStream()); //把需要下载的文件内容保存在bis这个输入流中 fos = new FileOutputStream(path+"\"+userid+"test000001"+“.pdf”));//组成完整路径,并实例化到输出流,这里可以进行参数化,如参数化文件名, // 路径需要事先手动创建好,当然你也可以在脚本中创建实现不同的路径 System.out.println("需要下载的文件大小为:" + conn.getContentLength()/1024 + "k"); while((size = bis.read(buf)) != -1) #按照设置的buf大小写文件并记录下载的大小 { fos.write(buf,0,size); DownLoadSize = DownLoadSize+size; } bis.close(); fos.close(); System.out.println("用户" + userid + "下载" + url +"完成!"); }catch(MalformedURLException e) { System.out.println("下载发生异常:"); e.printStackTrace(); }catch(IOException e) { System.out.println("下载发生异常:"); e.printStackTrace(); } return DownLoadSize/1024; } } |
最新内容请见作者的GitHub页:http://qaseven.github.io/