最近接到一個項目的性能測試任務,其中會涉及到HTTP接口,因此自己花了一點時間對該部分進行了詳細地瞭解。性能測試部分我有在其他文章中進行闡述,在此就不重複進行說明了,具體地址:http://blog.csdn.net/jiang1986829/article/details/47981189
LoadRunner是一個很強大的工具,它不僅能做性能測試,同時也能做功能測試,特別是針對於接口的功能測試,既然能做功能測試,那麼就需要想辦法實現其自動化,接下來我將自己整理的一個簡單的自動化測試框架進行描述。
測試框架總體流程如下:
vuser_init代碼如下:
//定義結果文件變量
long file_stream;
//定義測試結果變量
char V_Result[1024];
vuser_init()
{
//取得文件名種子-----系統時間
lr_save_datetime("%Y%m%d%H%M%S",DATE_NOW,"now_date");
//拼接測試結果文件名稱
strcpy(V_Result,"f:\\test\\Result\\");
strcat(V_Result,lr_eval_string("{IFaceName}"));
strcat(V_Result,"_");
strcat(V_Result,lr_eval_string("{now_date}"));
strcat(V_Result,".html");
//生成並打開測試結果文件
if ((file_stream = fopen(V_Result, "w+")) == NULL) {
lr_error_message ("創建 %s 文件失敗", V_Result);
return -1;
}
//寫入測試文件頭部html信息
strcpy(V_Result,"<html><table border='1'><tr><td>接口名稱</td><td>登錄名</td><td>預期值</td><td>實際值</td><td>結果</td></tr>");
fputs(V_Result,file_stream);
return 0;
}
Action代碼如下:
Action()
{
//存儲測試結果狀態
char V_testStatus[1024];
//定義預期值與實際值的比較結果
int result;
//取得登錄名
char *V_UserName=lr_eval_string("{UserName}");
//獲取服務器還回的請求狀態state
web_reg_save_param_ex(
"ParamName=sucStatusParam",
"LB=\"state\":",
"RB=,",
"NOTFOUND=warning",
SEARCH_FILTERS,
"Scope=Body",
"IgnoreRedirections=Yes",
"RequestUrl=*/MiddleWare/*",
LAST);
//發送請求
web_custom_request("login",
"URL=http://{IP}/MiddleWare/mem/login?",
"Method=POST",
"Resource=0",
"RecContentType=application/json",
"Referer=",
"Mode=HTTP",
//"EncType=application/json",
"Body=params={\"param\":{\"userAccount\":\"{UserName}\",\"passWord\":\"e10adc3949ba59abbe56e057f20f883e\",\"device\":\"IOS\"},\"version\":\"v1.0\",\"loginLog\":\"2015-09-11 09:09:09\"}",
LAST);
//比較預期值和實際值是否相等
result=strcmp(lr_eval_string("{YQJG}"),lr_eval_string("{sucStatusParam}"));
if(result==0){
strcpy(V_testStatus,"PASS");
}else{
strcpy(V_testStatus,"FAIL");
}
strcpy(V_Result,"<tr>");
//寫入接口名稱
strcat(V_Result,"<td id='interFaceName'>");
strcat(V_Result,lr_eval_string("{IFaceName}"));
strcat(V_Result,"</td>");
//寫入測試參數
strcat(V_Result,"<td id='uname'>");
strcat(V_Result,V_UserName);
strcat(V_Result,"</td>");
//寫入預期結果
strcat(V_Result,"<td id='expected'>");
strcat(V_Result,lr_eval_string("{YQJG}"));
strcat(V_Result,"</td>");
//寫入實際結果
strcat(V_Result,"<td id='reality'>");
strcat(V_Result,lr_eval_string("{sucStatusParam}"));
strcat(V_Result,"</td>");
//寫入測試狀態
strcat(V_Result,"<td id='status'>");
strcat(V_Result,V_testStatus);
strcat(V_Result,"</td></tr>");
fputs(V_Result,file_stream);
return 0;
}
vuser_end代碼如下:
vuser_end()
{
//結束並關閉文件
strcpy(V_Result,"</table></html>");
fputs(V_Result,file_stream);
if (fclose(file_stream))
lr_error_message ("文件 %s 關閉出錯", V_Result);
return 0;
}
效果圖如下: