》》》推荐阅读《《《
1、性能测试学习笔记-场景设计
2、性能测试的重要意义
3、性能分析流程及方法
4、应用系统性能调优之性能分析
一、概述 Loadrunner作为HP出品的性能测试工具,拥有太多奇妙魔法甜点供予性能测试人员享用,其中吃起来比较有嚼劲的那就是关联了。当然在关联之后我们还需要一些简单的字符处理,用以生成我们所需要的切糕、煎饼果子等。
ps:在此我只会分享手动关联技巧。
二、为什么要关联
通常而言我们的网络应用软件都需要输入账户密码登陆,在用户验证通过登陆以后,服务器如何确认谁是谁呢?
此时一般而言就是SESSIONID了,如下图所示:
Session在 网络应用中称为“会话”,借助它可提供客户端与服务系统之 间必要的交互。因为HTTP协议本身是无状态的,所以经常需要 通过Session来解决服务端和浏览器的保持状态的解决方案。用户 向服务器发送第一个请求时,服务器为其建立一个Session,并为 此Session创建一个标识,用户随后的所有请求都应包括这个标识 号。服务器会校对这个标识号以判断请求属于哪个Session。会话 保持有效,默认状况下,直到浏览器关闭,会话才结束。
Session中存储的内容包括用户信息:昵称、用户ID、登录状 态等。
我们的服务器通过SESSIONID确认了,谁是谁?但是在我们所录制的脚本里面,每次发送的协议包还一直是我们所录制的内容,此时就引发了如下报错信息:
Error -26612: HTTP Status-Code=500 (Internal Server Error) for
当然这项报错信息,除了是因为服务器无法识别用户以外。更为根本的原因在于发送给服务器的协议包,导致了服务器报500错误。
那还有那些原因导致报错呢?
数据新增修改删除,违反唯一索引(未关联页面隐藏的表关键字段)
发送回服务器的字段所用字符集,不能被服务器正确解析
SESSIONID不被服务器认可
以上只是简单的列举了我所经历过的现象,如果有错漏请大家多多指正。
一般我遇到这问题,在毫无头绪的时候我是如此做的:
开启浏览器F12开发人员工具,分析页面request与response
如果还是难以发现其中症结,就从svn下载源码,自己搭建开发环境,回放脚本发送协议,源码中断点排查
当没有源码的情况下,我们还可以考虑反编译war文件,利用Eclipse及其强大的插件,断点排查
三、如何建立关联
建立关联我总结了以下几步:
(1)、明确关联字段
录制结束以后,进入Tree试图,查看Response Body,如下图所示:
在确定操作ID之后,我们还需要确定哪个值是数据库表里面的主键或者复合主键字段,如下图所示:
在确定我们的主键为PARTY_ID之后,我们通过查询数据库得知,前五位为”10000“,长度为十四的数字为我们需要关联的另一个字段。(因涉及安全原因数据库查询结果,不能予以展示)
(2)、创建关联函数
创建关于
web_reg_save_param_ex( "ParamName=ridList", "LB= r id=\"", "RB= \"", "Ordinal=ALL",
SEARCH_FILTERS, "Scope=All", "RequestUrl=**********************", LAST);
创建关于主键字段的关联,相对比较复杂。在此确定它的左边界为:,1000,右边界为:,1。关联函数如下如下:
web_reg_save_param_ex( "ParamName=party_id", "LB=,1000", "RB=,1", "Ordinal=ALL",
SEARCH_FILTERS, "Scope=All", "RequestUrl=**********************",LAST);
(3)、处理关联字段
此前我们在处理
lr_eval_string("{ridList_1}");
在此推荐一个LR提供随机获取数组元素的函数:
lr_paramarr_random("ridList");
下面分享两个我所写的函数,用于获取按一定分隔符分隔的字符串中字符。类似此类字符"23sdf|2323d|jdjj,|||2323|3dd|"
//argv为源字符串,delimiters为切分分隔符,number为所需获取分隔符数char* strlick(char *argv,const char delimiters ,int number)
{ int i; int j = 0; int p = 0; char buf[64] = {0};if(number 1)
{return "the number can't ";
}for(i = 0;argv[i] != 0;i++)
{
buf[j] = argv[i];if(argv[i] == delimiters)
{
buf[j] = 0;if(p == number) return buf;
j = 0;
p++;continue;
}
j++;
} return "can't find";
}
//argv为源字符串,delimiters为切分分隔符, number为所需获取分隔符数 ,length为所需截取字符长度char* strputty(char *argv,const char delimiters ,int number,int length)
{int count = 0;char buf[64] = {0};int i ;for(i = 0;argv[i] != 0;i++)
{if(argv[i] == delimiters)
{if(count == number)
{
strncpy(buf,argv + i +1,length); return buf;
}
count++; continue;
}
}return "can't find";
}
(4)、替换关联字段
就替换关联字段而言,已然没有什么奥妙。不过在此推荐一个小技巧,把被处理关联字段复制起来,然后按快捷键ctrl + h全局替换相应的{value}。
四、总结
Loadrunner应用各种函数不会使,其实官方文档才是最好的资料查找点。它给予了各种详细的应用技巧说明,确实找不到资料的时候,推荐上google。
》》》推荐阅读《《《
1、性能测试学习笔记-场景设计
2、Web站点性能调优完全攻略
3、应用系统性能调优之性能分析
4、Windows监控——性能指标详解
6、性能测试的重要意义
7、软件性能测试的本质_致命版
8、性能分析流程及方法
9、性能测试流程
10、性能测试从需求分析开始
11、性能测试指标
12、双活数据中心揭秘之—DB2 PureScale
13、循序渐进学习oracle
14、软件项目管理中的十个误区
15、功能测试方法总结及常见面试问题
16、MQ来账通道及队列配置
17、Linux命令大全整理
18、JMeter工具简单介绍
19、性能瓶颈分析方法
20、性能测试-LoadRunner操作流程之一
22、性能测试-LoadRunner操作流程之二
23、性能测试-LoadRunner操作流程之三
24、性能测试-脚本编写之一
25、性能测试-脚本编写之二
26、性能测试-脚本编写之三
27、性能测试-性能调优之一
28、性能测试-性能调优之二