|
@jasonteststudy 您好!
1. WebService(WebAPP)的性能测试工具用什么比较好, 我没有找到合适的,LR只支SOAP的
答: 我的想法是, 不要把LR看作一个工具, 它是一个平台, 就和ECLIPS一样的道理, LR提供基础的SOAP的应用协议编写方法, 很难满足现在各种各样的开发需求,但是不代表我们不能做, 换个思路, 比如说用 web/HTTP 应用协议自己写 web_custom_request 来达到我们的目的, 还可以用WinSocket 应用协议达到目的.如下:
这个例子是我以前写的多协议调用接口的方式, 从你提的问题来看,相信已经是一个中高级的性能测试人员了, 这个思路应该一看就明白的, 代码我就不解释了.
脚本开发练习用接口:
/* 天气查询
* <IP>61.147.124.120:80</IP>
* <URL>http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx</URL>
* <WSDL>http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl</WSDL>
* <ServiceName>getWeatherbyCityName</ServiceName>
*/
方法一:
/*
**说明: 接口报文以WebService 应用协议格式发送
**作者:Fin.
**时间:2014-11-14 22:15:18
*/
Action()
{
web_service_call( "StepName=getWeatherbyCityName_101",
"SOAPMethod=WeatherWebService|WeatherWebServiceSoap|getWeatherbyCityName",
"ResponseParam=response",
"Service=WeatherWebService",
"ExpectedResponse=SoapResult",
"Snapshot=t1404647143.inf",
BEGIN_ARGUMENTS,
"theCityName=北京",
END_ARGUMENTS,
BEGIN_RESULT,
END_RESULT,
LAST);
return 0;
}
方法二:
/*
**说明:接口报文以Web/HTTP 应用协议格式发送
**作者:Fin.
**时间:2014-11-14 22:13:54
*/
Action()
{
//设置LR变量长度
web_set_max_html_param_len("8192");
//参数 p_area 转换为UTF8格式
lr_convert_string_encoding( lr_eval_string("{p_area}"),
LR_ENC_SYSTEM_LOCALE,
LR_ENC_UTF8,
"s_areaInUTF8" );
//去除 s_areaInUTF8 变量的结尾\0结束符
lr_save_string(lr_eval_string("{s_areaInUTF8}"),
"s_areaInUTF8");
//增加报文头 Content-Type: text/xml;charset=UTF-8
web_add_header("Content-Type",
"text/xml; charset=UTF-8");
//关联取所有值
web_reg_save_param("s_allString",
"LB=",
"RB=</soap:Envelope>",
LAST);
web_custom_request("web_custom_request",
"URL=http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx",
"Method=POST",
"TargetFrame=",
"Resource=0",
"Referer=",
"Body=<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://WebXml.com.cn/\"><soapenv:Header/><soapenv:Body><web:getWeatherbyCityName><web:theCityName>{s_areaInUTF8}</web:theCityName></web:getWeatherbyCityName></soapenv:Body></soapenv:Envelope>",
LAST);
lr_convert_string_encoding( lr_eval_string("{s_allString}"),
LR_ENC_UTF8,
LR_ENC_SYSTEM_LOCALE,
"stringInUTF8" );
lr_message("返回报文:\n====\n%s\n====\n", lr_eval_string("{stringInUTF8}"));
return 0;
}
方法三:
/*
**说明:SOAP 接口报文以 WinSocket 应用协议格式发送
**作者:Fin.
**时间:2014-11-14 22:16:15
*/
#include "lrs.h"
Action()
{
char * sedbuf;
char * revbuf;
int sedbufLength;
sedbuf = (char*)malloc(1024, sizeof(char));
revbuf = (char*)malloc(8192, sizeof(char));
// lr_convert_string_encoding( lr_eval_string("{p_area}"),
// LR_ENC_SYSTEM_LOCALE,
// LR_ENC_UTF8,
// "s_areaInUTF8" );
sprintf(sedbuf, "%s", "POST /WebServices/WeatherWebService.asmx HTTP/1.0\r\n"
"Content-Type: text/xml; charset=UTF-8\r\n"
"Cache-Control: no-cache\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows NT)\r\n"
"Accept: */*\r\n"
"Connection: Keep-Alive\r\n"
"Host: webservice.webxml.com.cn\r\n"
"Content-Length: 269\r\n"
"\r\n"
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://WebXml.com.cn/\"><soapenv:Header/><soapenv:Body><web:getWeatherbyCityName><web:theCityName>姝︽眽</web:theCityName></web:getWeatherbyCityName></soapenv:Body></soapenv:Envelope>\r\n");
sedbufLength = strlen(sedbuf);
lr_message("sedbufLength -> %d", sedbufLength);
lr_message("sedbuf -> %s", sedbuf);
lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=61.147.124.120:80", LrsLastArg);
lrs_set_send_buffer("socket0", sedbuf, sedbufLength);
lrs_send("socket0", "buf0", LrsLastArg);
lrs_receive("socket0", "buf1", LrsLastArg);
lrs_save_searched_string("socket0",LRS_LAST_RECEIVED,"s_paramInUTF8","LB=<getWeatherbyCityNameResult>","RB=</getWeatherbyCityNameResult>",1,0,-1);
lr_convert_string_encoding( lr_eval_string("<s_paramInUTF8>"),
LR_ENC_UTF8,
LR_ENC_SYSTEM_LOCALE,
"s_paramInGBK" );
lr_message("返回报文:\n====\n%s\n====\n", lr_eval_string("<s_paramInGBK>"));
free(sedbuf);
free(revbuf);
return 0;
}
以上三种都可以实现对目标接口的测试. 希望能给你提供思路,而不是方法.
2. 怎么获得详细的性能测试需求.
答: 首先要确定我们的测试目标, 就是要清楚我们要测什么. 比如:
a. 评估系统在当前服务器下承载的最大压力. 或者系统的最大处理能力..
b. 确定系统最大并发数, 或者确定系统的同时在线用户数.
c. 系统版本(补丁)更新前后性能对比测试.
d. 根据明确性能指标达标测试: 比如 交易处理每秒200、规定响应时间不得超过2秒、日交易量50万、 CPU%使用率≤70% 、交易出错率小于千分之3...
e. ...
确立了测试目标,然后我们再根据测试目标制定测试策略(包括选取测试方法、交易选择、压力发起方式、监控部署方案、数据准备策略...)
3. 如何确定并发数.
答:这个我不太明确你说的具体是什么. 我大概猜测一下, 并发数是同一时间段内系统同时能接受多少用户进行业务操作. 站在开发的角度说就是"连接数"或处理进程数. 并发数永远不会超过处理进程数, 超过了就得排队, 排队中的也就不能算并发了...
一般做这类测试目标都是评估系统最佳并发数测试.一般采用阶梯压力测试, 比如 1-5-10-15-20...(每一梯度持续几分钟) 等同比递增, 同时观察响应时间 和 处理能力, 理想条件下,随着压力的递增处理能力不变,响应时间成正比例增长时,我们就要分析是否已经有排队现象了, 也就是我们最佳并发数的拐点了.
4. 在开发阶段如何有效做性能测试,尽早的避免一些性能问题,比如代码(从测试人员的角度)、数据等
答: 业界做模块级的性能测试几乎很少的几家公司,但不是没有。比如小米,说实话我确实很佩服小米公司的敏捷式驱动方式,性能测试不是性能测试组做全部,而是全员参与,性能测试组负责写工具,制定策略, 各级模块开发用性能组提供的工具进行测试,评估性能指标是否通过。(因为谁写的代码,谁最清楚里面的细节,也是优化效率最高的)这样的工作模式确实很有效率,也很有感觉。
一般的公司能够做到依据业务链条分级确定性能就已经很规范了。
比如一个付款交易可分为(目标为2秒内完成):
1.查询卡号信息。
2.卡内可使用金额查询。
3.付款方信息查询。
4.手续费试算。
5.支付。
6.查询支付后月余额变动。
调用了6步不同的接口, 每个接口都要调用后台模块, 6步整合为一个付款业务. 那我们就需要对每一步的调用进行分解分析, 响应时间总合不得高于2s. 对应各个模块就有自己的性能指标确立了. 是有效的性能测试,有严格逻辑定位的测试规划.
5. 能推荐几本书吗, 比如常用中间服务的一般性能异常病能处理如 fdfs,membcache, mysql, tomcat等、tomcat的资源监控(jvm内存, 线程等)
答: 这样大而全的书籍几本少之又少, 推荐从网站上收集并且养成资源收藏的好习惯, 对于资源监控方面, 最新出版的 云层那本 LR11实战性能测试进阶指南(第二版) 应该在 12月中旬 面市(还10多天吧)... 监控章节内容非常丰盛. 再等几天,面市后看看是否符合你的口味, 先别买, 拿手机拍照下来...(云层哭了哈哈) |
|