最近接到一个项目的性能测试任务,其中会涉及到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;
}