简单做个loadrunner做接口压测的示例
网上找个天气的查询接口,就以这个作为练手示例
http://www.weather.com.cn/data/sk/101010100.html
HP Virtual User Generator调整脚本
脚本如下:
Action()
{
//执行本脚本前,要先找开发把所有的日记都审核通过,然后运行收藏日记脚本。最后再查询收藏。
//userid和note的值要绑定再一起,来源:select iUserId,iSourceId from App_UserFavorite where dAddTime>'增第一个加日记的时间'
web_reg_save_param("ResponseBody", "LB=", "RB=", "Search=Body", LAST);
lr_start_transaction("Ts_GetUserCollectionNoteList");
web_reg_find("Search=Body",//这里说明在Body的范围内查找
"SaveCount=ret_Count",//这里表示把返回值的个数放在变量ret_Count里
"Text=weatherinfo",//这里表示查找的内容是“NoteId” ,即从返回的body中找到唯一的值作为检查点。
LAST);
web_url("Ts_GetUserCollectionNoteList",
"URL=http://www.weather.com.cn/data/sk/101010100.html",
"Resource=1",
"RecContentType=application/json",
"Referer=",
LAST);
if (atoi(lr_eval_string("{ret_Count}")) >=1){//这里判断检查到的个数
lr_end_transaction("Ts_GetUserCollectionNoteList", LR_PASS);
lr_convert_string_encoding(lr_eval_string("{ResponseBody}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"ResponseBody");
lr_output_message("# 响应内容体:\n %s", lr_eval_string("{ResponseBody}"));
}
else{
lr_end_transaction("Ts_GetUserCollectionNoteList", LR_FAIL);
lr_convert_string_encoding(lr_eval_string("{ResponseBody}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"ResponseBody");
lr_output_message("# 响应内容体:\n %s", lr_eval_string("{ResponseBody}"));
}
return 0;
}
脚本模板:
Action()
{
//执行本脚本前,要先找开发把所有的日记都审核通过,然后运行收藏日记脚本。最后再查询收藏。
//userid和note的值要绑定再一起,来源:select iUserId,iSourceId from App_UserFavorite where dAddTime>'增第一个加日记的时间'
web_reg_save_param("ResponseBody", "LB=", "RB=", "Search=Body", LAST);
lr_start_transaction("Ts_GetUserCollectionNoteList");
web_reg_find("Search=Body",//这里说明在Body的范围内查找
"SaveCount=ret_Count",//这里表示把返回值的个数放在变量ret_Count里
"Text=NoteId",//这里表示查找的内容是“NoteId” ,即从返回的body中找到唯一的值作为检查点。
LAST);
web_url("Ts_GetUserCollectionNoteList",
"URL=http://api.social.ymatou.com/api/socialinner/GetUserCollectionNoteList?noteId={noteid}&userId={userid}",
"Resource=1",
"RecContentType=application/json",
"Referer=",
LAST);
if (atoi(lr_eval_string("{ret_Count}")) >=1){//这里判断检查到的个数
lr_end_transaction("Ts_GetUserCollectionNoteList", LR_PASS);
lr_convert_string_encoding(lr_eval_string("{ResponseBody}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"ResponseBody");
lr_output_message("# 响应内容体:\n %s", lr_eval_string("{ResponseBody}"));
lr_output_message("# 响应内容体:\n %s", lr_eval_string("{userid}"));
}
else{
lr_end_transaction("Ts_GetUserCollectionNoteList", LR_FAIL);
lr_convert_string_encoding(lr_eval_string("{ResponseBody}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"ResponseBody");
lr_output_message("# 响应内容体:\n %s", lr_eval_string("{ResponseBody}"));
lr_output_message("# 响应内容体:\n %s", lr_eval_string("{userid}"));
}
return 0;
}
Action()
{
//先要获取的accesstoken的值,通过数据库查找登陆密码=123456的userid,在需要用到周忆提供的工具,使用userid访问买手和买家的登陆接口获取到accesstoken。并手动增加user类型,1代表买手,0代表买家,最后将userid和accesstoken和user类型绑定.作为参数。
//activityid=1或2,其中这个值可由运营端创建。
//直行通过后,需要到mongo中查找新增加的日志数据量是否正确。
web_reg_save_param("ResponseBody", "LB=", "RB=", "Search=Body", LAST);
web_reg_find("Search=Body",//这里说明在Body的范围内查找
"SaveCount=ret_Count",//这里表示把返回值的个数放在变量ret_Count里
"Text=nodeid",//这里表示查找的内容是“nodeid” ,即从返回的body中找到唯一的值作为检查点。
LAST);
lr_start_transaction("Ts_AddNote");
web_custom_request("Ts_AddNote",
"URL=http://api.social.ymatou.com/api/Feed/AddNote/?AccessToken={accesstoken}",
"Method=POST",
"RecContentType=application/json; charset=UTF-8",
"Mode=HTTP",
"EncType=application/json; charset=UTF-8",
"Body={\"SellerNewsId\":4545,\"Content\" : \"{content1}{num}1\",\"NoteSource\" :0,\"Position\" : \"hangzhou \",\"NoteId\" : ,\"OsVer\" : \"9.0\",\"UserId\" :{user},\"UserName\" : \"lunchzhao\",\"Idfa\" : \"C163DA2D-75DE-4F20-BF87-6683E2282A16\",\"NoteVersion\" : null,\"Os\" : \"iOS\",\"OrderId\" : 105302433,\"IsCollect\" : false,\"CkId\" : \"1ce0eb3713a9af3725884d640bf68b05\",\"TagImage\" : [{\"TagInfo\" : [{\"XPoint\" : 0.4600000083446503,\"YPoint\" : 0.75,\"ImageTagStyle\" : 9,\"Tags\" : [{\"TagValId\" : 56655,\"TagVal\" : \"56655.00\",\"ImageTagType\" : 0}]}],\"Pic\" : \"http:\/\/p6.img.ymatou.com\/G01\/\/M00\/04\/2A\/rBBlD1X_xD2ACR8kAAGS6IvITjo785.jpg\"}]}", LAST);
if (atoi(lr_eval_string("{ret_Count}"))==1){//这里判断检查到的个数
lr_end_transaction("Ts_AddNote", LR_PASS);
lr_convert_string_encoding(lr_eval_string("{ResponseBody}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"ResponseBody");
lr_log_message("# 响应内容体:\n %s", lr_eval_string("{ResponseBody}"));
lr_log_message("# 响应内容体user:\n %s", lr_eval_string("{user}"));//这里输出日志用lr_log_message形式输出,代表可以打印出日志,并输出到日志中。
lr_log_message("# 响应内容体num:\n %s", lr_eval_string("{num}"));
}
else{
lr_end_transaction("Ts_AddNote", LR_FAIL);
lr_convert_string_encoding(lr_eval_string("{ResponseBody}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"ResponseBody");
lr_log_message("# 响应内容体:\n %s", lr_eval_string("{ResponseBody}"));
lr_log_message("# 响应内容体:\n %s", lr_eval_string("{user}"));
}
}
保存,开启HP LoadRunner Controller 跑
结果出来了
一般如果是自己的服务,还要监控服务所在机器以及依赖服务所在服务器、使用数据库、网络转发中间件等的性能指标,如:cpu、内存、磁盘读写、网络流量等来找出来瓶颈
windows机器可以用perfmon
linux机器可以用nmon
还可以借助工具分析代码瓶颈
Net可以借助Dottrace等
java可以借助 JMC JvisualVM等