使用loadrunner進行報表導出下載的性能測試
幾乎所有報表都提供導出下載功能,在實際的業務裏面用戶點擊“導出”按鈕後隨即會進行下載,在服務器硬件性能和測試機性能相差較懸殊的前提下,個人不建議在性能測試腳本中執行該步驟,原因:
1.點擊導出按鈕到允許下載前的時間裏面,系統實際上已經執行了為報表執行下載的處理工作,僅剩的一部是保存到本地計算機,而這一步實際消耗的資源僅僅是硬件和網絡的IO;
2.測試機在執行性能測試場景的過程中應該避免出現無謂的資源開銷避免本地的瓶頸影響測試結果,特別是網絡帶寬和硬盤讀寫,而在多線程執行腳本下載的過程中會發生大量的寫操作(fopen函數)。
簡單來說,只要實現對服務器返回所有內容保存到本地,就實現了“下載”的模擬,因此思路為:
1.首先,針對所有返回內容保存到本地,這裏采用關聯函數可以實現web_reg_save_param
web_reg_save_param("fcontent", "LB=", "RB=", "SEARCH=BODY", LAST);
註意:由於參數SEARCH默認是針對消息頭域和消息體,而我們保存目標僅在返回的body中,所以必須設置為body;
2.然後,由於關聯函數保存參數的參數值默認大小為1024字節,下載文件往往不止這個size,所以在使用關聯函數之前需要使用函數:web_set_max_html_param_len重新設置參數size
web_set_max_html_param_len("90000");
3.最後,把參數寫入到本地文件,使用fwrite( const void *buffer, size_t size, size_t count, FILE *file_pointer );
const void *buffer:要把關聯函數找到的參數作為常量寫入,因此使用lr_eval_string函數把參數轉換為常量
size_t size:指定緩沖區的大小,也就是服務器響應的大小,使用web_get_int_property函數取得,所以需要在導出請求後面加入:
flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
size_t count:指定數目,為1
FILE *file_pointer:指定寫入的文件路徑:
創建文件路徑,使用到long fopen( const char *filename, const char *access_mode );
const char *filename參數為寫入文件的路徑和文件名,例如 d:\報表.xls
const char *access_mode存儲模式參數為:wb,w為寫,b也就是二進制模式,要求在windows中不要轉義處理避免無法打開導出的報表,否則將會:
因此寫:
filedes = fopen("d:\\報表.xls", "wb")
完成該步驟以後:
fwrite(lr_eval_string("{fcontent}"), flen, 1, filedes);
4.關閉文件fclose(filedes);
完成以上步驟以後,Action部分的腳本為:
web_set_max_html_param_len();web_reg_save_param(, , , , LAST);= web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE); filedes = fopen(, ); fwrite(lr_eval_string(), flen, , filedes); fclose(filedes);
但是,這個腳本僅僅能在vugen中執行,在controller中執行時本地始終為一個文件,因此再新增一個參數表作為隨機號避免文件名重復,設定為每次叠代更新,例如:
並進行路徑字符串連接:
int flen; long filedes; char filename[1024], *a = lr_eval_string("{流水號}");//流水號參數表防止文件重名 strcpy(filename,"D:\\信息化項目投資計劃建議表"); strcat(filename,a);
場景執行時候,效果如下:
這個腳本如果在controller中直接進行性能測試的話,跟實際還是會有點差距的,由於實際業務場景裏面各個用戶都是選擇不一樣的報表進行導出,因此再對導出請求中的兩個報表名進行關聯,ord屬性配置為參數,讓vuser每次選擇不一樣的報表進行導出,例如:
web_reg_save_param_ex( "ParamName=CorrelationParameter_2", "LB=\">", "RB=</a></td>", "Ordinal={報表行數}", SEARCH_FILTERS, "Scope=Body", "RequestUrl=*/CsgPlanDrawReportQuery.jsp*", LAST);
最後,就實現了報表模塊中,針對各個不同報表執行導出操作並下載到本地的性能測試目的。
使用loadrunner進行報表導出下載的性能測試