文章目录
- 概述
- LoadRunner的使用
- 创建编辑脚本(Virtual User Generator)
- 集合点
- 思考时间
- 事务
- 检查点
- 关联
- 参数化
- 运行负载测试(Controller)
- 性能测试报告
- 场景设置表格
- 测试指标记录表
- 其他的杂谈内容
概述
软件的性能测试与软件的功能测试完全不同,只关注服务器的表现。软件的测试方式有多种,常用的有三种,分别是压力测试、负载测试和稳定性测试。除此之外,还有故障转移与恢复测试等方式。
- 压力测试:一瞬间给软件进行高强度施压,因此压力测试也被称为并发测试。
- 负载测试:持续地给软件增大压力。
- 稳定性测试:将压力保持到一定的较高值后维持来测试软件的忍耐力。稳定性测试往往需要持续几个小时。
在进行性能测试之前,需要完成前期的准备工作:
- 确定性能测试的类型:确定进行性能测试的方式是哪一种。例如,对接口进行并发属于压力测试;测试网站的客户容量属于负载测试。
- 确定性能测试的指标:事先确定用于评价软件性能的标准。例如,对于网站的响应时间而言,一般认为1秒内是非常好,3秒内是很好,5秒内是良好,7秒以内是合格,超过7秒是不合格。
- 确定测试机配置和服务器配置:需要使得测试机和服务器的实力尽可能“旗鼓相当”,不能有一方过强或太弱。还需要确定服务器的数量和测试机的数量(多台测试机可以进行多机联合测试),因为多台服务器或多台测试机都会使得一方的力量增强。
- 确定服务器的IP地址:只有知道了服务器的IP地址,才能远程对服务器的各项指标进行监控。
- 编写性能测试用例:也就是设计一个对软件进行使用的流程,通过该流程来对性能进行测试。
进行软件性能测试必须要已经安装好测试软件。本篇博客中使用的软件是LoadRunner。如果需要对接口进行性能测试,则需要使用另一款软件JMeter,此处不进行展开,仅介绍业务的性能测试。
业务性能测试的流程:
- 录制性能脚本:根据需要进行测试的业务录制好性能脚本;
- 进行脚本增强:直接通过录制获得的脚本仅仅是初步的脚本内容,不能直接使用,需要进行脚本增强。脚本增强中的常用技术包括集合点、事务、关联、检查点、参数化、用户思考时间和其他函数设置等,将在后面进行介绍。脚本增强也是本篇博客内容的重难点。
- 设计性能场景:将经过增强后的性能脚本进行导入,并对虚拟用户人数、持续时间、结束时间等进行设置(相当于模拟出网站被很多用户使用的情况)。设计完成后即可运行场景。
- 性能指标评估:对上一步的场景运行结果通过定量的指标进行评估,常用的指标包括吞吐量、响应时间、每秒点击次数、并发用户数量、报错信息、HTTP响应数量、CPU/内存占用情况和网络延迟时间等。
- 编写测试报告:通过对结果制作分析表的方式对结果进行分析。
LoadRunner的使用
注意事项:LoadRunner的打开最好使用以管理员身份打开,否则可能会出现一些奇怪的报错。例如,可能导致出现无法连接Internet的报错。
LoadRunner的组成:LoadRunner由创建编辑脚本(Virtual User Generator)、运行负载测试(Controller)和分析测试结果(Analysis)三部分组成。我使用的LoadRunner版本是12.02。
创建编辑脚本(Virtual User Generator)
打开VUG后的界面如下图所示:
新建一个运行脚本:点击左上角菜单的文件
选项,在下拉部分选择新建一个脚本和解决方案
,如下所示。另外,在文件
菜单中也可以选择打开一个运行脚本(解决方案)。
选择单协议
→Web - HTTP/HTML
,表示仿真浏览器和Web服务器之间的通讯。同时需要设置脚本名称和存储位置。
另外,点击左下角的协议分析软件
按钮,选择录制所用的浏览器和需要进行测试的URL地址,然后点击开始分析
。注意,这一步并非必须的,只是用于判定当前所使用的浏览器是否受到支持。
注意事项①:如果使用的是LoadRunner 11系列的版本,则可能对一些浏览器不支持。此时可以安装一个火狐24版本的浏览器并设置即可。
注意事项②:由于LoadRunner的虚拟用户对网站具有攻击性,因此不能用该软件随意对各类网站进行测试实验。LoadRunner提供了一个飞机订票模拟网站用于练手。
在上上张图中点击创建
按钮,即可创建一个原始的Action测试脚本,效果如下图所示。此时的脚本内容是空的,我们需要通过接下来的录制来向脚本中自动添加内容。
在上面的界面的菜单栏中依次点击录制
→录制选项
→录制
,选择基于HTML的脚本
。这是因为基于HTML的脚本比基于URL的脚本更加简洁和干净。
点击右侧的HTML 高级
,将脚本类型设置为仅包含明确URL的脚本
。
点击左侧脚本
按钮,将脚本语言设置为C语言
。
点击左侧的高级
按钮,在勾选字符集中选择UTF-8
。如果不勾选可能会返回乱码。
上述设置完成后,点击确定
按钮即完成录制设置。之后,点击主界面上方菜单的录制
按钮即可对本次录制进行定义。目前,录制到操作暂时选择Action
,录制模式选择Web浏览器
,应用程序即用于录制所用的浏览器,URL地址即需要进行性能测试的网站。另外,还需要设置工作目录。之后,点击开始录制
即可开始。开始后会自动打开指定的URL。
注意事项:下面的图片中,给定的浏览器程序是Internet Explore,但是实际上并不能使用这款浏览器,因为会导致录制的脚本是空白的。所以,推荐使用安装LoadRunner自带的火狐浏览器,相关博文链接:解决LoadRunner录制脚本为空的办法。如果还是录制失败,则可以尝试关闭后台的所有浏览器,清理内存和检查配置是否有误。
脚本录制实际上就是演示一遍需要进行性能测试的操作流程的内容。例如,我需要对网站的用户注册进行性能测试,我就在录制过程中完成一次完整的用户注册,然后结束录制即可。录制开始后的菜单如下。菜单中有停止录制、暂停录制等按钮。当录制完成时,只需要点击停止录制
按钮即可。
停止录制后,再回到LoadRunner的软件界面,即可以看到出现了对应的脚本内容。一个好习惯是对生成的脚本运行(回放)一次,观察是否有报错,如果没有报错再进行后续的脚本增强等步骤。最后一定要记得保存脚本。
需要注意的是,录制过程一定要目的明确,不要做与所需要测试的流程无关的内容,这样会导致生成的脚本中内容很乱,无法直接用于后续的过程。
下面先介绍几个概念:
集合点
- 定义:用于控制录制流程中进行施压的地方,此时,各个虚拟用户以不同的速度到达集合点后,只有等最后的虚拟用户也到达之后才会继续前进。因此,集合点能够控制在集合点之前的流程中不会出现大规模并发使得服务器提前崩溃的现象,也可以更好地集中力量测试我们所关心的界面的性能。
注意事项:一个脚本中尽量只有一个集合点,除非两个集合点之间的间距很长。这样做会使得第二个集合点的结果失真,并且给服务器造成了更大的压力。
插入集合点的方式非常简单,只需要在向网站发送请求前,在录制菜单中点击插入集合点并命名该集合点即可。
思考时间
- 定义:思考时间是脚本中用于模拟用于在页面停留的函数,使用思考时间可以使得脚本更加真实。在脚本中的表示方法是
lr_think_time(思考秒数)
。另外,LoadRunner中自带的函数都是以lr
开头。
在录制后的脚本中,脚本中会自动根据录制过程中在每个页面的停留时长自动给思考时间赋值。但是,如果想要思考时间生效则需要进行运行时设置。点击左上角菜单中的查看
,然后点击解决方案资源管理器
,如下所示:
在左边弹出的菜单中,选择运行时设置
,在弹出的界面中点击思考时间
。可以看到,默认情况下会自动忽略思考时间
,我们可以根据需要将其调整为按录制参数回放思考时间
,也可以通过使用录制思考时间的随机百分比
,来模拟多用户使用的情况,在这种情况下还可以选择将思考时间限制为指定的秒数。
注意事项:集合点之前不能设置思考时间。
事务
- 定义:一段被包裹起来的过程。可以认为事务就是录制过程中的一小部分。通过对事务进行封装,可以将大的过程拆分为小的单独的单元进行处理。
LoadRunner中插入事务的方法非常简单,只需要在录制的过程中,对于需要单独进行分析的事件之前,在录制菜单中选择插入开始事务
并命名,然后事件完成后点击插入结束事务
并选择对应的开始事务名即可。尽管可以通过写代码的方式在脚本中直接插入事务,但是还是推荐初学者在录制的过程中插入。
需要注意的是,事务的内部不能有思考时间。这是因为如果事务内部有思考时间,则会影响响应时间的结果。另外,集合点也不应该放在事务的内部,否则集合的时间也会影响响应时间的结果。
浪费的时间:响应时间中的浪费的时间是指服务器收到请求后到服务器回复请求所需的时间。
检查点
- 定义:用于确保每一个页面都是正确测试的,不存在隐藏的错误。
检查点可以分为文本检查点和图片检查点,其中文本检查点通过查找返回的网页中是否有指定的字符串来判断是否出错。需要注意的是,插入脚本的位置是在界面获取完成之后。我们可以通过修改脚本代码的方式插入文本检查点:
web_find("web_find","What=待查找的内容",LAST)
需要说明的是,检查点也最好放在事务的外面,防止影响响应时间的检测。修改完代码后,进入脚本的运行时设置,勾选启用图像和文本检查,然后再运行脚本时就会进行检查了。
图像检查点在此不进行介绍。
关联
- 定义:关联是指对于录制结果脚本中的一部分内容,其本身并不是常量而是变量(例如网站的Token),因此重复运行相同的脚本可能会失败获得不符合测试的内容要求,因此可以定义关联。
关联需要在变量获得之前进行插入,因为这样才能告诉服务器,其中某一个值是作为变量,请用特殊的方式进行处理。
LoadRunner12.02中建立关联的方式非常简单。在每一次完成脚本录制后,都会产生如下所示的窗口:
上述窗口表示LoadRunner在脚本录制的过程中自动扫描到了一个关联,即字段为userSession的部分。确定结果无误之后,可以点击窗口中的关联
来创建这个关联。然后点击关闭
。创建关联完成后,可以看到脚本文件中的userSession字段被替换为一个大括号表示的形式,如下图:
参数化
- 定义:对于脚本中用户输入的部分,如果每一次的输入内容不同,则需要对不同的这一部分内容进行参数化,使得一个脚本可以处理多个不同的输入。
参数化和关联的区别:参数化是指由于用户输入内容不同所导致的脚本内容不同,参数化是由于服务器返回内容不同所导致的。
LoadRunner中对脚本中的部分内容进行参数化的方法非常简单。首先选中需要参数化的部分,然后右键点击,在菜单中依次选择使用参数替换
和新建参数
,即可得到如下图所示的界面:
在该窗口中,我们可以设置参数的名称、类型和初始值。参数名称和初始值可以自定义,但是类型一般都是File
类型。设置完成后点击确定
,即可看到原始脚本代码中的值被替换。’
接着,我们在生成的参数处打开鼠标右键菜单,选择参数属性
,打开如下所示的窗口:
上图中的文件路径
实际上就是参数可以取的各个值,这些值被存放在指定的文件中。可以在界面中点击用记事本编辑
按钮来修改文档中的内容。例如,初始打开文档的界面如下:
文档中的Username表示我们的参数名,T2020308250120-001表示参数需要取的一个值。如果我们需要该参数取更多值,例如T2020308250120-002,则可以修改文档内容,修改后的文档如下:
保存文档后退出即可看到参数属性界面的内容也发生了修改:
另外,也可以直接在界面中点击添加行
按钮,快速增加新的参数取值。
除了一行一行设置取值之外,还可以点击数据向导
按钮,从数据库中直接导入数据源。这里需要使用SQL语句,不做过多解释。
如果参数不只有一列(例如除了账号之外还有密码),则可以点击添加列
按钮,进行列数据的添加。
我们可以看到界面中还有选择下一行
和更新值的时间
两个属性,两个属性都可以取三个值,因此一共有九种不同的组合方法。这一部分内容是参数化的重点。不同组合的效果总结如下。其中的迭代次数是脚本的循环执行次数。
- Sequential + Each iteration:每一次迭代中,都从数据表中取出下一个值。一轮迭代中所有用户的值相同。
- Random + Each iteration:每一次迭代中,每一个虚拟用户都从数据表里面取出一个新的值。
- Unique + Each iteration:每一次迭代中,都从数据表中取出下一个唯一的值。
- Sequential + Each occurrence:每一次的参数出现都从数据表中取出下一个值,无论是否在同一次迭代中。
- Random + Each occurrence:每一次的参数出现都从数据表中随机取出一个值,无论是否在同一次迭代中。
- Unique + Each iteration:每一次迭代中,都将从数据表中取出下一个唯一值,无论是否在同一次迭代中。
- Sequential + Once:第一次迭代中得到的值就会被每一个虚拟用户在接下来的所有迭代中使用。
- Random + Once:第一次迭代中得到的随机值就会被每一个虚拟用户在接下来的所有迭代中使用。
- Unique + Once:第一次迭代中分配的唯一值就会被每一个虚拟用户在接下来的所有迭代中使用。
在界面中点击模拟参数
按钮,在弹出的界面中设置虚拟用户的数量
和迭代次数
,如下所示,然后点击模拟
,即可看出当前选择的属性组合情况下的参数结果。
根据上面的方法即可完成参数化。
其他内容:除了上述的几种脚本增强方式,脚本录制过程中还可以加入注释。完成了脚本的录制和增强后,下面就需要使用Controller来运行脚本。
运行负载测试(Controller)
打开Controller,初始界面如下所示:
我们可以在上述界面的左上角导入已经完成了增强的脚本并设置其名称。同时,我们还可以设置脚本所占的百分比(因为可以同时运行多个脚本)和进行测试的机器。导入需要运行的脚本并设置比例后的界面如下:
在脚本对应行的Load Generator
处点击下拉菜单中的添加
,在弹出的界面中,将名称一行设置为测试机的IP地址。如果以本机作为测试机,则直接输入localhost
即可。然后点击确定
。
在Controller界面的左下角全局计划
部分,双击启动VUser,选择启动脚本时的总共的虚拟用户数量,该用户数量是根据测试准备确定的。另外还可以是同时还是每隔多长时间增加指定个虚拟用户数量。设置完成后点击确定
。
回到Controller界面,同样在全局计划
面板中,双击持续时间。持续时间可以分为完成前一直运行
和指定的运行时间。我们根据需要进行选择,这里选择前者,然后点击确定
。选择前者时则不需要考虑退出方法;如果选择后者,则是完成一次之后如果没有到达指定时间,则会重复第二遍运行。
上述内容设置完成后,点击运行
,软件界面变为如下的形式。Controller的界面包括设计
界面和运行
界面,运行
界面就是对各种各样的测试指标进行监控。
如果觉得四张测试指标图太少,可以在图像的空白区域点击右键,然后点击查看图
,再点击显示八张图
,这样就得到了下面所示的结果。可以进行监控的指标在左侧可用图
部分,我们可以通过点击鼠标左键自由选择。
常用的指标包括:
- 正在运行的VUser;(非常重要)
- 事务的响应时间;(非常重要)
- 每秒HTTP响应数;
- 有错误的VUser;
- 错误统计信息;
- 吞吐量;(非常重要);
- 每秒点击次数;(非常重要,可以反映出并发的点)
LoadRunner对Windows资源(CPU和内存)的可视化效果不好,一般使用第三方工具进行监控。但是这里就先不去掉了,调整后的八张图如下所示:
如果还是想要使用Windows资源窗口对服务器进行资源监视,则右键点击该图,在菜单中选择添加度量。在弹出的页面中点击添加,然后输入服务器的IP地址即可。这里以本机为例:
按照下图选择的指标进行点击:
接下来,我们对图像的刷新率进行设置。在任意一张图上点击右键,在菜单中选择配置,打开如下的窗口,将刷新率进行修改,并勾选应用于所有图
。
所有设计完成后,在Controller界面中的右上角点击开始场景,就会自动执行,此时的性能指标图也会不断刷新,如下图所示:
点击右上角的Vuser,可以看到每一个虚拟用户的当前状态:
运行完成后的结果如下图所示:
注意事项:如果在脚本中本身插入了集合点,那么就需要先设置集合的方式后,再运行场景,否则结果可能会是错误的。
性能测试报告
性能测试报告包括场景设置表格和结果评价表格两部分。
场景设置表格
模板如下:
测试名称(包括进行测试的接口和测试类型,以及测试编号) |
---|
测试步骤 |
场景描述(用户数量和变化、集合点设置、需要并发的接口) |
测试用例(脚本名称+占比) |
运行模式 |
退出模式 |
预期结果 |
测试指标记录表
示例如下:
并发用户数量 | 响 应时间 | 吞吐量最大值 | CPU占用率 | 内存占用率 | 失败用户数量 |
---|---|---|---|---|---|
其他的杂谈内容
- CPU的自我保护温度:一般情况下,CPU的温度达到八九十摄氏度的时候就会报警并自动关机来实现自我保护。
- 大型服务器的降温:将服务器放在环境温度很低的地方,从而来实现服务器的降温。
- 服务器的操作系统:绝大多数服务器的操作系统都是Linux,这是因为Linux操作系统非常稳定。Windows系列操作系统中唯一一款能够作为服务器操作系统的是Window 2003。
- 软件性能测试对测试机的要求:必须要较好的CPU(Intel i7以上)和较大的内存(至少8GB)。
- 一步错步步错:如果业务性能测试的过程中,脚本录制错误,脚本增强错误等情况发生,后面的内容都是错误的,因此需要非常谨慎,保证每一步都是正确的。
- 性能测试的时间:在用户集中使用和无人使用服务器的时候,性能测试的结果非常不一样。因此最好在无人使用服务器的时候进行性能测试。
- 吞吐量:吞吐量是评价服务器的核心指标,表示了服务器处理事务的能力。当用户量从零开始增加时,服务器的吞吐量会上升;但是继续增加用户量,吞吐量会持续下降。在进行负载测试时,最好能够找到服务器负载的峰值对应的用户量进行测试。
- CPU利用率的注意事项:在进行测试的过程中,一般要求CPU的利用率不能超过70%。
- 练习过程中使用的虚拟用户数:练习过程中最好控制虚拟用户数不要太大,否则会给服务器造成很大的负担。
- TPS:服务器处理速度的一个指标。TPS越高服务器的处理速度越快。