溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

LoadRunner性能測試-上傳文件腳本

發(fā)布時間:2020-03-25 09:19:44 來源:網(wǎng)絡(luò) 閱讀:3384 作者:qinyan20121209 欄目:軟件技術(shù)


LR上傳文件腳本詳解

腳本

char *fr(char *filename){

    longupfile ;    //定義文件句柄

    intcount ;      //定于文件長度

    intnFileLen;    //定義文件長度

    char*buffer;

    upfile= fopen(filename,"rb"); //以只讀方式打開二進制文件,將upfile指向該文件

 

   fseek(upfile,0,2);          //將文件指針移動到文件尾

    nFileLen= ftell(upfile);      //獲得文件尾到文件頭的偏移字節(jié)數(shù),即文件所包含字節(jié)數(shù)

    fseek(upfile,0,0);          // 將文件指針移動到文件頭

    lr_output_message("nFileLen:%d",nFileLen);    //打印文件字節(jié)數(shù)

 

    buffer= (char*)malloc(nFileLen);    //分配長度為nfilelen的內(nèi)存塊

    count= fread(buffer, sizeof(char),nFileLen, upfile); //將upfile指向的文件所包含字節(jié)數(shù)的所有數(shù)據(jù)項讀入到buffer中,并返回數(shù)據(jù)項的字節(jié)數(shù),及文件長度

 

    lr_output_message("count:%d",count);  //打印讀入文件的字節(jié)數(shù)

    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","p_w_upload;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

作用:   第一個參數(shù)是指向一個文件,如果當前文件不存在,系統(tǒng)會創(chuàng)建這個文件名。第二個參數(shù)是對這個文件進行的操作。例如,只讀,讀寫,寫等。

Fopen函數(shù)原型:

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

其中:

文件指針名:必須被指明為FILe類型的指針變量

文件名:被打開文件的文件名,是字符串常量或字符串數(shù)組

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

例如:在當前目錄打開文件file a,只運行進行讀操作,并時fp指向該文件
FILE *fp;
fp=("file a","r");


使用文件的方式共有12種,下面給出了它們的符號和意義。
“rt” :只讀打開一個文本文件,只允許讀數(shù)據(jù)
“wt”: 只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)
“at”:追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)
“rb”:只讀打開一個二進制文件,只允許讀數(shù)據(jù)
“wb”:只寫打開或建立一個二進制文件,只允許寫數(shù)據(jù)
“ab”:追加打開一個二進制文件,并在文件末尾寫數(shù)據(jù)
“rt+”:讀寫打開一個文本文件,允許讀和寫
“wt+”:讀寫打開或建立一個文本文件,允許讀寫
“at+”:讀寫打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)
“rb+”:讀寫打開一個二進制文件,允許讀和寫
“wb+”:讀寫打開或建立一個二進制文件,允許讀和寫
“ab+”:讀寫打開一個二進制文件,允許讀,或在文件末追加數(shù)據(jù)


把一個文本文件讀入內(nèi)存時,要將ASCII碼轉(zhuǎn)換成二進制碼,而把文件以文本方式寫入磁盤時,也要把二進制碼轉(zhuǎn)換成ASCII碼,因此文本文件的讀寫要花費較多的轉(zhuǎn)換時間。對二進制文件的讀寫不存在這種轉(zhuǎn)換。


  1. 2.  Fseek函數(shù)

作用:用于二進制方式打開的文件,移動文件讀寫指針位置,通常文件打開后,讀寫位置按先后順序.但有時你想變動讀寫位置,例如重新從某處起,再讀一次.


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

第一個參數(shù)stream為文件指針
第二個參數(shù)offset為偏移量,整數(shù)表示正向偏移,負數(shù)表示負向偏移
第三個參數(shù)origin設(shè)定從文件的哪里開始偏移,取值為:SEEK_CUR、SEEK_END 或SEEK_SET
SEEK_SET: 文件開頭
SEEK_CUR: 當前位置
SEEK_END: 文件結(jié)尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次為0,1和2.
簡言之:
fseek(fp,100L,0);把fp指針移動到離文件開頭100字節(jié)處;
fseek(fp,100L,1);把fp指針移動到離文件當前位置100字節(jié)處;
fseek(fp,100L,2);把fp指針退回到離文件結(jié)尾100字節(jié)處。


  1. 3.  Ftell函數(shù)

Ftell函數(shù)原型:long int ftell ( FILE * stream );

作用:用于獲得文件位置指針當前位置相對于文件首的偏移字節(jié)數(shù)。在隨機方式取文件時,由于文件位置頻繁的前后移動,程序不容易確定文件的當前位置。調(diào)用ftell函數(shù)就能非常方便地確定文件位置

利用ftell函數(shù)也能方便地知道文件的長度,如:

Fsekk(fp,0,2)//將fp文件指針移動到文件結(jié)尾

Len=ftell(fp)    //獲得從文件結(jié)尾到文件首的偏移字節(jié)數(shù),該字節(jié)數(shù)相當于文件所含字節(jié)數(shù)




  1. 4.  Malloc函數(shù)

函數(shù)原型:extern void *malloc(unsignedint num_bytes);

malloc的語法是:指針名=(數(shù)據(jù)類型*)malloc(長度),


作用:分配長度為num_bytes字節(jié)的內(nèi)存塊  說明:如果分配成功則返回指向被分配內(nèi)存的指針,否則返回空指針NULL。 當內(nèi)存不再使用時,應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。


  1. 5.  fread函數(shù)和fwrite函數(shù)

功能:用來讀寫一個數(shù)據(jù)塊。

函數(shù)原型:

Fread(buffer,size,count,fp)

Fwrite(buffer,size,count,fp)

說明:

(1)buffer:是一個指針,對fread來說,它是讀入數(shù)據(jù)的存放地址。對fwrite來說,是要輸出數(shù)據(jù)的地址。

(2)size:要讀寫的字節(jié)數(shù);

(3)count:要進行讀寫多少個size字節(jié)的數(shù)據(jù)項;

(4)fp:文件型指針。


LR函數(shù)

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

功能,轉(zhuǎn)換整型為字符串型,并將字符串值存到參數(shù)中。

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

功能:將指定以Null結(jié)束的字符串賦值給參數(shù)


  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)代表失敗。

功能:允許使用任何方法和請求體創(chuàng)建自定義的HTTP請求。默認情況下,當VuGen無法使用其他函數(shù)解釋用戶請求時,會生成此函數(shù)。

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


參數(shù):

RequestName步驟的名稱,VuGen中樹形視圖中顯示的名稱。


List of Attribute支持的屬性有以下幾種:

  • URL:頁面地址。

  • Method:頁面的提交方式,POST或GET。

  • TargetFrame:包含當前鏈接或資源的frame的名稱。

  • EncType:編碼類型。比如,text/html, 在請求頭里被指定為的content-type的值。如果在消息頭里指定了content-tpye,但是該content-tpye不匹配body會導致服務(wù)器端的錯誤。因此建議不要修改錄制得到的enctype。

任何對于“EncType”的指定都會覆蓋web_add_[auto_]header函數(shù)指定的Content-Type。當指定了“EncType=” (空值)時,不會產(chǎn)生“Content-Type” 請求頭。當省略了“EncType”時,任何一個web_add_[auto_]header函數(shù)都會起作用。如果既沒有指定EncType也沒有web_add_[auto_]header函數(shù),且“Method=POST”,“application/x-www-form-urlencoded”會做為默認值來使用。其他情況下,不會產(chǎn)生Content-Type請求頭。

僅僅當Recording Options--Recording --HTML-based script-- Recordwithin the current script step選項被選中時,List of Resource Attributes才會被插入到代碼中。

  • RecContentType:錄制腳本時響應(yīng)頭的內(nèi)容類型。例如text/html application/x-javascript等。當沒有設(shè)置Resource屬性時,用它來確定目標URL是否是可記錄的資源。此屬性包含主要的和次要的資源。最頻繁使用的類型是 text、applicationp_w_picpath。次要的類型根據(jù)資源不同變化很多。例如:"RecContentType=text/html":表示html文本。"RecContentType=application/msword":表示當前使用的是Msword

  • Referer:當前頁面關(guān)聯(lián)的頁面。如果已經(jīng)顯式指定了url的地址,此項可以省略。

  • Body:請求體。

Body:表示規(guī)則的,可打印的字符串。無法表示空字節(jié)。所有的字符都以一個反斜杠表示。注意:在舊的腳本中,可以看見不可打印的字符在請求體中以16進制方式進行編碼。(例如 “\\x5c”),在這種情況下,必須使用“Binary=1”來標識。空字節(jié)使用"file://0.0.0.0/"來表示。相反,新腳本則會把把請求體分開放在不同的參數(shù)中("Body=...","BodyBinary=...", Body=...")。

BodyBinary :表示二進制代碼。不可打印的字符在請求體中以16進制方式file://xhh/進行編碼。在這里HH 表示十六進制值??兆止?jié)使用"file://0.0.0.0/"來表示。

BodyUnicode:美國英語,特指拉丁 UTF-16LElittle-endian)編碼。這種編碼方式會在在每個字符末尾附加一個0字節(jié),以便使字符更可讀。但是在VuGen中實際的參數(shù)把所有的0字節(jié)都去掉的。但是在發(fā)送給Web 服務(wù)器之前, web_custom_request函數(shù)會重新添加0字節(jié)的。對于不可打印的字符,使用單反斜杠表示,無法表示空字節(jié)。

注意:如果請求體大于100K,會使用一個變量來代替Body參數(shù)。變量是在 lrw_custom_body.h中定義的。

  • RAW BODY:(目前僅適用與web_custom_request函數(shù)):請求體是作為指針傳遞的,此指針指向一串數(shù)據(jù)。二進制的請求體可以使用BodyBinary 屬性來發(fā)送(或者使用Body 屬性來傳遞,前提是必須設(shè)置"Binary=1" )。無論如何,這種方法需要使用轉(zhuǎn)義字符反斜杠把不可打印的字符轉(zhuǎn)換為ASCII字符。為了能有一種更簡便的表現(xiàn)原始數(shù)據(jù)的方式,Raw Body屬性應(yīng)運而生,可以傳遞指向二進制數(shù)據(jù)的指針。

  • BodyFilePath:作為請求體傳送的文件的路徑。它不能與下面的屬性一起使用:Body,或者其他Body屬性或Raw Body屬性包括BodyBinary,BodyUnicode, RAW_BODY_STARTBinary=1。

  • Resource 指示URL是否屬于資源。1 是;0 不是。設(shè)置了這個參數(shù)后,RecContentType參數(shù)被忽略。“Resource=1”,意味著當前操作與所在腳本的成功與否關(guān)系不大。在下載資源時如果發(fā)生錯誤,是當作警告而不是錯誤來處理的;URL是否被下載受“Run-Time Setting—BrowserEmulation--Download non-HTML resources” 這個選項的影響。此操作的響應(yīng)信息是不做為HTML來解析的。“Resource=0”,表明此URL是重要的,不受發(fā)送請求(RTS)的影響,在需要時也會解析它。

 

  • ResourceByteLimit:在HTTP模式中無法使用,在Concurrent GroupsVuser腳本中的一個區(qū),此區(qū)中的所有函數(shù)并發(fā)執(zhí)行)區(qū)中也無法使用。僅僅適用于Sockets的回放,WinInet也是不適用的。

 

  • Snapshot:快照的文件名,關(guān)聯(lián)時使用。

 

  • Mode:兩種錄制級別HTMLHTTP。

HTML級別:在當前Web界面上錄制直觀的HTML動作。以一步步的web_url、web_link、  web_p_w_picpath、web_submit_form來錄制這些動作。VuGen僅僅錄制返回HTML頁面的請求,不處理腳本和應(yīng)用程序。

HTTP級別:VuGen把所有的請求錄制為web_url指令,不生成web_link、web_p_w_picpath、web_submit_form這些函數(shù)。這種方法更為靈活,但是生成的腳本不夠直觀。


  • ExtraResBaseDir:(目前僅適用與web_custom_request函數(shù)):根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頭的名字,用來標識應(yīng)用程序,通常是瀏覽器,它呈現(xiàn)的是用戶和服務(wù)器的交互。

例如:頭信息“User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; WindowsNT 5.0)”識別的是Window NT下的IE瀏覽器6.0。其他的User-Agent的值用來描述其他的瀏覽器,或者非瀏覽器程序。通常,一個應(yīng)用程序中所有的請求都使用相同的用戶代理,錄制者作為一個運行時參數(shù)來指定(Run-Time Setting—Browser Emulation—UserAgent)。不管怎么說,即使是在一個簡單的瀏覽器進程中,仍有可能會用到直接與服務(wù)器交互的非瀏覽器組件(例如ActiveX控件),通常他們有著不同于瀏覽器的用戶代理屬性。指定“UserAgent”表示這是一個非瀏覽器的請求。指定的字符串被HTTP“User-Agent:” 使用,在某些情況下,它同時會影響回放腳本時的行為。例如,不使用瀏覽器緩存,假設(shè)指定的URL屬于資源等等。

LoadRunner本身不檢查指定的字符串與瀏覽器本身的值是否相同。

  • Binary“Binary=1”表示頁面請求體中的每一個以file://x/##形式出現(xiàn)的值(在這里“##”代表2個十六進制數(shù)字),都會被替換為單字節(jié)的十六進制的值。

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

需要注意雙斜杠的用法。在C編譯器中雙斜杠被解釋為單斜杠。如果不需要零字節(jié),單斜杠可以在Binary不等于1的情況下使用(例如,使用\x20代替file://x20/)。如果需要零字節(jié),那么只能使用file://x00/且設(shè)置 “Binary=1”,\x00在邏輯上會被截斷


  • ContentEncoding:指定請求體使用指定的方式(gzip或者deflate)進行編碼(例如,壓縮),相應(yīng)的“Content-Encoding:” HTTP頭會和此請求一起發(fā)送。這個參數(shù)適用于web_custom_requestweb_submit_data

  • EXTRARES:表明下面的參數(shù)將會是List Of Resource Attributes了。 

  • LAST :結(jié)尾的標示符。

 List of Resource  Attributes
Web
頁面中的非HTML機制產(chǎn)生了資源列表,包含了Javascript, ActiveX, Java applets andFlash所請求的資源。VuGen's Recording 選項中,可以設(shè)置把這些資源錄制在當前的操作中(默認是此設(shè)置)還是作為單獨的步驟來錄制。

 

 


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI