• 性能测试基础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无法添加
    
    提示:手工场景我们现在还没有学习,在学完手工场景的时候我们在回顾下以上注意事项;

  • 相关阅读:
    UIImagePickerController 获取相片视频
    plist文件Boolean类型读写方法
    stringstream 用法
    C++11中提供了std::bind
    图像的亮度和对比度调节
    windows C++ 全局异常捕捉函数
    windows 下多线程
    C++11 Lambda表达式(匿名函数)
    图像亮度调节--幂次变换
    SEH:结构化异常处理 学习
  • 原文地址:https://www.cnblogs.com/st998/p/13789398.html
Copyright © 2020-2023  润新知