LoadRunner性能测试-上传文件脚本

LR上传文件脚本详解

脚本

char *fr(char *filename){

longupfile ;    //定义文件句柄

intcount ;      //定于文件长度

intnFileLen;    //定义文件长度

char*buffer;

upfile= fopen(filename,"rb"); //以只读方式打开二进制文件,将upfile指向该文件

fseek(upfile,0,2);          //将文件指针移动到文件尾

nFileLen= ftell(upfile);      //获得文件尾到文件头的偏移字节数,即文件所包含字节数

fseek(upfile,0,0);          // 将文件指针移动到文件头

lr_output_message("nFileLen:%d",nFileLen);    //打印文件字节数

buffer= (char*)malloc(nFileLen);    //分配长度为nfilelen的内存块

count= fread(buffer, sizeof(char),nFileLen, upfile); //将upfile指向的文件所包含字节数的所有数据项读入到buffer中,并返回数据项的字节数,及文件长度

lr_output_message("count:%d",count);  //打印读入文件的字节数

lr_save_int(count,"fbuff");  //将文件长度赋值给fbuff

lr_save_int(count-1,"fcurr");  //将文件长度-1赋值给fcurr

returnbuffer;  //返回读取的文件

}

vuser_init()

{

lr_save_string(fr("E:\\FS\\testfile\\55.txt"),"fdata");//将读取的文件存到fdata变量中

return0;

}

Action()

{

/*上传文件*/

lr_think_time(3);

lr_start_transaction("hdupfile");

web_add_header("Content-Disposition","attachment;filename=\"testdata.rar\"");

web_add_header("X-Content-Range","bytes0-{fcurr}/{fbuff}");

web_add_header("Session-ID","{userid}");

web_add_header("Content-Type",  "application/octet-stream");

web_custom_request("hdup",

"URL=http://10.255.0.149/upload?userId={userid}&bigmd5={userid}&taskId={userid}&offset=0",

"Method=POST",

"Resource=0",

"Referer=",

"Mode=HTML",

"Body={fdata}",

LAST);

lr_end_transaction("hdupfile",LR_AUTO);

return 0;

}

vuser_end()

{

return0;

}

知识点:

C语言读写文件

  1. 1.  Fopen:

作用:   第一个参数是指向一个文件,如果当前文件不存在,系统会创建这个文件名。第二个参数是对这个文件进行的操作。例如,只读,读写,写等。

Fopen函数原型:

文件指针名=fopen(文件名,使用文件方式)

其中:

文件指针名:必须被指明为FILe类型的指针变量

文件名:被打开文件的文件名,是字符串常量或字符串数组

使用文件方式:是指文件的类型和操作文件的方式

例如:在当前目录打开文件file a,只运行进行读操作,并时fp指向该文件
FILE *fp;
fp=("file a","r");

使用文件的方式共有12种,下面给出了它们的符号和意义。
“rt” :只读打开一个文本文件,只允许读数据
“wt”: 只写打开或建立一个文本文件,只允许写数据
“at”:追加打开一个文本文件,并在文件末尾写数据
“rb”:只读打开一个二进制文件,只允许读数据
“wb”:只写打开或建立一个二进制文件,只允许写数据
“ab”:追加打开一个二进制文件,并在文件末尾写数据
“rt+”:读写打开一个文本文件,允许读和写
“wt+”:读写打开或建立一个文本文件,允许读写
“at+”:读写打开一个文本文件,允许读,或在文件末追加数据
“rb+”:读写打开一个二进制文件,允许读和写
“wb+”:读写打开或建立一个二进制文件,允许读和写
“ab+”:读写打开一个二进制文件,允许读,或在文件末追加数据

把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。

  1. 2.  Fseek函数

作用:用于二进制方式打开的文件,移动文件读写指针位置,通常文件打开后,读写位置按先后顺序.但有时你想变动读写位置,例如重新从某处起,再读一次.

Fseek函数原型:int fseek(FILE *stream,long offset,int origin)

第一个参数stream为文件指针
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,取值为:SEEK_CUR、SEEK_END 或SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.
简言之:
fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
fseek(fp,100L,2);把fp指针退回到离文件结尾100字节处。

  1. 3.  Ftell函数

Ftell函数原型:long int ftell ( FILE * stream );

作用:用于获得文件位置指针当前位置相对于文件首的偏移字节数。在随机方式取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。调用ftell函数就能非常方便地确定文件位置

利用ftell函数也能方便地知道文件的长度,如:

Fsekk(fp,0,2)//将fp文件指针移动到文件结尾

Len=ftell(fp)    //获得从文件结尾到文件首的偏移字节数,该字节数相当于文件所含字节数

  1. 4.  Malloc函数

函数原型:extern void *malloc(unsignedint num_bytes);

malloc的语法是:指针名=(数据类型*)malloc(长度),

作用:分配长度为num_bytes字节的内存块  说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函数将内存块释放。

  1. 5.  fread函数和fwrite函数

功能:用来读写一个数据块。

函数原型:

Fread(buffer,size,count,fp)

Fwrite(buffer,size,count,fp)

说明:

(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。

(2)size:要读写的字节数;

(3)count:要进行读写多少个size字节的数据项;

(4)fp:文件型指针。

LR函数

  1. 1.  lr_save_int(intvalue,const char * param_name)

功能,转换整型为字符串型,并将字符串值存到参数中。

  1. 2.  lr_save_string(const char *param_value, const char *param_name)

功能:将指定以Null结束的字符串赋值给参数

  1. 3.  web_add_header(constchar * Head, const char * Content)

功能:对于下一个web request,指定请求头

  1. 4.  web_custom_request(constchar *RequestName, <List of Attributes>, [EXTRARES, <List of ResourceAttributes>,] LAST );

返回值:
返回LR_PASS(0)代表成功,LR_FAIL(1)代表失败。

功能:允许使用任何方法和请求体创建自定义的HTTP请求。默认情况下,当VuGen无法使用其他函数解释用户请求时,会生成此函数。

所有的Web Vusers ,运行在HTTP模式或者Wireless Session Protocol (WSP) 回放模式下的WAPVusers都支持web_custom_request函数。

参数:

RequestName步骤的名称,VuGen中树形视图中显示的名称。

List of Attribute支持的属性有以下几种:

  • URL:页面地址。
  • Method:页面的提交方式,POST或GET。
  • TargetFrame:包含当前链接或资源的frame的名称。
  • EncType:编码类型。比如,text/html, 在请求头里被指定为的content-type的值。如果在消息头里指定了content-tpye,但是该content-tpye不匹配body会导致服务器端的错误。因此建议不要修改录制得到的enctype。

任何对于“EncType”的指定都会覆盖web_add_[auto_]header函数指定的Content-Type。当指定了“EncType=” (空值)时,不会产生“Content-Type” 请求头。当省略了“EncType”时,任何一个web_add_[auto_]header函数都会起作用。如果既没有指定EncType也没有web_add_[auto_]header函数,且“Method=POST”,“application/x-www-form-urlencoded”会做为默认值来使用。其他情况下,不会产生Content-Type请求头。

仅仅当Recording Options--Recording --HTML-based script-- Recordwithin the current script step选项被选中时,List of Resource Attributes才会被插入到代码中。

  • RecContentType:录制脚本时响应头的内容类型。例如text/html、 application/x-javascript等。当没有设置Resource属性时,用它来确定目标URL是否是可记录的资源。此属性包含主要的和次要的资源。最频繁使用的类型是 text、application、image。次要的类型根据资源不同变化很多。例如:"RecContentType=text/html":表示html文本。"RecContentType=application/msword":表示当前使用的是Msword。
  • Referer:当前页面关联的页面。如果已经显式指定了url的地址,此项可以省略。
  • Body:请求体。

Body:表示规则的,可打印的字符串。无法表示空字节。所有的字符都以一个反斜杠表示。注意:在旧的脚本中,可以看见不可打印的字符在请求体中以16进制方式进行编码。(例如 “\\x5c”),在这种情况下,必须使用“Binary=1”来标识。空字节使用"file://0.0.0.0/"来表示。相反,新脚本则会把把请求体分开放在不同的参数中("Body=...","BodyBinary=...", Body=...")。

BodyBinary :表示二进制代码。不可打印的字符在请求体中以16进制方式file://xhh/进行编码。在这里HH 表示十六进制值。空字节使用"file://0.0.0.0/"来表示。

BodyUnicode:美国英语,特指拉丁 UTF-16LE(little-endian)编码。这种编码方式会在在每个字符末尾附加一个0字节,以便使字符更可读。但是在VuGen中实际的参数把所有的0字节都去掉的。但是在发送给Web 服务器之前, web_custom_request函数会重新添加0字节的。对于不可打印的字符,使用单反斜杠表示,无法表示空字节。

注意:如果请求体大于100K,会使用一个变量来代替Body参数。变量是在 lrw_custom_body.h中定义的。

  • RAW BODY:(目前仅适用与web_custom_request函数):请求体是作为指针传递的,此指针指向一串数据。二进制的请求体可以使用BodyBinary 属性来发送(或者使用Body 属性来传递,前提是必须设置"Binary=1" )。无论如何,这种方法需要使用转义字符反斜杠把不可打印的字符转换为ASCII字符。为了能有一种更简便的表现原始数据的方式,Raw Body属性应运而生,可以传递指向二进制数据的指针。
  • BodyFilePath:作为请求体传送的文件的路径。它不能与下面的属性一起使用:Body,或者其他Body属性或Raw Body属性包括BodyBinary,BodyUnicode, RAW_BODY_START或Binary=1。
  • Resource: 指示URL是否属于资源。1 是;0 不是。设置了这个参数后,RecContentType参数被忽略。“Resource=1”,意味着当前操作与所在脚本的成功与否关系不大。在下载资源时如果发生错误,是当作警告而不是错误来处理的;URL是否被下载受“Run-Time Setting—BrowserEmulation--Download non-HTML resources” 这个选项的影响。此操作的响应信息是不做为HTML来解析的。“Resource=0”,表明此URL是重要的,不受发送请求(RTS)的影响,在需要时也会解析它。
  • ResourceByteLimit:在HTTP模式中无法使用,在Concurrent Groups(Vuser脚本中的一个区,此区中的所有函数并发执行)区中也无法使用。仅仅适用于Sockets的回放,WinInet也是不适用的。
  • Snapshot:快照的文件名,关联时使用。
  • Mode:两种录制级别HTML、HTTP。

HTML级别:在当前Web界面上录制直观的HTML动作。以一步步的web_url、web_link、  web_image、web_submit_form来录制这些动作。VuGen仅仅录制返回HTML页面的请求,不处理脚本和应用程序。

HTTP级别:VuGen把所有的请求录制为web_url指令,不生成web_link、web_image、web_submit_form这些函数。这种方法更为灵活,但是生成的脚本不够直观。

  • ExtraResBaseDir:(目前仅适用与web_custom_request函数):根URL,放在EXTRARES组里。它是用来解析相对URL的(译者加:类似于Windows的相对路径和绝对路径)。

URL可以是绝对路径(例如http://weather.abc.com/weather/forecast.jsp?locCode=LFPO),也可以是相对路径(例如“forecast.jsp?locCode=LFPO”)。

真正的URL的下载是通过绝对路径进行的,所以相对URL路径必须使用根路径URL去解析。例如,使用http://weather.abc.com/weather/做为根路径来解析“forecast.jsp?locCode=LFPO”,最后的URL是:http://weather.abc.com/weather/forecast.jsp?locCode=LFPO。如果没有指定“ExtraResBaseDir”,默认的根URL是主页面的URL。

  • UserAgent:用户代理,它是一个HTTP头的名字,用来标识应用程序,通常是浏览器,它呈现的是用户和服务器的交互。

例如:头信息“User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; WindowsNT 5.0)”识别的是Window NT下的IE浏览器6.0。其他的User-Agent的值用来描述其他的浏览器,或者非浏览器程序。通常,一个应用程序中所有的请求都使用相同的用户代理,录制者作为一个运行时参数来指定(Run-Time Setting—Browser Emulation—UserAgent)。不管怎么说,即使是在一个简单的浏览器进程中,仍有可能会用到直接与服务器交互的非浏览器组件(例如ActiveX控件),通常他们有着不同于浏览器的用户代理属性。指定“UserAgent”表示这是一个非浏览器的请求。指定的字符串被HTTP头“User-Agent:” 使用,在某些情况下,它同时会影响回放脚本时的行为。例如,不使用浏览器缓存,假设指定的URL属于资源等等。

LoadRunner本身不检查指定的字符串与浏览器本身的值是否相同。

  • Binary:“Binary=1”表示页面请求体中的每一个以file://x/##形式出现的值(在这里“##”代表2个十六进制数字),都会被替换为单字节的十六进制的值。

如果“Binary=0”(默认值),所有的字符序列只是按照字面的值传递。

需要注意双斜杠的用法。在C编译器中双斜杠被解释为单斜杠。如果不需要零字节,单斜杠可以在Binary不等于1的情况下使用(例如,使用\x20代替file://x20/)。如果需要零字节,那么只能使用file://x00/且设置 “Binary=1”,\x00在逻辑上会被截断

  • ContentEncoding:指定请求体使用指定的方式(gzip或者deflate)进行编码(例如,压缩),相应的“Content-Encoding:” HTTP头会和此请求一起发送。这个参数适用于web_custom_request和web_submit_data。
  • EXTRARES:表明下面的参数将会是List Of Resource Attributes了。
  • LAST :结尾的标示符。

List of Resource  Attributes
Web页面中的非HTML机制产生了资源列表,包含了Javascript, ActiveX, Java applets andFlash所请求的资源。VuGen‘s 的Recording 选项中,可以设置把这些资源录制在当前的操作中(默认是此设置)还是作为单独的步骤来录制。

时间: 2024-10-22 03:57:32

LoadRunner性能测试-上传文件脚本的相关文章

Loadrunner上传文件脚本回放错误解决方法

目前大部分行业系统都开始实现无纸化系统进行电子办公,而做为系统性能测试人员,在做完业务场景调研和各项性能指标制定后,需要开始着手准备各类测试数据和录制测试脚本,有时有些交易会涉及到文件上传下载,这时我们需要验证文件是否上传成功,是否会对服务器网络带宽产生压力,上传后的文件能不能正常被解析,正常展现等各项性能指标验证.因此我们在录制脚本时就需要模拟上传文件事物来进行模拟多用户并发时是否能正常上传处理文件等. 在录制脚本时,因为LR工具的原因会出现回放脚本错误,无法正常上传,其原因种类繁多,下面就根

loadrunner录制上传文件,但是回放失败

用Loadrunner录制上传文件,脚本回放时发现,文件没有上传成功,检查脚本发现脚本中没有上传文件的路径. 脚本录制时选择的协议,如果说是socket协议,则不需要上传文件的路径,Loadrunner会把要上传的文件转义成一种特殊编码形式的文件,放在data.ws对应的buf中,运行脚本是直接上传buf中的内容如果是http/html协议,选择URL-based script,web_submit_data中会显示要上传文件的文件名,脚本中不会显示路径,默认路径在当前脚本保存的路径下,把上传的

Linux FTP自动登陆下载备份,上传文件脚本

使用远程的服务器,对另外一台远程的服务器进行FTP操作,速度要比本地机器操作快很多. 之前写过一篇关于FTP如何手工的在Linux进行远程操作, 今天找到一个自动批量的脚本,感觉很好.满足了我的需要. 我的A网站在香港 我的B服务器Linux的在国内.这样就可以把A网站自动备份到B服务器了. 希望本篇博客能给需要的同学一些帮助. #####从ftp服务器上的/home/data 到 本地的/home/databackup#### #!/bin/bash ftp -n<<! open 192.1

上传文件脚本控制格式大小.js

1 var iReporterID = 0; 2 var row = 0; 3 4 var $D = YAHOO.util.Dom; 5 var $E = YAHOO.util.Event; 6 var $C = YAHOO.util.Connect; 7 var $V = YAHOO.util.ValidationManager; 8 var $ = $D.get; 9 var $P = EGOVA.page.PageUtils; 10 var timer = null; 11 var cal

LoadRunner上传文件脚本

ftp免交互上传文件脚本

ftp -i -n <<! open 10.x.x.x user yourFtpAccount yourPasswd cd /root/DailyBuild/webapps/ delete xxx.war lcd /home/product/1.0.2-SNAPSHOT/webapps binary mput xxx.war bye !

自动ftp上传文件脚本

方法一: echo "open 21.244.88.129 user glxtftp glbzuser bin prompt off cd /glxt/DBINFO lcd /tmp put $dblog bye" |ftp -n >/dev/null 2>&1 方法二: ftp -ivn <<KATE open $1 user $2 $3 cd $4 binary lcd $5 passiv put $6 bye KATE

使用脚本上传文件到FTP

使用普通用户上传文件 脚本内容: #!/bin/shDIR=/var/ftp/upload/ FILE=hosts ftp -n 192.168.203.129<<EOF user root Abc123 binary cd $DIR lcd /etc/ put $FILE bye EOF 说明: binary:使用二进制方式传输 使用匿名用户上传文件: #!/bin/sh FILE=hosts ftp -n 192.168.203.129<<EOF user "ftp&

Loadrunner上传文件解决办法(大文件)

Loadrunner上传文件解决办法(大文件) 最近再做一个跟海量存储相关的项目测试,需要通过LR模拟用户大量上传和下载文件,请求是Rest或Soap,同时还要模拟多种大小尺寸不一的文件 通常情况下,都是使用简单的post协议即可: 方法一: web_submit_data("importStudent.do", "Action=https://testserver/console/importStudent.do", "Method=POST"