性能测试基础03

性能测试工具-LoadRunner

VuGen-关联

目标
1. 理解关联的概念
2. 了解LR自动关联使用
3. 掌握关联函数的使用
一、为什么要学习关联?
在第二天的登录脚本时,如果sessionID写死,即不是动态获取的,会导致两次请求的SessionID错误,在测试机票购物网站时,SessionID在第一次请求页面时,服务器就响应给了客户端(浏览器),抓包可以得出Session。

(这验证了在第一次请求时,服务器就会响应session给客户端即浏览器)
1. 获取动态加载的数据,Session ID
2. 测试的时候需要获取页面上指定的数据,注意是获取,而不是查找;

说明:
    Session ID:客户端与服务器交互时,服务器生成的一个唯一标识码;
                (通过标识码sessionID,服务器可以区分多次交互对象是否同一客户端,浏览器只要不关闭标识码就不变;)
二、什么是关联(correlation)?
说明:动态获取指定的数据,把获取的数据通过参数化方式在另一处引用;
三、loadrunner常用的关联方式
1. 自动关联 【不推荐】
2. 手动关联-函数 【推荐】
自动关联(了解)
说明:LoadRunner11.0的VuGen利用自带的一些关联规则,使用关联函数对需要进行的关联数据进行数据关联;启用
提示:
    1. 自动关联LoadRunner提供两种方式:
        1). 启用录制脚本能自动关联-在录制的时候如果有符合关联规则的就直接进行关联;
            (注意:此种方式依赖于LR自带的规则或新建的规则)
        2). 脚本录制完成并且运行完一次后,打开扫描工具,进行扫描需要关联的数据;
            (注意:利用工具必须先运行一遍脚本)
    2. 自动关联调用的是关联函数 web_reg_save_param_ex();
       (web_reg_save_param_ex与web_reg_save_param功能大致相同,它可以使用正则表达式和过滤器)
1)自动关联-启用自动关联设置
提示:
    1. 启动自动关联位置:工具菜单(Tool)->Recording Option
2)自动关联-扫描工具
说明
    1. 启动:打开扫描工具-Ctrl+F8 或者菜单栏(Vuser)->Scan Script for Correlations
    2. 扫描:扫描之前先运行一遍脚本
    3. 关联:图中个第二步Correlation Results内进行关联;
自动关联总结
1. 自动关联-启用自动关联设置:采用自带或设定的规则在录制脚本的时候自动关联
2. 自动关联-扫描工具:前后运行两次,搜索两次不同之处为需要关联的数据,进行确认关联
3. 自动关联无论那种方式,都是采用调用关联函数的方法,工具智能人更智能建议掌握接下来关联函数的使用

手动关联【重点】
说明;手动关联就是直接调用关联函数;
关联函数 web_reg_save_param()
说明:
    1). 执行顺序:LR中函数内含reg为注册函数,注册函数是在下一个Action Function完成时执行。
    2). 函数位置:注册函数【必须】放到下一个Action Function(要进行关联数据所在的函数)函数之前;
案例 1
说明:使用web_reg_save_param()函数把红框选中内容关联给welcome参数
案例1 脚本
Action()
{
	// 打开WebTours首页
	web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
	return 0;
}
案例1 操作分析
1. 在Web_url函数之前插入关联函数 web_reg_save_param()  # 因为注册函数是在下一个Action Function完成时执行,即在获取要关联数据函数之前执行
2. 调用lr_eval_string()来读取关联函数的参数引用名称,并通过lr_output_message()函数输出到日志
案例1 操作实施
1、插入web_reg_save_param()方法
说明:
    1. 在web_url函数之前空白行,点击鼠标右键
    2. 选择insert菜单->new Step      
2)输入要查找的函数
说明:
    1). 图1:输入要查找函数的关键词或全称
    2). 图2:找到匹配出的函数,双击或点击图3
    3). 图3:选中图2,点击图3进行选中函数参数设置
3)设置函数参数
参数:
    1). Parameter Name:参数名称(被引用时使用)
    2). Left Boundary(LB):左边界
    3). Right Boundary(RB):右边界
    4). Not Found:关联失败时,处理方式
    5). Search in:匹配搜索响应代码范围
注意:
    单引号(')、双引号(")、反斜杠()、回车换行等需要转译字符,加上转移字符[]
    
本质:是通过正则表达式,来匹配并获取数据的,和jmeter中的关联概念一样。
4)如何查看页面元素响应代码
通过页面查看源代码 F12
参数化并输出到日志

脚本代码
    Action()
    {
		//关联
        web_reg_save_param("Webcome",
            "LB=</H1>
",
            "RB=
"
            "<br>",
            "NotFound=ERROR",
            "Search=All",
            LAST);

        // 打开WebTours首页
        web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
        lr_output_message("Webcome值为:%s",lr_eval_string("{Webcome}"));
        
    	return 0;
    }
练习:关联实现打开首页并登录脚本
Action()
{
	# 解决session问题,注意位置,session在第一次请求服务器时就得到了
	web_reg_save_param("Session",
		"LB=name=userSession value=",
		"RB=>",
		LAST);


	// 打开WebTours首页 抓包分析得出是Get请求
	web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);

	// 模拟登录,抓包分析得出是Post请求
	web_submit_data("登录",
		"Action=http://127.0.0.1:1080/WebTours/login.pl",
		"Method=POST",
		"TargetFrame=",
		"Referer=",
		"Mode=HTML",
		ITEMDATA,
		"Name=userSession", "Value={Session}", ENDITEM,
		"Name=username", "Value=jojo", ENDITEM,
		"Name=password", "Value=bean", ENDITEM,
		"Name=login.x", "Value=26", ENDITEM,
		"Name=login.y", "Value=6", ENDITEM,
		"Name=JSFormSubmit", "Value=off", ENDITEM,
		LAST);

	return 0;
}

VuGen-检查点

目标
1. 了解什么是检查点
2. 掌握LR中检查点的使用
一、为什么学习检查点?
需求
1. 录制网站登录脚本 http://127.0.0.1:1080/WebTours/
2. 运行脚本是,检查登录用户是否为jojo
登录脚本
Action()
{
	# 解决session问题,注意位置,session在第一次请求服务器时就得到了
	web_reg_save_param("Session",
		"LB=name=userSession value=",
		"RB=>",
		LAST);


	// 打开WebTours首页 抓包分析得出是Get请求
	web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);

	// 模拟登录,抓包分析得出是Post请求
	web_submit_data("登录",
		"Action=http://127.0.0.1:1080/WebTours/login.pl",
		"Method=POST",
		"TargetFrame=",
		"Referer=",
		"Mode=HTML",
		ITEMDATA,
		"Name=userSession", "Value={Session}", ENDITEM,
		"Name=username", "Value=jojo", ENDITEM,
		"Name=password", "Value=bean", ENDITEM,
		"Name=login.x", "Value=26", ENDITEM,
		"Name=login.y", "Value=6", ENDITEM,
		"Name=JSFormSubmit", "Value=off", ENDITEM,
		LAST);

	return 0;
}
二、检查点
说明:检查点是在回放脚本期间搜索指定的文本或图片,从而验证服务器响应数据的正确性;
提示:
    1). LR中的检查点的使用-是调用 web_reg_find()函数
    2). 在LR中使用检查点的时候必须开启 Enable Image and text check(启用图片和文本检查)
    3). 要使用检查点录制模式必须是HTML-based mode 且为 web_submit_form模式
函数web_reg_find()
说明:web_reg_find为LR检查点函数;
参数:
    1. Text:要检查的文本内容【必填】
    2. Search:搜索响应数据范围- ALL、Body、Header【选填】
    3. Fail:失败条件-NotFound/Found 【选填】
    4. SaveCount:匹配结果数量且返回到参数中【选填】
注意:
    1. 函数包含reg为注册函数,注册函数必须放到依赖执行函数之前(依赖:函数运行后的数据给注册函数使用)
检查点操作方式有三种,这里着重学习手动写脚本添加检查点。
1. 使用HTML-based mode 且为 web_submit_form模式录制登录
2. 开启 Enable Image and text check(启用图片和文本检查)
3. 在特定位置插入检查点函数 web_reg_find()
1)使用HTML-based mode模式
启动:F4或菜单(Vuser)->Run-Time Settings
2)开启Enable Image and text check
启动:F4或菜单(Vuser)->Run-Time Settings
3)手动写脚本,插入检查点函数web_reg_find()
插入检查点函数 web_reg_find()
(注意包含reg为注册函数,位置必须放到依赖执行函数之前)
(这个截图是录制脚本的截图,不是手写脚本的截图,不过没关系,照样用)
**查找函数
设置参数
参数:
    1. Search for specific Text:搜索特定文本
    2. Search in:搜范范围 
                 1). All :搜索Body+Headers
                 2). Body:只搜索Body
                 3). Headers:只搜索Headers
    3. Save count:搜索满足条件的数量,并保存在指定的参数名中
    4. Fail if:检查失败的条件
                1). NotFound 没有找到检查失败 -推荐
                2). Found 找到了检查失败
最终脚本代码
Action()
{
	// 关联 session

	web_reg_save_param("Session",
		"LB=name=userSession value=",
		"RB=>",
		LAST);

	
	// 打开WebTours首页 抓包分析得出是Get请求
	web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);


	// 插入 注册检查函数 web_reg_find()
	
	web_reg_find("Fail=NotFound",
		"Search=Body",
		"SaveCount=num",
		"Text=jojo",
		LAST);

	// 模拟登录,抓包分析得出是Post请求
	web_submit_data("登录",
		"Action=http://127.0.0.1:1080/WebTours/login.pl",
		"Method=POST",
		"TargetFrame=",
		"Referer=",
		"Mode=HTML",
		ITEMDATA,
		"Name=userSession", "Value={Session}", ENDITEM,
		"Name=username", "Value=jojo", ENDITEM,
		"Name=password", "Value=bean", ENDITEM,
		"Name=login.x", "Value=26", ENDITEM,
		"Name=login.y", "Value=6", ENDITEM,
		"Name=JSFormSubmit", "Value=off", ENDITEM,
		LAST);

	// 使用传统普通检查文本函数,这个要在设置里面开启Enable Image and text check
	web_find("web_find",
		"What=jojo",
		LAST);

	// 使用检查图片
	web_image_check("web_image_check",
		"Src=images/hp_logo.png",
		LAST);

	return 0;
}

VuGen-事务

目标
1. 了解什么是事务
2. 掌握事务的常用方法
一、为什么学习事务?
需求:
    1. 统计订票网站登录业务需要的具体时间;
    2. 登录账户不是jojo,则登录业务失败;

问题:统计时间有很多办法可以做到(在jmeter中也可以对一个请求统计时间,对页面的一次请求也可以称作为事务,但不能对业务集合标记为事务),
	 但如何把登录业务标记成功或失败呢?
二、什么是事务?
概念:事务(Transaction)是用户在应用软件上操作的一个业务或多种业务集合(actions)的统称;
作用:
    1. 通过事务可标记业务开始和结束,并且可统计相应业务的操作时间(事务时间)【重点】
    2. 通过事务状态机制,可判断相应业务执行的成功与失败;【了解】
    3. 通过事务来衡量服务器性能;
    /*
    一个业务:登录业务
	业务集合:登录买票业务
    */
三、添加事务
说明:LR添加事务有两种方式:
    1). 录制脚本的时候添加【了解】
    2). 运行脚本的时候添加【推荐】
添加事务-录制时添加【了解】
添加事务-运行脚本时添加重点
提示:
    1. 插入事务开始 lr_start_transaction("Name")
        1. 插入方式:
            1). Ctrl+T
            2). 鼠标右键Insert->Start Transaction
            3). 工具栏菜单(Insert)->Start Transaction
        2. 参数
            Name:事务名称
    2. 插入事务结束 lr_end_transaction("Name", "status")
        1. 插入方式:参考插入事务开始
        2. 参数
            Name:事务名称和开始事务名相同;
            status:标志事务状态
                1). LR_AUTO: 自动-由LR判断 【推荐】
                2). LR_PASS:通过
                3). LR_FAIL: 失败
                4). LR_STOP: 停止
注意:
    1. 插入事务时,不要包含lr_think_time()函数,否则导致事务时间不准
    2. 事务名称(中文、英文),建议英文;
    3. 事务名称开始和结束必须相同 如:登录(Login)
    4. 事务必须成对出现 lr_start_transaction("登录"); ... lr_end_transaction("登录", LR_AUTO);
事务的添加我们就了解了这里,接下来我们了解下事务的响应时间
事务时间
说明:
    1). 一个事务的时间是指事务持续时间(Duration Time)从事务的开始到结束;
    2). 事务时间包含:
                    1). 响应时间
                    2). 浪费时间(Wasted Time)
                    3). 思考时间(Think Time)
                    4). 事务自身执行时间
    3). 在运行脚本后,运行日志内有事务时间、Wasted Time时间,单位为秒;
1)响应时间
说明:
    1. 响应时间=T1+T2+T3+T4+T5+T6+T7
    2. 客户端浏览器解析渲染响应数据不算响应时间
2)wasted Time (浪费时间)
说明:LR自动会把一些函数执行的时间统计为浪费时间,比如(关联、检查点)等函数
3)Think Time((思考时间)
说明:lr_think_time()函数
4) 事务自身执行时间
说明:lr_start_transaction("")和lr_end_transaction("", LR_FAIL)这两句代码执行的时间;
事务时间 汇总
1. 站在代码角度,事务的开始与结束,其实就是指定一段代码为一个事务;
2. 而代码段内可以包含思考时间、业务代码、事务函数,所以说事务时间包含响应(业务)
   时间、思考时间、事务自身、其他函数(浪费时间)
3. 事务时间=响应时间+浪费时间+思考时间+事务自身执行时间
需求 解决方案分析
1. 在登录函数之前插入开始事务
2. 获取登录后的用户名
3. 判断登录用户名是否为jojo,如果是
       插入结束事务并且事务状态为:LR_PASS,
   否则
       插入结束事务,事务状态为:LR_FAIL;

问题:如何判断登录名是否为jojo?
strcmp函数
说明:比较两个字符串(匹配大小写)是否相等,并返回int型数值;
用法:result = strcmp( string1, string2); 
      result:
            1). <0 string1小于string2;
            2). 0  string等于string2;
            3). >0 strring大于string2;
提示:如果要忽略大小写请使用 stricmp函数,用法参考strcmp
需求解决代码
Action()
{

	//  定义变量
	int result;

	# 解决session问题,注意位置,session在第一次请求服务器时就得到了
	web_reg_save_param("Session",
		"LB=name=userSession value=",
		"RB=>",
		LAST);


	// 打开WebTours首页 抓包分析得出是Get请求
	web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);

    // 插入开始 事务
	lr_start_transaction("登录");

	// 获取登录后的用户名
	web_reg_save_param("username",
		"LB=Welcome, <b>",
		"RB=</b>,",
		LAST);


	// 模拟登录,抓包分析得出是Post请求
	web_submit_data("登录",
		"Action=http://127.0.0.1:1080/WebTours/login.pl",
		"Method=POST",
		"TargetFrame=",
		"Referer=",
		"Mode=HTML",
		ITEMDATA,
		"Name=userSession", "Value={Session}", ENDITEM,
		"Name=username", "Value=jojo", ENDITEM,
		"Name=password", "Value=bean", ENDITEM,
		"Name=login.x", "Value=26", ENDITEM,
		"Name=login.y", "Value=6", ENDITEM,
		"Name=JSFormSubmit", "Value=off", ENDITEM,
		LAST);

	// 输出username
	lr_output_message("username 值为%s ",lr_eval_string("{username}"));

	// 判断是否为jojo
	result=strcmp(lr_eval_string("{username}"),"jojo");

	

	 //注意:输出变量是直接读取,参数读取需要用lr_eval_string()读取
   
	//lr_output_message("判断的结果值为:%d",result);


	// 判断是否相等,相等插入LR_PASS事务状态
	if (result==0) {

		lr_output_message("登录的用户为jojo通过");

		// 插入事务 状态为通过  
		lr_end_transaction("登录", LR_PASS);
		
	}else{

		lr_output_message("登录的用户不是jojo失败");

		// 插入事务 状态为失败 
		lr_end_transaction("登录", LR_FAIL);
	}
	
	return 0;
}
执行结果如图
相关资料
响应登录信息
总结
1. 什么是事务
2. 插入开始事务和结束事务快捷键
3. 事务状态及作用
4. strcmp函数作用及返回值

VuGen-集合点

目标
1. 了解集合点概念
2. 掌握集合的使用
一、为什么要学习集合点?
需求:
    1. 10个用户"同时"登录订票网站,统计服务器处理登录事务性能;
问题
1. 10个用户同时登录,如何保证10个虚拟用户同时(忽略绝对论,最大程度去模拟)去操作?
集合点(rendezvous)
说明:在指定的地点集合指定虚拟用户(Vuser),条件满足时集合的虚拟用户,同时去操作同一事务;

提示:
    1. 在VuGen脚本内可以插入集合点,要运行集合点必须配合下一章《Controller》知识点,我们在这里
       先学习如何基于VuGen创建集合点;
    2. 前面了解的并发测试就是基于集合点来完成【重点】
集合点创建
方式:
    1. 指定插入位置,鼠标右键->Insert->Rendezvous 【推荐】
    2. 工具栏菜单(Insert)->Rendezvous
参数:
    Rendezvous Name:集合点名称-在Controller场景运行时使用 如:Login
提示:
    1. 集合点创建,相当于找好集合的地方,那么到底应该那些用户及集合多少用户需要单独设置
    1. 集合点要设置和运行,必须在Controller工具内完成;
    2. Controller工具我们目前还没有学习,我们在这里先学习使用它如何设置集合点
集合点设置
1)、基于当前脚本 创建Controller场景
1. 菜单工具(Tools)->Create Controller Scenario
   (基于当前脚本直接创建场景)
2)选择场景及虚拟用户数
1. 场景模式:Manual Scenario(手工场景)
2. Numberof Vusers:虚拟用户数
提示:
    场景模式:我们还没了解,在这里暂时使用下手工场景
    虚拟用户数:为并发用户数,我们这里以需求10个并发登录为例
3)Controller工具内设置集合策略
**打开集合点设置
Controller工具-菜单(Scenario)->Rendezvous
说明:
    1. 创建场景时10个用户,默认10个用户都参与集合点
    2. 可指定用户不参与集合点 选择用户-单击Disable VUser按钮
    3. Policy:设置集合用户策略
policy集合策略
1. 集合策略:
    1). 当所有虚拟用户中的x % 到达集合点进释放;
    2). 当所有正在运行的虚拟用户中的x %到达集合点时释放;
    3). 当x 个虚拟用户到达集合点时释放; 【推荐】
2. 时间:
    1). Timeout between Vusers:默认30秒-当指定时间内还未达到以上集合策略用户数量时,释放已集合用户去执行;

3. 提示:
    1). 集合点的插入和场景设置我们就学习完了,集合点的执行我们在学习完Controller工具,在操作;
代码
Action()
{

	//  定义变量
	int result;

	# 解决session问题,注意位置,session在第一次请求服务器时就得到了
	web_reg_save_param("Session",
		"LB=name=userSession value=",
		"RB=>",
		LAST);


	// 打开WebTours首页 抓包分析得出是Get请求
	web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);


	//插入集合点,集合点在此位置-放到事务之前

	lr_rendezvous("集合点登录");


    // 插入开始 事务
	lr_start_transaction("登录");


	// 获取登录后的用户名
	web_reg_save_param("username",
		"LB=Welcome, <b>",
		"RB=</b>,",
		LAST);


	// 模拟登录,抓包分析得出是Post请求
	web_submit_data("登录",
		"Action=http://127.0.0.1:1080/WebTours/login.pl",
		"Method=POST",
		"TargetFrame=",
		"Referer=",
		"Mode=HTML",
		ITEMDATA,
		"Name=userSession", "Value={Session}", ENDITEM,
		"Name=username", "Value=jojo", ENDITEM,
		"Name=password", "Value=bean", ENDITEM,
		"Name=login.x", "Value=26", ENDITEM,
		"Name=login.y", "Value=6", ENDITEM,
		"Name=JSFormSubmit", "Value=off", ENDITEM,
		LAST);

	// 输出username
	lr_output_message("username 值为%s ",lr_eval_string("{username}"));

	// 判断是否为jojo
	result=strcmp(lr_eval_string("{username}"),"jojo");

	

	 //注意:输出变量是直接读取,参数读取需要用lr_eval_string()读取
   
	//lr_output_message("判断的结果值为:%d",result);


	// 判断是否相等,相等插入LR_PASS事务状态
	if (result==0) {

		lr_output_message("登录的用户为jojo通过");

		// 插入事务 状态为通过  
		lr_end_transaction("登录", LR_PASS);
		
	}else{

		lr_output_message("登录的用户不是jojo失败");

		// 插入事务 状态为失败 
		lr_end_transaction("登录", LR_FAIL);
	}
	
	return 0;
}
集合点设置 注意事项
1. 集合点只能在手工场景模式内使用
2. 多个脚本需要同步并发,可以在不同脚本内设置相同集合点,在一个场景内搭建这些脚本;
3. 如果脚本内没有设置集合点,在Controller内集合点策略设置功能不生效
4. 集合点只能在Action部分添加,init、end无法添加

提示:手工场景我们现在还没有学习,在学完手工场景的时候我们在回顾下以上注意事项;

原文地址:https://www.cnblogs.com/st998/p/13789398.html