文件上传 

  在业务场景有上传操作时,使用LR能录制到上传操作,代码如下。在录制的原始代码中,Filename的Value是上传的文件名,name的Value是一串文件名的加密串,file的Value也是上传的文件名。

脚本——LR处理文件上传和下载_性能测试

web_submit_data("upload","Action=http://dggtsv036-ap.huawei.com/CFS/servlet/upload?ulType=ExcelImport&batchId=&excelType=salesContractUpload&uploadResultId={correlation_uploadresultid}","Method=POST","EncType=multipart/form-data","RecContentType=text/plain","Referer=","Snapshot=t77.inf","Mode=HTTP",
ITEMDATA,"Name=Filename", "Value={filename}.xlsx", ENDITEM,"Name=name", "Value={filename_code}.xlsx", ENDITEM,"Name=file", "Value=D:\\CFSXML\\{filename}.xlsx", "File=yes", ENDITEM,"Name=Upload", "Value=Submit Query", ENDITEM,
LAST);

脚本——LR处理文件上传和下载_性能测试

 

  首先的问题是如何处理文件名被加密?

      对于该问题,先要弄清楚该处的加密是在客户端还是在服务器端加密的,如果不清楚最直接的办法的是询问相关开发或设计人员,也可以在该请求之前的请求响应中去找是否存在此处的文件名加密串,如果在其他请求的响应中找到了这里的文件名加密串,说明是在服务器端加密的,处理方法就是通过关联用变量替代此处的文件名加密串即可。

      但如果没有找到或已确认是在客户端加密的要怎么处理呢?

      那么期望最简单的办法就是询问开发人员或者是自己尝试,确认此处的加密是否可以直接使用文件名明文,如果可以使用明文直接使用文件名的明文替代加密串即可,我在此处的最后处理方法就是直接使用了文件名的明文替代加密串,结果仍然有效。

      那如果不能使用明文只能使用密文该怎么办呢?

       这种情况处理起来可能就稍微麻烦些,可以通过开发人员提供的加密函数,通过调用DLL的方法自行对文件名进行相应的加密处理,再用加密的变量替换此处的值,目前我也还没有遇到需要使用调用dll的方式。

  这里我在处理完加密的问题后还遇到了文件路径的问题,将上传对应的文件置于脚本目录中,然后脚本在LR的vugen和本机contraller中都能成功运行,但是将该脚本上传到PC(LR11的升级版本)上去跑场景运行时,会报错提示找不到上传的文件,后来发现是因为上传的文件并没有放到执行脚本产生压力的LG机器上,因此工具找不到上传的文件。最终的解决办法是将待上传的文件置于运行该脚本的LG的目录中,并把file的value改为对应的全路径名,问题才得以解决。需要注意的是在PC中运行该脚本的场景中需要确保选择的是存有待上传文件的LG,如果想要实现可以任意分配LG,那么就得把待上传的文件置于每一个LG的相同目录下。

 

文件下载

  对于http协议来说,文件下载也只不过是http的一个请求,并无特别之处,服务器会返回待下载的文件流数据,这里LR中并没有直接的办法获得到下载的文件,而是通过关联的方式,将服务器返回的文件流数据保存起来,再通过函数写入到文件中,即可得到下载的文件。主要代码如下:

脚本——LR处理文件上传和下载_性能测试

//设置参数的最大长度,注意该值必须大于文件的大小
web_set_max_html_param_len("20000");


//获取响应的全部内容,作为文件内容保存在fcontent中,
//关联函数的左右边界都为空。
//fcontent中保存了就存储了需要下载的文档内容。
web_reg_save_param("fcontent", "LB=", "RB=", "SEARCH=BODY", LAST);

//获取文件的请求。这个可以录制的。
web_url("viewfile.asp",
		"URL=http://www.testage.net/bbs/viewFile.asp?BoardID=25&ID=217",
		"Resource=0",
		"RecContentType=text/html",
		"Referer=http://www.testage.net/bbs/dispbbs.asp?boardID=25&ID=5187&page=1",
		"Snapshot=t16.inf",""
		"Mode=HTML",
EXTRARES,
		"Url=viewFile.asp?BoardID=25&ID=217", 
		"Referer=http://www.testage.net/bbs/dispbbs.asp?boardID=25&ID=5187&page=1", 
		ENDITEM,
LAST);

//获取响应中的文件长度
flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
//判断,是否获取到文件内容。
//如果flen>0表示关联到了内容。
//如果flen<0就表示没有关联到内容,就直接退出。
if(flen > 0)    
{
//以写方式打开文件
//打开本地文件,如果打开成功,可以用fwrite写下载的内容。
 if((filedes = fopen("c:\\test.rar", "wb")) == NULL)
{
lr_output_message("Open File Failed!");
return -1;
}
//写入文件内容
//fwrite(1,2,3,4);
//需要写入本地的内容fcontent。
//fcontent是使用关联函数获取的。
//所有参数是字符串类型,需要使用引号,并且fcontent是参数,所以需要大括号,又因为需要获取的fcontent变量的值,所以需要使用lr_eval_string();
//写入文档时的速度,以一个字节一个字节的写入。
fwrite(lr_eval_string("{fcontent}"), flen, 1, filedes);
 //关闭文
 fclose(filedes);
}

脚本——LR处理文件上传和下载_性能测试



fopen方法的参数值:

w:文件写入,注意:指定的路径下的文档可以没有,如果没有在运行的时候会自动创建,如果有那么就实现覆盖。 

r:读取文件,注意:指定路径下的文档必须存在。

a:追加,想文件追加内容。

t:text文本文件。

b:binary 二进制文件。 

wb:写入二进制文件内容。