性能测试学习与LR工具

LoadRunner_性能测试

接口测试必备

接口文档、协议、请求方式、请求地址、请求参数、返回值。

接口测试类型

功能、安全性、性能。

1、什么是性能

性能不好的表现

12306买票崩溃,微博热搜崩溃,双11崩溃等。

大量用户用大量的数据访问程序,程序表现未能达到预期。

有些系统会通过通过提升自己本身性能去提升用户体验,有些系统则会千方百计限制用户在某一时段的访问来满足性能要求

**性能的表现:**软件又好(功能)又快(性能),在软件功能正确情况下在考虑性能

从黑盒测试角度的性能表现

  • 数据请求经过网络发送
  • 服务端接受处理请求
  • 数据库服务器获取数据
  • 前端处理后返回数据
  • 应用界面接收到数据进行响应

从系统维护角度的性能表现

  • 硬件资源利用率
  • 可以提升系统性能的硬件
  • 系统是否支持24*7运行
  • 系统的可扩展性、兼容性、可能瓶颈

从程序开发角度的性能表现

  • 结构合理性
  • 数据库设计合理性
  • 代码与算法的优化
  • 系统中资源运行的使用方式(全局和局部变量)

2、性能测试的定义

**定义:**通过自动化测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试

  • 性能测试除了关注高峰值和异常表现下的性能外,还关注正常情况的运行状况
  • 性能测试需要借助工具进行
  • 性能测试需要借助监控工具收集的信息和各项指标来分析系统性能

对于性能测试,测试过程不重要,重要的是对于性能测试前的分析,每种软件的性能变化都是不一样的。如购物软件,性能会随着一些特定日子产生大量波动;而像微博新闻这种,会随着出现重大新闻而波动

性能测试分类

  1. **一般性能测试:**验证软件在正常情况和系统条件下能否满足性能指标
  2. **负载测试:**验证系统在一定压力下延长系统的运行时间,直到系统性能出现拐点
  3. **压力测试:**验证系统在极限情况下,即某项指标已经处于饱和状态下的系统性能表现
  4. **稳定性测试:**验证系统在连续运行下,查看系统的各项性能指标–MTBF(错误发生平均时间间隔)
  5. **大数据量分析:**验证系统使用大批量数据或影响下系统各项指标是否正常
  6. **配置测试:**验证系统在不同软件和硬件配置下,找出系统各项资源的最优分配
  7. 恢复性测试/可维护性测试:当软件出现故障时的自身恢复能力

我们用一个瓶子举例来表现性能测试分类

在这里插入图片描述

向瓶子内加水(数据、访问量等),若只是溢出则是局部崩溃。系统还能用,若是瓶子裂开,那就是全面崩溃,系统不能用。

数据到达峰值,系统还没崩溃,但是在多家一点系统就崩溃,该峰值称为系统瓶颈

3、性能测试术语

虚拟用户:测试环境中,通过测试工具在物理计算机上使用vuser来虚拟实际用户

点击率:每秒用户向服务器提交的请求数量

并发和并发用户数:并发强调大量用户的同时操作(能对服务器产生压力的操作),注意在线用户数和系统用户数是两种用户

  • 系统用户是指使用特定系统的用户量
  • 在线用户登陆了系统,或者正在使用系统的用户

每秒事务数TPS:每秒系统能够处理的交易或者事务数量

根据不同系统要求不同,

响应时间:包含请求响应时间和事务响应时间

用户角度自己的带宽,运营商的服务器数据处理,电脑处理速度等都会影响响应时间

  • 请求响应时间:服务器收到用户请求然后把响应内容发送出去这段时间

  • 事务响应时间:服务端处理请求(后端调用函数处理业务)的时间

吞吐量:在单次业务中,客户端和服务端进行的数据交互总量

吞吐率:吞吐量/传输时间=吞吐率,衡量服务器性能和网络性能重要指标之一。可以用请求数/秒、页面数/秒、字节数/秒进行衡量

思考时间:两次请求之间的间隔时间(默认情况思考时间为0)

性能计数器:描绘各种类型服务器或者操作系统性能的指标,在进行资源监控和系统瓶颈分析起到重要作用

4、性能测试流程与分析

在功能测试通过后才会进行性能测试

4.1、流程

性能需求分析-性能测试计划-测试环境搭建-测试工具选择-测试执行/测试结果分析/软硬件调整与优化

性能需求分析

客户方提出需求,根据客户提供历史数据分析,在针对项目本身进行需求分析和定位,参考同业项目,参考其他资料数据。

**可以参考的比如:**响应速度、在线用户数、某个接口或功能的在某个时间并发数、请求的成功率、高峰期下系统表现、稳定性测试等

设计测试场景

场景设计要从以下方面进行测试,系统运行时长、并发用户数量、系统执行操作时长、终止性能测试方式、在该场景中需要监控什么作为性能测试的指标、要采取什么方式来实现该性能、该场景是否符合实际使用需求、压力出现的指标(持续加压还是适当减压)

测试结果通过的指标

测试标准没有绝对,需要专家依据实际情况确定标准

性能调优的需要掌握的技能

对于性能测试人员,测试和优化性能的能力同样重要。我们需要提出解决性能问题的方案的能力

  1. 系统硬件与资源的相互关系和原理(带宽?CPU?硬盘?)
  2. 选择可靠性能指标与指标
  3. 永不宕机实现原理与常见错误
  4. 业务操作流程的优化
  5. 多系统串联原理以及测试隔离
  6. 排队处理请求与缓存和延迟的优化能力

4.2、分析实例

假设现在系统要求支撑200w用户在线

  • 首先考虑当前硬件条件下是否支撑200wVue
  • 如果可以支撑,则考虑能否支撑300w,以此类推找到极限
  • 如果不可以支持,需要向下调整用户数量找出系统瓶颈
    • 主要瓶颈解决后在判断能否支撑200w用户数量
    • 可以支撑就输出测试结果,不可以需要更改硬件配置

性能测试的指标是饭要一口一口吃,不能一口气吃成胖子,或者干脆不吃成瘦子

性能测试中的难点和重点

需求分析、场景设计、性能诊断和模拟、环境搭建和模拟

专业角度进行性能分析

  • 服务器硬件性能
  • 根据需求和历史数据指定性能目标
  • 建立一个性能模型
  • 对开发代码框架和硬件结合进行分析
  • 对发布版要有一个基准测试
  • 对软件进行性能的验收测试和稳定性测试
  • 对生产环境的配置和优化
  • 要正对特定的场景做性能分析
  • 要依照实际场景去设计性能测试

5、性能测试用例设计

注意因为性能测试是在功能测试后执行,所以不需要反向数据验证了,但是测试目的里包含很多测试要点

准确叫设计场景,性能测试用例设计本身时通过场景法设置用例,归根结底是设计场景

在这里插入图片描述

用事务代指用户操作行为的总称,用来衡量TPS(每秒事务数)、事务成率。

集合点表示所有用户集合在一起进行操作

6、LoadRunner工具使用详解

常见性能工具:LoadRunner/Jmeter/Grinder/QALoad/WAS/WebLoad/RPT

loadrunner脚本语言是c

Loadrunner安装完后出现三个图标

  • virtual user Generator–录制脚本
  • LoadRunner Conntroller–创建、运行和监控场景
  • LoadRunner Analysis–分析测试结果

LoadRunner自带一个体验订票BS系统Start HP Web Tours Server让用户体验LoadRunner

默认用户密码jojo/bean

Web Tours

6.0、有关LR12使用问题

刚使用LR12测试,浏览器使用是chrome,录制项目是LR自带的订票系统。

录制时无法打开测试网页

开始录制时碰见能打开浏览器,但是打不开网页的情况,后面网上排查发现打开fiddler就能重新录制,遇到Loadrunner的古怪问题一般打开fiddler都能解决

fiddler都解决不了的话,别怕,我们还有终极大招:fiddler跟踪,保存成SAZ文件后,用LR12 open solution选项打开,然后就会发生令人感动到哭的一幕:LR12自动把fiddler跟踪文件转成了可以调试的脚本。这样的话,脚本问题解决了,就是得自己再去参照下添加事务

6.1、LoadRunner模块介绍

  1. virtual user Generator引擎,可以监控并记录客户服务端通话,让虚拟用户模拟实际业务流程,记录用户操作行文,并将其转化为特定测试脚本语言

  2. Controller创建测试场景,为了实现真是负载,让一台或多台机器模拟多个用户同时执行脚本。

    每个场景都相当于一套负载测试方案,包括了反应业务操作流程的测试脚本,梵音系统承受能力的虚拟用户数量用于平衡测试机器自身压力

  3. Analysis分析测试结果,导入前两个测试结果数据,帮助用户找到性能问题同时溯源,提供优化。

6.1.1、virtual user Generator

6.1.1.1、脚本录制
  1. 选择协议类型

在这里插入图片描述

  • 依次是单协议脚本、多协议脚本(需要考虑协议之间的冲突)、移动应用脚本、常用协议脚本和最近创建脚本所用协议

  • 如果不知道测试系统支持什么协议,在创建脚本目录下有一个Protocol Advisor,可以检测被测应用支持的协议

在这里插入图片描述

 - 一般根据被测应用采用BS结构还是CS架构来选择协议
  1. 脚本录制位置位置是有说道的

    Vuser_init存放应用程序初始化脚本Vuser_end存放和应用程序注销和关闭时的脚本Action存放实际操作脚本,前两者都只执行一次
    在这里插入图片描述

  2. 脚本重放前需要重新编译一下,编译通过后再进行重放,因为编译不通过重发是不能通过的

6.2、LoadRunner运行过程

  • file下点击Scripts and solution创建要录制的脚本类型

在这里插入图片描述

在这里插入图片描述

  • 回放脚本通过后去Control创建场景,tools下的Create Controller Scenario创建场景,创建成功后会直接打开Control应用

在这里插入图片描述

在这里插入图片描述

  • 切换到run页面,准备运行场景
    在这里插入图片描述

  • ctrl+s保存性能测试场景到LR默认存储地点,但是只是保存测试场景的lrs文件结果不从这里,Analysis打开进行分析

6.3、LoadRunner 脚本编写

6.3.1、LR常见函数

//是响应后的操作
web_link("测试结果中显示的名称","TEXT=需要单击的超链接名称",LAST)//模拟单击超链接操作,页面访问常用函数,LAST表示操作的时序性
web_link("clicklink","Text=https://www.baidu.com",ord=3,LAST)//多个重名超链接处理方案 ,多个重名超链接ord表示点击次序  

//是请求的操作,模拟用户请求,访问型函数    
web_url("header.html", 
		"URL=http://{host_127_0_0_1_1080}/WebTours/header.html", 
		"Resource=0", 
		"Referer=http://{host_127_0_0_1_1080}/WebTours/index.htm", 
		"Snapshot=t14.inf", 
		"Mode=HTML", 
		LAST)    //url可以取代link

    
///操作表单。自动检测当前页面是否有form表单,有的话将内部数据进行post提交    
web_submit_form("login.pl", 
		"Snapshot=t16.inf", 
		ITEMDATA, 
		"Name=username", "Value=jojo", ENDITEM, 
		"Name=password", "Value=bean", ENDITEM, 
		LAST)
    //需要服务器返回一个页面,且起作用前必须含有form表单
    //数据条目可以有多条, 第一个拿的是form标签的action属性值用作区分不同的form标签
    //这样一条表示一个form表单提交数据数据"Name=username", "Value=jojo", ENDITEM
    
web_submit_data("login.pl",
"Action=http://127.0.0.1:1080/cgi-bin/login.pl","Method=POST",
"RecContentType=text/html" ,
"Referer=http://127.0.0.1:1080/cgi-bin/nav.pl?in=home","Snapshot=t2.inf""Mode=HTML",ITEMDATA,
"Name=userSession",
"Value=123658.78217902zDzAzQipzAiDDDDDDiVztpVQVzf",ENDITEM,
"Name=username", "Value=jojo",ENDITEM,
"Name=password", "Value={PasswordParameter}", ENDITE"Name=login.x-", "Value=44",ENDITEM,
"Name=login.y" , "Value=14",ENDITEM,"Name=login", "Value=Login",ENDITEM,
"Name=JSFormSubmit , "Value=off",ENDITEM,
//与from不同不需要一定有页面响应才发送数据,而是直接给页面发送数据  

lr_think_time()//思考时间,等待时间,单位s

lr_save_string(r_decrypt("5e54d38063296342"), "PasswordParameter");//记录一个字符串
lr_decrypt("5e54d38063296342")//加密字符串(结果)

web_image()//模拟鼠标点击属性定义的图像,一般设置后没有使用必要           
                

6.3.2、VuGen脚本设计与强化

6.3.2.1、脚本插入事务

事务是局部操作的汇总,TPS每秒事务数基础

事务

  • 性能测试中,除了衡量整个脚本的性能,还需要脚本中某一段或某几段的操作的性能,这样才能更加详细的知道,用户的什么动作对系统的性能影响最大
  • LR在实现上述要求中引入事务来达到这一要求,事务具体到脚本里就是脚本中特别定义的某几段操作,也就是一段脚本程序。如负责登录的脚本,负责下单的脚本等。

在这里插入图片描述

#对于事务,要有开始和结束,一下是一段脚本的截取
	lr_start_transaction("login");
	web_submit_form("login.pl", 
		"Snapshot=t21.inf", 
		ITEMDATA, 
		"Name=username", "Value=jojo", ENDITEM, 
		"Name=password", "Value=bean", ENDITEM, 
		LAST);

	web_image("Search Flights Button", 
		"Alt=Search Flights Button", 
		"Snapshot=t22.inf", 
		LAST);
    lr_end_transaction("login", LR_AUTO); 
#事务开始和结束的宣称(事务的名称)必须保持一致,否则报错

加入事务后的体现

在这里插入图片描述

有了事务后最后统计结果时就能体现该登录事务下性能(通过或不通过),不通过是会展示原因,上图是事务验证通过后ouput的体现

事务可以相互嵌套,比如订票事务中可以穿插登录

注意录制脚本时允许手动添加事务

在这里插入图片描述

  1. 记录事务前暂停,点击事务开始,然后继续录制操作。
  2. 操作完成后点击结束录制即可,这样就不需要手动添加事务代码
6.3.2.2、脚本集合点设置

虚拟用户集合在一起实现并发操作,实现短暂时间的大量操作

什么是集合点

  • 一般的并发过程只体现在开始执行的一瞬间,随着服务器对请求的响应时间不一致或系统环境限制,实际用户执行速度完全是不一样的。所以在运行过程中能够做到集合到一点可能性极低,这种不算真正意义上的并发。
  • 系统压力最大的情况,所有用户都集合到系统瓶颈的某一个点时同时操作(参考淘宝双11购物)
  • 从脚本来说,这个集合点还是几段语句组成,LR支持集合点功能实现真正意义的并发

**对于集合点语句的设置,只能放在action脚本中,禁止放到初始化vuser_init()和vuser_end()中,且必须在事务开始之前,不能在事务中。**如下

lr_start_transaction(“login”);

#省略其他脚本代码

lr_rendezvous(“start”);

lr_end_transaction(“login”);

lr_rendezvous("start");

集合点设置步骤

  1. design->insert script->Rendezvous,添加集合点

在这里插入图片描述

  1. 虚拟用户有多少个需要放到场景中也就是Controller中设置,

  2. 设置集合点的释放策略,策略有四种,如下图

    位置:Controller软件下Scenario->Rendezvous->policy

    image-20220323175206873

在这里插入图片描述

  • 百分比虚拟用户到集合点位置释放集合点
  • 百分比运行用户到集合位置释放集合点
  • 固定数目虚拟用户到集合点位置时释放集合点
  • 虚拟用户超时设定,在规定时间内没达到指定用户数量也会自动往下执行

实际运行性能测试时,达到集合点的用户数量都看脸,所以集合点的运行结果几乎是不可能完美达成的。一般运行时间越长,可以达到集合点的用户梳理就越多

运行前后中,可以在Controller的run界面看到虚拟用户的运行状态。具体到每一个用户点击黑框位置就行,图下是显示

在这里插入图片描述

6.3.2.3、脚本的检查点功能

就是断言

什么是检查点

  • 主要验证某个界面上是否存在指定的text对象或图片对象
  • 在使用LR测试web应用时,可以检查压力较大时服务器能否返回正常页面
web_reg_find()
#要在网页请求之前进行检查点的注册
#检查点(断言)函数一般放在页面请求之前

使用检查点步骤

  1. 开启检查点功能,打开运行设置Runtime Settings选择Preferences ,点击右侧checks

在这里插入图片描述

  1. 脚本插入检查点函数,打开步骤选择器添加,或者手敲,其他函数也可以通过这样设置代码

在这里插入图片描述
在这里插入图片描述

  1. 设置检查点内容,尽量放在web_url()之前,输入内容后可以自动设置代码,

在这里插入图片描述

其他的断言函数需要后续学习了

实例运行(LR自带的订票系统)

需要检查登录页面是否正常,同时检查sign up now连接是否返回正确

Action()
{
	//文本检查点
	web_reg_find("Fail=NotFound",
	    "Search=Body",
		"SaveCount=2",
		"Text/DIG=Web Tours",
		LAST);

	
	web_url("index.htm", 
		"URL=http://{host_127_0_0_1_1080}/WebTours/index.htm", 
		"TargetFrame=", 
		"Resource=0", 
		"Referer=", 
		"Snapshot=t6.inf", 
		"Mode=HTML", 
		LAST);
	
//	link检查点
	web_link("web_link",
		EXTRARES,
		"URL=http://127.0.0.1:1080/cgi-bin/login.pl?username=&password=&getInfo=true", "Referer=sign up now", ENDITEM,
		LAST);
	
	web_url("header.html", 
		"URL=http://{host_127_0_0_1_1080}/WebTours/header.html", 
		"TargetFrame=", 
		"Resource=0", 
		"Referer=http://{host_127_0_0_1_1080}/WebTours/index.htm", 
		"Snapshot=t7.inf", 
		"Mode=HTML", 
		LAST);

	web_url("welcome.pl", 
		"URL=http://{host_127_0_0_1_1080}/cgi-bin/welcome.pl?signOff=true", 
		"TargetFrame=", 
		"Resource=0", 
		"RecContentType=text/html", 
		"Referer=http://{host_127_0_0_1_1080}/WebTours/index.htm", 
		"Snapshot=t8.inf", 
		"Mode=HTML", 
		LAST);
    
	//设置集合点
	lr_rendezvous("start");
    //定义订票事务开始
	lr_start_transaction("order");
//定义登录事务开始
	lr_start_transaction("login");

	web_submit_data("login.pl", 
		"Action=http://{host_127_0_0_1_1080}/cgi-bin/login.pl", 
		"Method=POST", 
		"TargetFrame=body", 
		"RecContentType=text/html", 
		"Referer=http://{host_127_0_0_1_1080}/cgi-bin/nav.pl?in=home", 
		"Snapshot=t9.inf", 
		"Mode=HTML", 
		ITEMDATA, 
		"Name=userSession", "Value=133497.64690158zizzHifpcVcftVcAApHVVcHf", ENDITEM, 
		"Name=username", "Value=jojo", ENDITEM, 
		"Name=password", "Value=bean", ENDITEM, 
		"Name=login.x", "Value=55", ENDITEM, 
		"Name=login.y", "Value=4", ENDITEM, 
		"Name=JSFormSubmit", "Value=off", ENDITEM, 
		LAST);
//登录事务结束
	lr_end_transaction("login",LR_AUTO);

	web_url("Search Flights Button", 
		"URL=http://{host_127_0_0_1_1080}/cgi-bin/welcome.pl?page=search", 
		"TargetFrame=body", 
		"Resource=0", 
		"RecContentType=text/html", 
		"Referer=http://{host_127_0_0_1_1080}/cgi-bin/nav.pl?page=menu&in=home", 
		"Snapshot=t10.inf", 
		"Mode=HTML", 
		LAST);

	web_reg_async_attributes("ID=Poll_0", 
		"Pattern=Poll", 
		"URL=http://{host_127_0_0_1_1080}/cgi-bin/reservations.pl", 
		"PollIntervalMs=1000", 
		"RequestCB=Poll_0_RequestCB", 
		"ResponseCB=Poll_0_ResponseCB", 
		LAST);

	web_submit_data("reservations.pl", 
		"Action=http://{host_127_0_0_1_1080}/cgi-bin/reservations.pl", 
		"Method=POST", 
		"TargetFrame=", 
		"RecContentType=text/html", 
		"Referer=http://{host_127_0_0_1_1080}/cgi-bin/reservations.pl?page=welcome", 
		"Snapshot=t11.inf", 
		"Mode=HTML", 
		ITEMDATA, 
		"Name=advanceDiscount", "Value=0", ENDITEM, 
		"Name=depart", "Value=Denver", ENDITEM, 
		"Name=departDate", "Value=03/24/2022", ENDITEM, 
		"Name=arrive", "Value=Denver", ENDITEM, 
		"Name=returnDate", "Value=03/25/2022", ENDITEM, 
		"Name=numPassengers", "Value=1", ENDITEM, 
		"Name=seatPref", "Value=None", ENDITEM, 
		"Name=seatType", "Value=Coach", ENDITEM, 
		"Name=findFlights.x", "Value=48", ENDITEM, 
		"Name=findFlights.y", "Value=8", ENDITEM, 
		"Name=.cgifields", "Value=roundtrip", ENDITEM, 
		"Name=.cgifields", "Value=seatType", ENDITEM, 
		"Name=.cgifields", "Value=seatPref", ENDITEM, 
		LAST);
    //订票事务结束
    lr_end_transaction("order",LR_AUTO);
	return 0;
}
6.3.2.4、脚本的参数化运行

实现自动化操作

  • 针对脚本常用的某些常量,定义一个或多个含数据源的参数来取代,让场景中不同虚拟用户执行相同操作时分别使用参数源中不同数据,从而模拟真实用户操作

主要就是要会创建参数源,然后会调用

创建参数源

  1. 选中脚本中你想要用常量替代的变量,右键选择replace with parameter的create new parameter/Parameter List

    在这里插入图片描述

  2. 在parameter设置参数列表,即参数源

在这里插入图片描述

  1. 设置参数化数据和运行方式

在这里插入图片描述

  • 添加数据行、设置参数选择模式、选择存放参数源文件类型、数据更新模式、**模拟运行情况查看(图中Simulate Parameter、可以运行多次模拟多用户操作后的结果,)**等

  • 可以一直模拟直到出现满意操作在这里插入图片描述

  1. 运行时设置参数运行次数,显示更多运行日志,主要是为了重放检查在这里插入图片描述
6.3.2.5、脚本运行次数设置

Generall下的runlogic:设计脚本循环运行次数。

init和end只运行一次,其他脚本文件收到次数设置影响

在这里插入图片描述

在这里插入图片描述

**General下的Pacing:**设置多个脚本之间的间隔时间,

  • 上一次迭代和后一次迭代之间,可以固定值或者两个时间间隔随机值
    在这里插入图片描述
6.3.2.6、日志

General下的Log,日志需要自己开启

在这里插入图片描述

6.3.2.7、思考时间设置的合理化

General下的ThinkTime,LR默认忽略思考时间,而实际场景不能进行忽略。

往下依次

  • 是忽略思考时间、
  • 按照录制时设置思考时间、
  • 依照录制时间设置思考时间同时乘以倍数、
  • 随机取录制思考时间的百分比

在这里插入图片描述

6.3.2.8、错误处理设计

Internet Protocol的设置检查点(web_reg_find())

General下Miscellaneous脚本运行错误方式,依次是

  • 遇到错误是继续运行
  • 执行到事务中调用lr_error_message函数将事务结果设置failed。意思是脚本运行报错后会新建一个事务将错误写入到该事务内
  • 对错误进行快照
    在这里插入图片描述
6.3.2.9、多线程操作设置*

LR对于虚拟用户Vuser一般采用的是线程运行的,这些线程会共享父驱动器进程的内存段,可以取消多次重新加载驱动程序的必要,节省大量空间,允许程序在一个负载生成器上运行更多的Vuser虚拟用户。

LR如果采用进程方式运行每个Vuser,那么对于每一个虚拟用户都会启动一个mdrv进程。而在性能测试过程中,如果反复启动同一种驱动程序会占用大量随机存储器RAM和其他系统资源,造成浪费。

所以线程运行相较于进程运行支持更多并发用户但是进程操作才能真实模拟用户操作,

可以选择成进程方式运行对订票系统进行性能测试,然后去windows资源管理器里看一眼服务器进程下面存在的mmdrv线程与Vuser的比较,如下图

在这里插入图片描述

LR选择进程运行和线程运行的位置

在这里插入图片描述

6.4、LR Controller的场景设计

针对系统某一个指标的性能测试系统自带设置就能满足,但是系统全方位性能测试则一定使用手工设计场景

6.4.1、Controller基础

Controller除了支持LR脚本外,还支持其他单元测试脚本

场景模式选择:Controller分为手工场景模式和目标导向场景模式

在这里插入图片描述

对于手工场景设计,我们可以操纵很多元素进行设计。

而目标导向只要设定一个目标就可以,但是无法设置集合点

在这里插入图片描述

目标导向型场景只有如下几个目标,可以进行限制

  1. 虚拟用户数
  2. 每秒点击量
  3. 每秒事务数
  4. 事务响应时间
  5. 每分钟页面数

在这里插入图片描述

6.4.2、Controller场景设计

主讲手工场景设计

针对5w原则进行场景设计

  • who,虚拟用户需要多少(Vuser数量)
  • when,虚拟用户会在什么时间下做(场景开始时间)
  • where,运行性能测试时需要在什么地点
  • what,虚拟用户会做什么(选择不同类型脚本)
  • how,虚拟用户会做什么操作来达成自我需求,会不会有骚操作(设计脚本的加压和持续时间)
6.4.2.1、多机联合负载*

负责Controller不负责测试,将远程的LR Generator分配给指定的测试脚本

在这里插入图片描述

6.4.3、Controller的脚本运行方式

Controller会将每一个存放进来的脚本看成一个组,但是运行方式分为场景和组运行

  • 按照场景(Scenario)运行,无论场景中导入多少脚本,所有脚本接受统一调度运行**(要注意如果测试用例之间存在依赖关系,一定要采用group方式运行)**

  • 按照群组(group)运行,场景中脚本按照各自设计的运行方式运行

    分组模式下支持对每个脚本进行运行顺序设定,有助于脚本之间的相互依赖

在这里插入图片描述

设置脚本运行顺序只能在群组Group模式下,加压减压策略也是在Group模式下

6.4.4、LR达成IP欺骗

目的:使同一台主机的虚拟用户在发送请求时更加真实有效

为什么需要IP欺骗

  1. 当某个IP访问过于频繁或者访问量巨大,服务器出于自身安全考虑有时会拒绝该IP的访问

  2. 一些网站会限制同一个用户使用同一个IP进行登录,用于模拟真实使用环境

  3. 某些服务器采用了负载均衡配置,使用同一个IP地址不能测试实际性能

IP欺骗配置步骤
  1. 打开LR自带的IP wizard,使用该工具前请先取消主机的dhcp,改成静态地址。

  2. 创建新ip设置

    在这里插入图片描述

  3. 输入自己主机IP地址在这里插入图片描述

  4. 点击add添加可用子网地址

在这里插入图片描述

  1. 然后打开cmd页面,ipconfig/all会打印ip地址

(win11使用ip wizard时ipconfig不会出现虚拟ip,原因还在查,使用LR暂时不要用11)

设置网虚假IP后再Controller让其生效,ip地址运行类型必须与脚本虚拟用户类型保持一致,线程用线程,进程用进程。如果成功后去查看随机一个虚拟用户日志时都能看到日志显示的ip地址是不一样的。

在这里插入图片描述

6.5、Controller的资源监控

6.5.1、run界面下作用

在这里插入图片描述

  1. 显示场景中每一个脚本的虚拟用运行状态
  2. 显示当前场景的运行状态和控制场景运行
  3. 查看可以显示监控数据,蓝色表示可查看,黑色是不可查看。
  4. 在view设置。显示3区域中可供查看的资源的动态变化,可以设置查看什么,会替换掉3区域。
  5. 展示资源图和各种详细资料内容

用户状态详解

  • down,虚拟用户离线
  • pending,待定
  • init,初始化
  • ready,准备
  • Run,运行
  • passed,通过
  • Rendez,集合(集合点,等待一段时间后释放)
  • failed,失败
  • Error,错误
  • Gradual Exiting,用户准备退出
  • Exiting,用户正在退出
  • stop,结束停止

可用常见资源列表详解Available Graphs,依次标注解释

在这里插入图片描述

  1. Runtime Graphs运行时图(虚拟用户运行时状态展示):虚拟用户统计,用户定义数据点、错误统计、虚拟用户错误统计

  2. **Transactions Graph事务图(运行过程中场景的事务运行状态):**事务响应时间、每秒通过事务、每秒没通过事务(错误或终止等)、每秒总事务数

  3. Web Resource Graphs网页资源图(表现web测试中重要的数据图):每秒点击数、吞吐量、每秒http响应数量、网页安全字、每秒下载页面数、页面追踪数、连接数、每秒连接数、每秒执行SSL次数

  4. **System REsource Graphs系统资源图(检查操作系统资源消耗,需要单独连接服务器测试):**windows资源监控,linux资源监控、snmp监控

  5. Network Graphs网络资源图:监控网络延迟

  6. web Server web服务器资源消耗监控:支持apache和IIS监控

6.6、LR_Controller实现服务器系统资源监控

性能测试最终一点是监控服务器的系统资源,监控cpu、硬盘、内存等进行说明。以windows为例。

两台电脑一台安装LR,另外一台被监控

被监控电脑操作

6.7、LR Analysis使用介绍

Controller可以直接打开analysis生成测试报告。

loadrunner入门篇 - Analysis 分析器 - 一加一 - 博客园 (cnblogs.com)

(4条消息) lr_Analysis结果分析工具_ka_ko的博客-CSDN博客

7、LR脚本编写和重放检查的错误处理

离谱错误处理

一般录制脚本和运行重发时打开Fiddler,然后Fiddler能正常使用就没有离谱问题出现

错误–27987

LoadRunner_2 错误 -27987: 找不到请求的图像 [MsgId: MERR-27987]_zdlulu

  • 在使用LoadRunner时报错信息如下:错误 -27987: 找不到请求的图像 [MsgId: MERR-27987]
  • 避免发生错误的方法:录制选项–>常规->录制–>基于HTTP协议的脚本–>HTML高级–>选择第二项,仅包含明确URL的脚本,然后从新录制一遍脚本,再次运行就不会出现之前的那个错误了

img

错误–27728

回放脚本超时,一般回放脚本时超过120s都会出现,我去晚上查有很多原因都会导致此错误出现。

  • 通常是在运行环境里设置一下超时时间,提高120s,然后设置多迭代运行脚本几遍。

  • 如果还有超时现象,需要在“Runtime Setting”>“Internet Protocol:Preferences”>“Advanced”区域中设置一个“winlnet replay instead of sockets”选项,再回放是否成功

    勾上这个在这里插入图片描述

错误–添加检查点函数但是回放脚本没有执行

没去勾选开启文本图像检查

Runtime Setting->perferences->enable image and text check

错误–27279

重装吧,安装有问题,最好去查查

错误–27727

Run-Time Setting → Internet Protocol →Preferences→Option →Step download timeout(sec)改为32000

  1. 要么是应用服务器参数设置过大导致服务器瓶颈
  2. 页面图片资源太多,没请求过来
  3. 脚本处理页面表段时检查的文字太大太多。我碰见的是这个,订票数量太多了后面就把订票系统用户的部分信息删了

错误–27492

翻译是发送响应失败,百度方法解决千篇一律都是在Runtime-setting中的preferences–>options–>http-request connect timeout(sec)的值设为999。

但是我没解决所以搜了一下

Loadrunner 并发时’Error -27492 HttpSendRequest failed’解决办法 - 牧羊神 - 博客园 (cnblogs.com)

小型网站最好不要用wininet代替LR发送请求,你是用windows的WinInet替代LR的请求发送,勾选后LR检查不到。一旦网站请求处理慢了,LR还检测不到,那你设置LR超时时间也自然没有用,对LR就是请求失败。

人家分析的很到位,是我上一次录脚本手欠勾选了winlnet replay instead of sockets(windows only),我对LR自带的订票系统太有信心了,而且Controller执行用户设置过多,电脑硬件还不行,网站崩了。

错误–27498

这种错误常常是因为并发压力过大,服务器端太繁忙,无法及时响应客户端的请求而造成的,所以这个错误是正常现象,是压力过大造成的。如果压力很小就出现这个问题,可能是脚本某个地方有错误,要仔细查看脚本,提示的错误信息会定位某个具体问题发生的位置

  • 上面的错误现象问题定位在某个URL上,需要再次运行一下场景,同时在其他机器上访问此URL。如果不能访问或时间过长,可能是服务器或者此应用不能支撑如此之大的负载。
  • 分析一下服务器,最好对其性能进行优化
    ad timeout(sec)改为32000
  1. 要么是应用服务器参数设置过大导致服务器瓶颈
  2. 页面图片资源太多,没请求过来
  3. 脚本处理页面表段时检查的文字太大太多。我碰见的是这个,订票数量太多了后面就把订票系统用户的部分信息删了

错误–27492

翻译是发送响应失败,百度方法解决千篇一律都是在Runtime-setting中的preferences–>options–>http-request connect timeout(sec)的值设为999。

但是我没解决所以搜了一下

Loadrunner 并发时’Error -27492 HttpSendRequest failed’解决办法 - 牧羊神 - 博客园 (cnblogs.com)

小型网站最好不要用wininet代替LR发送请求,你是用windows的WinInet替代LR的请求发送,勾选后LR检查不到。一旦网站请求处理慢了,LR还检测不到,那你设置LR超时时间也自然没有用,对LR就是请求失败。

人家分析的很到位,是我上一次录脚本手欠勾选了winlnet replay instead of sockets(windows only),我对LR自带的订票系统太有信心了,而且Controller执行用户设置过多,电脑硬件还不行,网站崩了。

错误–27498

这种错误常常是因为并发压力过大,服务器端太繁忙,无法及时响应客户端的请求而造成的,所以这个错误是正常现象,是压力过大造成的。如果压力很小就出现这个问题,可能是脚本某个地方有错误,要仔细查看脚本,提示的错误信息会定位某个具体问题发生的位置

  • 上面的错误现象问题定位在某个URL上,需要再次运行一下场景,同时在其他机器上访问此URL。如果不能访问或时间过长,可能是服务器或者此应用不能支撑如此之大的负载。
  • 分析一下服务器,最好对其性能进行优化
  • 如果再次运行场景后还有超时现象,就要在各种图形中分析一下原因,例如可以查看是否服务器、DNS、网络等方面存在问题。最后,增加一下运行时的超时设置,在"Run-Time Settings">“Internet Protocol:Preferences"中,单击"options”,增加"HTTP-request connect timeout" 或者"HTTP-request receive"的值。
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值