1   概述

  脚本录制编写是性能测试的一个重要环节。在性能测试过程中,虚拟用户模拟真实用户使用被测系统,这个“模拟”的过程正是通过性能测试脚本来实现的。因此,编写一个准确无误的脚本对性能测试有至关重要的意义。完成性能测试脚本包括两个步骤:脚本录制和脚本编写,本文重点关注脚本编写。

  2   脚本录制

  2.1.录制方式

  HTTP协议脚本录制可选两种方式:基于HTML和基于URL。选择哪种录制方式的原则如下:基于浏览器的HTTP应用系统选择HTML,基于其他方式的HTTP应用系统选择URL。

  2.2.录制注意点

  取消录制期间自动关联功能;

  如果部分测试脚本出现问题,需要重新录制,可以只录制存在问题的片断脚本,方法是不选中录制启动对话框中的Record the application startup。

  3   脚本编写

  3.1.常用技术

  LoadRunner性能测试脚本编写常用的技术包括参数化,关联,逻辑控制和脚本模块化。

  3.1.1.参数化

  参数化是将脚本中的常量转化为变量的过程。通过录制生成的脚本所有的数据都是常量,为了达到向服务器发送的数据多样化的目的,需要将一些数据常量转化为变量。

  3.1.2.关联

  关联是查找动态数据,并把查询到的数据以参数的形式保存起来。在B/S或者C/S系统中,服务器返回给客户端的数据有些是动态改变的,例如客服系统的人工来话流水号和工作流系统的工单流水号。当打开工单生成页面后,工单流水号已经从服务器端获取到了,而在提交工单步骤,需要将该流水号返回给服务器。因此,在提交工单之前,在脚本中必须获得流水号。获得流水号的方法是关联。

  使用关联功能动态保存的参数跟直接通过参数化生成的参数是一致的。不同的是,通过参数化生成的参数在脚本中可以高亮显示。

  3.1.3.逻辑控制

  业务系统在实际应用中,业务操作步骤间往往存在逻辑。比如,客服3.0工作流系统,业务代表处理工单,如果待办区没有工单等待处理,则先从工单池中提取工单到待办区,然后进行处理,并且需要优先处理超时或即将超时的工单。在工单处理的性能测试脚本中,也必须遵从这种业务逻辑。

  LoadRunner性能测试脚本采用C语言,因此脚本逻辑控制同C语言一致,使用if,switch,while/for/do控制结构。

  3.1.4.脚本模块化

  脚本模块化的目的是:提高脚本可读性、可重用性和脚本生产效率。脚本模块化的本质是抽取函数,一些很通用的函数甚至可以封装为DLL。模块化性能测试脚本的思想跟自动化测试的ActionWord有相似之处。

  例如:客服3.0系统的登录功能,无论是工作流、知识库、公告便签还是培训考试,它们都使用相同的登录页面。我们可以把登录脚本抽取为一个函数csp_login(char *staffno,char * password),需要登录操作时,不需要录制和拷贝脚本,只要调用这个函数可以了。

  注意:并不是所有的脚本代码块都需要做模块化处理,只有那些稳定不变、并且经常用到的代码块才需要做模块化处理。不做得不偿失的事。

  3.2.典型函数

  LoadRunner中,常用的函数有很多,这里只介绍编写性能测试脚本过程中那些必然用到的函数。本文重点关注这些典型函数的应用场合及注意点,至于函数详细使用说明请参见LoadRunner帮助文档。

  3.2.1.事务相关

  3.2.1.1. lr_start_transaction/lr_end_transaction

  功能:事务开始/结束标记。

  应用场合:需要统计某一段代码块执行所需要的时间,这两个函数需要成对使用。

  举例:工作流系统性能测试中有一个需求,300人在线,提交工单操作平均响应时间在3秒以内,则需要在提交工单请求步骤之前插入lr_start_transaction,提交工单请求步骤之后插入lr_end_transaction。

  注意点:这两个函数只是标记函数,用于标记事务开始/结束,因此可以嵌套使用,即事务中还可以包含子事务。

  3.2.1.2. lr_think_time

  功能:模拟思考时间,即等待时间。

  应用场合:在线用户测试,为了让每一个虚拟用户模拟一个真实用户的行为,即让一个虚拟用户对系统产生的压力跟真实用户相当,必须使用这个函数。这是因为,用户在使用系统的过程中,从一个操作转换到另一个操作,是需要时间的,这个时间是思考时间。

  举例:客服3.0工作流系统在线用户测试。对于工单查询操作,输入查询条件后提交查询,从输入查询条件至提交查询的时间间隔是思考时间。因为LoadRunner无法模拟键盘输入的过程,它只能模拟键盘输入的等待时间,此时需要在提交查询的那个动作前插入lr_think_time函数。

  注意点:在录制脚本中,原子事务内不要包含lr_think_time函数,否则该思考时间将被统计到事务响应时间中,造成结果不准确。另外lr_think_time是否启作用,可通过runtime-seting进行设置。

  注:原子事务指那些不能再分割为更小事务的事务,它经常指一个单一的业务操作,通常表现为一个URL请求。