性能测试工具—LoadRunner

LoadRunner

LoadRunner性能测试过程

开发测试脚本

录制脚本

完善脚本

创建性能测试场景

 利用Analysis分析结果

性能测试报告


LoadRunner

LoadRunner是一种适用于许多软件体系架构的自动负载测试工具,从用户关注的响应时间、吞吐量,并发用户和性能计数器等方面来衡量系统的性能表现,辅助用户进行系统性能的优化。

原理:

LR启动以后,在任务栏会有一个Agent进程,通过Agent进程,监视各种协议的Client与Server端的通讯,用LR的一套C语言函数来录制脚本,所以只要LR支持的协议,就不会存在录制不到的,然后LR调用这些脚本向服务器端发出请求,接受服务器的响应。

组成:

LoadRunner包括三个功能组件,VuGen(用户脚本生成器)、Controller(测试控制器)、Analysis(结果分析器)。

VuGen:是录制或编写脚本的地方,通过录制或编写来模拟用户的行为

Controller:执行负载测试管理和监控的中心。指定具体的性能测试方案,执行性能测试、手机测试数据、监控测试指标。会将测试过程中收集到的客户机、服务器和网络的性能指标数据显示在控制页面上,便于测试人员对系统的表现随时掌握。

Analysis:在测试完成之后,对测试过程中收集到的各种性能数据进行计算、汇总和处理,生成各种图表和报告,为系统性能测试结果分析提供支持。

LoadRunner性能测试过程:

  • 制定性能测试计划
  • 分析应用程序、确定测试目标
  • 开发测试脚本
  • 每一个虚拟用户的活动、参数化、定义事务、定义检查点等
  • 设计运行场景
  • 运行场景描述再测试活动中发生的各种事件。一个运行场景包括一个运行虚拟用户活动的Load Generator机器列表,一个测试脚本的列表以及大量的虚拟用户和虚拟用户组
  • 运行、监视测试
  • 运行测试,在运行过程中,需要监视各个服务器的运行情况(DataBase Server、Web Server等)
  • 分析测试结果
  • 分析大量的图表,生成各种不同的报告,最后会得出结论。
  • 系统优化:分析测试后的结果,对系统进行调优
  • 优化后再进行测试
  • 开发测试脚本

  • 在安装LoadRunner的路径下,找到\LoadRunner\WebTours,选择StartServer.bat启动服务
  • 录制脚本

     启动VuGen,选择新建脚本,选择协议为Web-HTTP/HTML,可以修改脚本名和脚本存放的位置,点击创建;​

     

    创建完成之后:

    VuGen 中的脚本分为三部分:vuser_init、vuser_end 和Action。

    vuser_init用于用户初始化;

    vuser_end用于用户清理工作;

    Action用于具体的需要测试的操作。

    开始录制脚本:选择要将脚本录制在哪个地方;录制的方式(以浏览器为例),找到浏览器所在的位置,设置要录制的URL地址;

    在录制选项中需要设置:

    基于HTML的脚本模式下:

    web_submit_form:

    上下文相关的,依赖上下文才能提交;

    web_submit_data:

    上下文不相关,每个函数都指定了具体的url地址,可以直接提交成功,如果只关注协议,不需要关注页面,可使用这种方式录制。这个函数提供更多技术细节,在测试的过程中可控性更高。

    Web_submit_form只提供了和Cache中有差别的数据,其余的数据会自动从Cache中取。

    而Web_submit_data则提供了所有的数据,不管Cache存在不存在Web_submit_data都是可以工作的。

    点击开始录制,LoadRunner会自动调用对应的浏览器,并开始录制操作。

    (以登录操作的录制为例)

    录制过程中,屏幕上会出现一个工具条,提供录制的暂停、停止、新增操作,增加事务、集合点等操作。

    登录的用户名和密码,保存在D:\HP LoadRunner 12.01\WebTours\cgi-bin\users路径下

    开始录制,要先添加集合点和事务开始,点击登录进行录制,登录操作完成之后添加事务结束,结束录制。

    录制完成之后会出现:

    录制完成之后的脚本:

    完善脚本

    插入事务:

    事务:事务代表了用户的某个业务过程,需要衡量这些业务过程的性能。

    插入事务操作可以在录制过程中进行,也可以在录制结束后进行。LoadRunner 可以在脚本
    中插入不限数量的事务。

    例如下面的登录操作,我们只需要关注的是登录这一个操作的性能,所以就需要在登录的前后加入事务。

    // 事务开始
    lr_start_transaction("1_transaction");
    
    web_submit_data("login.pl", 
    		"Action=http://127.0.0.1:1080/cgi-bin/login.pl", 
    		"Method=POST", 
    		"TargetFrame=body", 
    		"RecContentType=text/html", 
    		"Referer=http://127.0.0.1:1080/cgi-bin/nav.pl?in=home", 
    		"Snapshot=t4.inf", 
    		"Mode=HTML", 
    		ITEMDATA, 
    		"Name=userSession", "Value=131601.73309032zHzQcztpVtfiDDDDtAzVfpfitiHf", ENDITEM, 
    		"Name=username", "Value={username}", ENDITEM, 
    		"Name=password", "Value=bean", ENDITEM, 
    		"Name=login.x", "Value=48", ENDITEM, 
    		"Name=login.y", "Value=9", ENDITEM, 
    		"Name=JSFormSubmit", "Value=off", ENDITEM, 
    		LAST);
    
    //事务结束
    lr_end_transaction("1_transaction",LR_AUTO);

    插入集合点:

    集合:当我们测试多个用户并发时,每个用户执行到该事务脚本的先后顺序是不确定的,所以
    得到的测试结果也并不是一个完全并发的极限测试结果。在开始事务之前 ,插入一个“集合点”,那么在多用户执行时,就可以将用户请求停下来,直到用户数量达到满足的条件(默认是100%的用户都到达集合点)。

    集合点插入在事务之前

    集合点经常和事务结合起来使用。

    集合点只能插入到Action 部分,vuser_init和 vuser_end 中不能插入集合点。

    lr_rendezvous("login_avious");

    插入检查点:

    为了检查Web服务器返回的网页是否正确,可以插入检查点来验证网页上是否存在指定的Text。

    检查点的含义和unittest中的断言基本上一致

    关联:

    设置运行脚本的次数:

    参数化输入:

    如果用户在录制脚本过程中,填写提交了一些数据,比如要增加数据库记录。这些操作都被记录到了脚本中。当多个虚拟用户运行脚本时,都会提交相同的记录,这样不符合实际的运行情况,而且有可能引起冲突。为了更加真实的模拟实际环境,需要各种各样的输入。

    使用参数化输入的方法能够满足上述情况。

    用参数表示用户的脚本有两个优点:

    1. 可以使脚本的长度变短。
    2. 可以使用不同的数值来测试你的脚本。例如,如果你企图搜索不同名称的图书,你仅仅需要写提交函数一次。在回放的过程中,你可以使用不同的参数值,而不只搜索一个特定名称的值。

    参数化包含两项任务:

    1. 在脚本中用参数取代常量值
    2. 设置参数的属性以及数据源

    关联和参数化结合使用

    插入函数:

    VuGen 中可以使用C 语言中比较标准的函数和数据类型,语法和C 语言相同。

    在脚本页面,通过右键-插入-新建步骤可以查看函数列表。

    常用的函数和数据类型:

            控制脚本流程

    if { } else { }
    for{ }
    while{ }

    字符串函数

    strcmp 比较两个字符串
    strcat 连接两个字符串
    strcpy 拷贝字符串

    输出函数

    lr_output_message 输出一条消息

    LoadRunner提供的标准函数

    lr_eval_string 该函数功能是得到参数(参数化输入中)当前的值
    exg: lr_output_message("temp = %s", lr_eval_string("{WCSParam2}"));
    lr_save_string 该函数功能是把一个字符串保存到参数中
    exg: lr_save_string("439","WCSParam3");

            if(strcmp(lr_eval_string("{username}"),"Jojo")==0){
    			lr_log_message("This is Jojo!");
    		}else{
    			lr_log_message("This is other user!");
    		}

     完整的一个测试脚本:

    Action()
    {
    
    	web_url("welcome.pl", 
    		"URL=http://127.0.0.1:1080/cgi-bin/welcome.pl?signOff=true", 
    		"TargetFrame=", 
    		"Resource=0", 
    		"RecContentType=text/html", 
    		"Referer=http://127.0.0.1:1080/WebTours/", 
    		"Snapshot=t3.inf", 
    		"Mode=HTML", 
    		LAST);
    
    	lr_think_time(17);
    
    	lr_rendezvous("login_avious");
    	
    	lr_start_transaction("1_transaction");
    
    	//增加检查点
    	//增加一个参数:SaveCount=reservation_Count,到检查点不着急检查,加载完成之后再进行检查
    	web_reg_find("Search=Body",
    		"Text=Welcome, <b>{username}</b>, to the Web Tours reservation pages","SaveCount=reservation_Count",
    		LAST);
    
    	//增加关联
    /*Correlation comment - Do not change!  Original value='{username}' Name ='CorrelationParameter' Type ='Manual'*/
    	web_reg_save_param_ex(
    		"ParamName=CorrelationParameter",
    		"LB=blockquote>Welcome, <b>",
    		"RB=<",
    		SEARCH_FILTERS,
    		"Scope=Body",
    		"RequestUrl=*/login.pl*",
    		"NotFound=warning",//增加这个之后可以成功
    		LAST);
    
    
    	web_submit_data("login.pl", 
    		"Action=http://127.0.0.1:1080/cgi-bin/login.pl", 
    		"Method=POST", 
    		"TargetFrame=body", 
    		"RecContentType=text/html", 
    		"Referer=http://127.0.0.1:1080/cgi-bin/nav.pl?in=home", 
    		"Snapshot=t4.inf", 
    		"Mode=HTML", 
    		ITEMDATA, 
    		"Name=userSession", "Value=131601.73309032zHzQcztpVtfiDDDDtAzVfpfitiHf", ENDITEM, 
    		"Name=username", "Value={username}", ENDITEM, 
    		"Name=password", "Value=bean", ENDITEM, 
    		"Name=login.x", "Value=48", ENDITEM, 
    		"Name=login.y", "Value=9", ENDITEM, 
    		"Name=JSFormSubmit", "Value=off", ENDITEM, 
    		LAST);
    		//输出信息
    		lr_output_message("============================");
    		lr_output_message(lr_eval_string("{username}"));
    		lr_output_message("============================");
    		
    		if(strcmp(lr_eval_string("{username}"),"Jojo")==0){
    			lr_log_message("This is Jojo!");
    		}else{
    			lr_log_message("This is other user!");
    		}
    	
    	lr_end_transaction("1_transaction",LR_AUTO);
    
    	return 0;
    }

    创建性能测试场景

     

     确定之后就会自动打开Controller;

    以负载测试为例进行性能测试:

    负载测试:负载测试是在被测系统上不断增加压力,直到各项指标达到饱和,例如“响应时间”超过预定指标或者某种资源使用已经达到饱和状态。这种测试方法可以找到系统的处理极限,为系统调优提供数据。

     设置每个5秒钟初始化一个用户

     每隔5秒钟启动一个用户

     总的持续时间是5分钟:

     每隔5秒钟停止一个用户:

     设置完成之后开始进行测试:

     利用Analysis分析结果

    在执行完毕之后,在Analysis中进行结果分析。

    摘要报告是总的分析报告,可以在图中添加新的结果图,查看各个指标的情况。

    最终得到性能测试的报告:

     “平均事务响应时间”图显示在测试场景运行期间的每一秒内事务执行所用的平均时间,通过它可以分析测试场景运行期间应用系统的性能走向。此外,“平均事务响应时间”图表还统计出测试场景运行时间内各个事务的最大值、最小值、平均值等信息。通过分析平均响应时间,可以看出系统的性能走向,确定是否存在问题,如果存在问题,可以进行下一步的分析。拐点出现后,交易将会出现排队等待,直接导致ART快速上升,此时服务器出现瓶颈,需要进一步分析。

     事务摘要图显示了整个测试期间的事务摘要,包括每一个事务的pass,fail等。 对事务进行综合分析是性能分析的第一步,通过分析测试时间内用户事务的成功与失败情况,可以直接判断出系统是否运行正常。

    点击率/吞吐率点击率的下降说明服务器的响应时间在变慢,需要对应用系统进行进一步的分析。
    吞吐率和点击率的图基本上会保持一致。拐点预示着资源耗尽或出现瓶颈,此后TPS将不再上升。同样,当点击数、TPS不再增加时,也可能出现系统瓶颈。

    性能测试报告

    性能测试报告一般会包括如下部分:测试目标、测试概要描述、测试的结果和数据、测试结论

    测试目标:本次测试预期达到的性能要求

    测试概要描述:系统结构、测试时间、测试地点和测试人员、工具和环境、测试过程简介

    测试结果和分析:测试场景、测试结果、结果分析

    测试结论:遗留的问题,缺陷列表、测试结论、建议、测试结果的限制。

    来源:小王~同学

    物联沃分享整理
    物联沃-IOTWORD物联网 » 性能测试工具—LoadRunner

    发表评论