author: selfimpr
blog: http://blog.csdn.net/lgg201
mail: [email protected]
感谢51testing 的柳胜前辈精彩的讲解
以下是我的读书笔记, 在公司是程序员, 工作需要, 简单学习一下, 分享出来, 不足之处, 请邮件指点, 谢谢.
<!-- [if !supportLists]-->1 <!-- [endif]-->脚本结构 :
<!-- [if !supportLists]-->1.1 <!-- [endif]-->vuser_init: 脚本初始化操作 , 一般放置登录操作 , 分配内存等 , 在播放 vuser_init 时 , Controller 的 Vuser 状态区域会显示 initialize 状态
<!-- [if !supportLists]-->1.2 <!-- [endif]-->Action: 虚拟用户要做的业务操作 .
<!-- [if !supportLists]-->1.3 <!-- [endif]-->vuser_end: 与 vuser_init 对应 , 做收尾工作 .
<!-- [if !supportLists]-->2 <!-- [endif]-->脚本中使用的三种函数
<!-- [if !supportLists]-->2.1 <!-- [endif]-->VU 通用函数 : lr_ 系列函数
<!-- [if !supportLists]-->2.2 <!-- [endif]-->协议相关函数 : 一般以协议名开头 , 比如 web 协议就是 web_ 系列
<!-- [if !supportLists]-->2.3 <!-- [endif]-->语言相关函数 : 由 VU 脚本的生成语言决定 . 多用于用户自定义函数进行脚本扩展 .
<!-- [if !supportLists]-->3 <!-- [endif]-->以 C 语言的 VU 脚本为例 , 实际上是隐式的存在 main 函数的 , 然后在 main 中去依次调用了 vuser_init, Action, vuser_end 几个函数 .
<!-- [if !supportLists]-->4 <!-- [endif]-->录制 HTTP 协议的 web 系统测试脚本时 , 会生成一个 globals.h 文件 , 这个文件用来负责 vuser_init, Action, vuser_end 三个脚本都可用的全局变量的声明 .
<!-- [if !supportLists]-->5 <!-- [endif]-->lr_whoami(*userid, char **groupname, int *sceneid) 可以用来获取当前运行 vuser 的 vuserid, 组名 , 场景 id, 在动态参数化的时候 , 可以使用这些值来构建动态参数 .
<!-- [if !supportLists]-->6 <!-- [endif]-->自定义函数 :
<!-- [if !supportLists]-->6.1 <!-- [endif]-->直接引用 : 以 C 语言产生的脚本 , 可以直接在 Action 外部定义函数 , 然后在 Action 内使用 .
<!-- [if !supportLists]-->6.2 <!-- [endif]-->本地加载 : 使用 lr_load_dll(char *dll_file_name); 加载动态链接库 , 然后调用库中的函数 .
<!-- [if !supportLists]-->6.3 <!-- [endif]-->include 模式 : 把多个函数写在一个文件中 , 在 vuser_init, Action, vuser_end 中的 include 并调用
<!-- [if !supportLists]-->6.4 <!-- [endif]-->全局加载 (dll) 模式 : 在 LoadRunnder/data 目录下的 mdrv.dat 文件中 , 查找对应协议 , 然后在下面按照已有内容格式配置链接库即可
<!-- [if !supportLists]-->7 <!-- [endif]-->通用 vu 函数 : 构建在 C 语言基础上的脚本框架函数 , 以 lr 开头 , 分为以下几类
<!-- [if !supportLists]-->7.1 <!-- [endif]-->事务和事务控制函数 :
<!-- [if !supportLists]-->7.1.1 <!-- [endif]-->lr_end_sub_transaction: 标记子事务的结束以便进行性能分析
<!-- [if !supportLists]-->7.1.2 <!-- [endif]-->lr_end_transaction: 标记 LoadRunner 事务的结束
<!-- [if !supportLists]-->7.1.3 <!-- [endif]-->lr_end_transaction_instance: 标记事务实例的结束以便进行性能分析
<!-- [if !supportLists]-->7.1.4 <!-- [endif]-->lr_fail_trans_with_error: 打开事务的状态设置为 LR_FAIL 并发送错误消息 .
<!-- [if !supportLists]-->7.1.5 <!-- [endif]-->lr_get_trans_instance_duration: 获取事务实例的持续时间
<!-- [if !supportLists]-->7.1.6 <!-- [endif]-->lr_get_trans_instance_wasted_time: 获取事务实例浪费的时间
<!-- [if !supportLists]-->7.1.7 <!-- [endif]-->lr_get_transaction_duration: 获取事务的持续事件 ( 按事务名称 )
<!-- [if !supportLists]-->7.1.8 <!-- [endif]-->lr_get_transaction_think_time: 获取事务的思考时间 ( 按事务名称 )
<!-- [if !supportLists]-->7.1.9 <!-- [endif]-->lr_get_transaction_wasted_time: 获取事务浪费的时间 ( 按事务的名称 )
<!-- [if !supportLists]-->7.1.10 <!-- [endif]-->lr_resume_transaction: 继续收集事务数据以便进行性能分析
<!-- [if !supportLists]-->7.1.11 <!-- [endif]-->lr_resume_transaction_instance: 继续收集事务实例数据以便进行性能分析
<!-- [if !supportLists]-->7.1.12 <!-- [endif]-->lr_set_transaction_instance_status: 设置事务实例的状态
<!-- [if !supportLists]-->7.1.13 <!-- [endif]-->lr_set_transaction_status: 设置打开事务的状态
<!-- [if !supportLists]-->7.1.14 <!-- [endif]-->lr_set_transaction_status_by_name: 设置事务的状态
<!-- [if !supportLists]-->7.1.15 <!-- [endif]-->lr_start_sub_transaction: 标记子事务的开始
<!-- [if !supportLists]-->7.1.16 <!-- [endif]-->lr_start_transaction: 标记事务的开始
<!-- [if !supportLists]-->7.1.17 <!-- [endif]-->lr_start_transaction_instance: 启动嵌套事务 ( 由它的父事务的句柄指定 )
<!-- [if !supportLists]-->7.1.18 <!-- [endif]-->lr_stop_transaction: 停止事务数据的收集
<!-- [if !supportLists]-->7.1.19 <!-- [endif]-->lr_stop_transaction_instance: 停止事务实例的数据收集
<!-- [if !supportLists]-->7.1.20 <!-- [endif]-->lr_wasted_time: 消除所有打开事务浪费的时间 .
<!-- [if !supportLists]-->7.2 <!-- [endif]-->命令行分析函数 : 当 LoadRunner 以命令行方式启动和运行时 , 以下函数用来分析命令行
<!-- [if !supportLists]-->7.2.1 <!-- [endif]-->lr_get_attrib_double: 检索脚本命令行中使用的 double 类型变量
<!-- [if !supportLists]-->7.2.2 <!-- [endif]-->lr_get_attrib_long: 检索脚本命令行中使用的 long 行变量
<!-- [if !supportLists]-->7.2.3 <!-- [endif]-->lr_get_attrib_string: 检索脚本命令行中使用的字符串
<!-- [if !supportLists]-->7.3 <!-- [endif]-->系统信息函数 : 获取 VU 的系统信息
<!-- [if !supportLists]-->7.3.1 <!-- [endif]-->lr_user_data_point: 记录用户定义的数据采集点
<!-- [if !supportLists]-->7.3.2 <!-- [endif]-->lr_whoami: 将有关 vuser 的信息返回给 vuser 脚本
<!-- [if !supportLists]-->7.3.3 <!-- [endif]-->lr_get_host_name: 返回执行 vuser 脚本的主机名
<!-- [if !supportLists]-->7.3.4 <!-- [endif]-->lr_get_master_host_name: 返回运行 LoadRunner Controller 的计算机名
<!-- [if !supportLists]-->7.4 <!-- [endif]-->字符串函数 :
<!-- [if !supportLists]-->7.4.1 <!-- [endif]-->lr_eval_string: 返回参数的当前值
<!-- [if !supportLists]-->7.4.2 <!-- [endif]-->lr_save_string: 将以 NULL 结尾的字符串保存到参数中
<!-- [if !supportLists]-->7.4.3 <!-- [endif]-->lr_save_var: 将变长字符串保存到参数中
<!-- [if !supportLists]-->7.4.4 <!-- [endif]-->lr_save_datetime: 将当前日期和时间保存到参数中
<!-- [if !supportLists]-->7.4.5 <!-- [endif]-->lr_advance_param: 前进到下一个可用参数
<!-- [if !supportLists]-->7.4.6 <!-- [endif]-->lr_decrypt: 解密已编码的字符串
<!-- [if !supportLists]-->7.4.7 <!-- [endif]-->lr_eval_string_ext: lr_eval_string 的扩展 , 为指向包含参数数据的缓冲区的指针
<!-- [if !supportLists]-->7.4.8 <!-- [endif]-->lr_eval_string_ext_free: 释放由 lr_eval_string_ext 分配的指针
<!-- [if !supportLists]-->7.4.9 <!-- [endif]-->lr_save_searched_string: 在缓冲区中搜索字符串实例 , 并将该字符串实例保存到参数中 .
<!-- [if !supportLists]-->7.5 <!-- [endif]-->消息函数 :
<!-- [if !supportLists]-->7.5.1 <!-- [endif]-->lr_debug_message: 将调试信息发送到输出窗口
<!-- [if !supportLists]-->7.5.2 <!-- [endif]-->lr_error_message: 将错误消息发送到输出窗口
<!-- [if !supportLists]-->7.5.3 <!-- [endif]-->lr_get_debug_message: 得到当前的消息类
<!-- [if !supportLists]-->7.5.4 <!-- [endif]-->lr_log_message: 将输出消息直接发送到 output.txt 文件 , 此文件位于 vuser 脚本目录
<!-- [if !supportLists]-->7.5.5 <!-- [endif]-->lr_output_message: 将消息发送到输出窗口中
<!-- [if !supportLists]-->7.5.6 <!-- [endif]-->lr_set_debug_message: 为输出消息设置消息类
<!-- [if !supportLists]-->7.5.7 <!-- [endif]-->lr_vuser_status_message: 生成格式化输出并将其打印到 Controller Vuser 状态区域
<!-- [if !supportLists]-->7.5.8 <!-- [endif]-->lr_message: 将消息发送到 vuser 日志和输出窗口 .
<!-- [if !supportLists]-->7.6 <!-- [endif]-->运行时函数 :
<!-- [if !supportLists]-->7.6.1 <!-- [endif]-->lr_load_dll: 加载外部 dll
<!-- [if !supportLists]-->7.6.2 <!-- [endif]-->lr_think_time: 暂停脚本的执行 , 以模拟思考时间
<!-- [if !supportLists]-->7.6.3 <!-- [endif]-->lr_continue_on_error: 指定脚本如何处理错误场景 , 是继续还是退出
<!-- [if !supportLists]-->7.6.4 <!-- [endif]-->lr_rendezvous: 在 vuser 脚本中设置集合点
<!-- [if !supportLists]-->8 <!-- [endif]-->HTTP 协议函数 :
<!-- [if !supportLists]-->8.1 <!-- [endif]-->HTTP 协议 :
<!-- [if !supportLists]-->8.1.1 <!-- [endif]-->header 设置 :
<!-- [if !supportLists]-->8.1.1.1 <!-- [endif]-->web_add_header
<!-- [if !supportLists]-->8.1.1.2 <!-- [endif]-->web_clean_heander
<!-- [if !supportLists]-->8.1.2 <!-- [endif]-->点击链接 :
<!-- [if !supportLists]-->8.1.2.1 <!-- [endif]-->web_link( 文字链接 )
<!-- [if !supportLists]-->8.1.2.2 <!-- [endif]-->web_image( 点击图片链接 )
<!-- [if !supportLists]-->8.1.3 <!-- [endif]-->提交表单 :
<!-- [if !supportLists]-->8.1.3.1 <!-- [endif]-->web_submit_data
<!-- [if !supportLists]-->8.1.3.2 <!-- [endif]-->web_submit_form
<!-- [if !supportLists]-->8.2 <!-- [endif]-->web 系统设置
<!-- [if !supportLists]-->8.2.1 <!-- [endif]-->cache 设置 :
<!-- [if !supportLists]-->8.2.1.1 <!-- [endif]-->web_cache_leanup
<!-- [if !supportLists]-->8.2.1.2 <!-- [endif]-->web_load_cache
<!-- [if !supportLists]-->8.2.2 <!-- [endif]-->cookie 设置
<!-- [if !supportLists]-->8.2.2.1 <!-- [endif]-->web_add_cookie
<!-- [if !supportLists]-->8.2.2.2 <!-- [endif]-->web_cleanup_cookies
<!-- [if !supportLists]-->8.2.3 <!-- [endif]-->proxy 设置
<!-- [if !supportLists]-->8.2.3.1 <!-- [endif]-->web_set_proxy
<!-- [if !supportLists]-->8.2.3.2 <!-- [endif]-->web_set_secure_proxy
<!-- [if !supportLists]-->8.3 <!-- [endif]-->LoadRunner 框架支持
<!-- [if !supportLists]-->8.3.1 <!-- [endif]-->检查点 :
<!-- [if !supportLists]-->8.3.1.1 <!-- [endif]-->web_find
<!-- [if !supportLists]-->8.3.1.2 <!-- [endif]-->web_image_check
<!-- [if !supportLists]-->8.3.2 <!-- [endif]-->关联
<!-- [if !supportLists]-->8.3.2.1 <!-- [endif]-->web_create_html_param
<!-- [if !supportLists]-->8.3.2.2 <!-- [endif]-->web_create_html_param_ex
<!-- [if !supportLists]-->8.3.2.3 <!-- [endif]-->web_reg_save_param
<!-- [if !supportLists]-->8.3.2.4 <!-- [endif]-->web_set_max_html_param_len
<!-- [if !supportLists]-->8.3.3 <!-- [endif]-->控制
<!-- [if !supportLists]-->8.3.3.1 <!-- [endif]-->lr_start_transaction
<!-- [if !supportLists]-->8.3.3.2 <!-- [endif]-->lr_rendezvous
<!-- [if !supportLists]-->8.3.3.3 <!-- [endif]-->lr_think_time
<!-- [if !supportLists]-->1 <!-- [endif]-->录制 HTTP 协议的脚本时 , 录制方式的选择原则 :
<!-- [if !supportLists]-->1.1 <!-- [endif]-->基于浏览器的应用程序使用 HTML-basedScript
<!-- [if !supportLists]-->1.2 <!-- [endif]-->不是浏览器的应用使用 URL-based Script
<!-- [if !supportLists]-->1.3 <!-- [endif]-->如果基于浏览器的应用程序中包含了 Javascript 并且该脚本向服务器产生了请求 , 比如 DataGrid 的分页按钮等 , 也要使用 URL-based 方式录制
<!-- [if !supportLists]-->1.4 <!-- [endif]-->给予浏览器的应用程序中使用了 HTTPS 安全协议 , 使用 URL-based 方式录制 .
<!-- [if !supportLists]-->2 <!-- [endif]-->几种有用的日志 : 脚本能够正常运行后 , 应当禁用日志以降低消耗 .
<!-- [if !supportLists]-->2.1 <!-- [endif]-->执行日志 :
<!-- [if !supportLists]-->2.1.1 <!-- [endif]-->脚本运行时产生 .
<!-- [if !supportLists]-->2.1.2 <!-- [endif]-->描述 Vuser 运行时执行的操作
<!-- [if !supportLists]-->2.1.3 <!-- [endif]-->黑色表示标准输出消息 , 红色表示标准错误消息 , 绿色用引号括起来的文字字符串 ( 例如 URL), 蓝色表示事务信息 ( 开始 , 结束 , 状态 , 持续时间 );
<!-- [if !supportLists]-->2.2 <!-- [endif]-->录制日志 : 在脚本录制过程中产生 , 详细描述录制过程中客户端与服务器之间的各种交互动作 .
<!-- [if !supportLists]-->2.3 <!-- [endif]-->产生日志 : 记录了脚本录制的设置 , 网络实践到脚本函数的转换过程 .
<!-- [if !supportLists]-->3 <!-- [endif]-->Tools/General Options/Display/Show browser during replay 选中后可以在 VU 运行时查看浏览器活动 , 不过这只是一个不完整的解释器而不是浏览器 , 因此一些脚本可能会加载不完全 . 打开运行时查看器后在运行脚本时就会实时播放动作 .
<!-- [if !supportLists]-->4 <!-- [endif]-->关联 : 对于一些请求 , 需要以前面某次请求服务器响应的数据去作为请求参数 , 因此 , 不能把这些数据硬编码 , 而是以参数的方式提供 , 同样 , 要使用的前面某次请求响应的数据也要写入到变量中以便使用 .
<!-- [if !supportLists]-->5 <!-- [endif]-->录制前自动关联 : 在录制脚本之前 , 已知寻找需要关联数据和关联的规则 , 就可以通过为 VU 设置规则来让其自动关联 .
<!-- [if !supportLists]-->5.1 <!-- [endif]-->内建关联规则 : 对于一些常用系统 , VU 有内建的关联规则 , 通过 Recording Options/HTTP Properties/Correlation 中启用关联规则 , 然后选择相应的关联规则 , 则在录制对应的系统时 , 就会自动建立关联 .
<!-- [if !supportLists]-->5.2 <!-- [endif]-->自定义关联规则 : Recording Options/HTTP Properties/Correlation 中建立新的关联规则 ( 也需要启用关联 )
<!-- [if !supportLists]-->6 <!-- [endif]-->录制后自动关联 : 录制完成后 , 脚本至少需要执行一次 , 在执行中 , 录制后关联会试图找出录制时和执行时服务器响应内容的差异部分 , 藉以找出需要关联的数据并建立关联 .
<!-- [if !supportLists]-->7 <!-- [endif]-->手动关联 :
<!-- [if !supportLists]-->7.1 <!-- [endif]-->找出需要关联的数据
<!-- [if !supportLists]-->7.1.1 <!-- [endif]-->使用相同的业务流程和数据 , 录制两份脚本
<!-- [if !supportLists]-->7.1.2 <!-- [endif]-->使用 WinDiff 工具找出不同点 : Tools/Compare with Vuser
<!-- [if !supportLists]-->7.2 <!-- [endif]-->使用 web_reg_save_param 函数手动建立关联
<!-- [if !supportLists]-->7.3 <!-- [endif]-->web_reg_save_param 函数放在要检查内容的请求之前
<!-- [if !supportLists]-->7.4 <!-- [endif]-->原理 : 捕获第一个操作的输出 à 保存为参数 à 将参数作为另一个操作的输入
<!-- [if !supportLists]-->8 <!-- [endif]-->关联的用户和意义 :
<!-- [if !supportLists]-->8.1 <!-- [endif]-->简化和优化脚本代码
<!-- [if !supportLists]-->8.2 <!-- [endif]-->动态生成数据 : session 等服务器端返回数据的利用
<!-- [if !supportLists]-->8.3 <!-- [endif]-->支持唯一数据
<!-- [if !supportLists]-->9 <!-- [endif]-->除了显式的以 lr_start_transaction 控制事务外 , 还可以在 vuser 的运行时设置中的 miscellaneous 选项中定义自动事务 .
<!-- [if !supportLists]-->10 <!-- [endif]-->集合点 ( 同步点 ): 为了模拟较重的用户负载 , 需要模拟多个 vuser 同时向服务器发送请求 , 此时 , 就可以在 vuser 脚本中通过 lr_rendezvous 来创建集合点 , Controller 在遇到集合点时会暂停脚本 , 等待其他 vuser 到达后 , 一起释放 vuser 运行 . 需要注意的是只能在 action 中添加集合点 , 而不能在 vuser_init 和 vuser_end 中创建 .
<!-- [if !supportLists]-->11 <!-- [endif]-->思考时间 : 为了模拟用户在操作过程中的停顿 , 可以用 lr_think_time 来设置思考时间 , 思考时间的单位是秒 . 有时测试不需要思考时间 , 这时就可以通过 Run-time Settings/Think time 中设置忽略思考时间 .
<!-- [if !supportLists]-->12 <!-- [endif]-->由于集合点和思考时间在 Controller 运行中都会产生等待 , 因此如果在事务中有这两项操作 , 就可能会对事务的响应时间产生影响导致结果不准确 .
<!-- [if !supportLists]-->13 <!-- [endif]-->参数化的过程 :
<!-- [if !supportLists]-->13.1 <!-- [endif]-->在脚本中用参数取代常量值
<!-- [if !supportLists]-->13.2 <!-- [endif]-->设置参数的属性以及数据源 .
<!-- [if !supportLists]-->14 <!-- [endif]-->参数数据源类型 : 参数的信息在脚本目录下的 ” 脚本名 .prm” 文件中
<!-- [if !supportLists]-->14.1 <!-- [endif]-->Data Files: 数据保存在文件中
<!-- [if !supportLists]-->14.2 <!-- [endif]-->User-Defined Functions: 调用外部 dll 函数生成数据
<!-- [if !supportLists]-->14.3 <!-- [endif]-->Internal Data: 虚拟用户内部产生的数据
<!-- [if !supportLists]-->14.3.1 <!-- [endif]-->Date/Time: 用当前日期 / 时间替换参数 , 需要指定 Date/Time 格式 .
<!-- [if !supportLists]-->14.3.2 <!-- [endif]-->Group Name: 用虚拟用户组名称替换参数
<!-- [if !supportLists]-->14.3.3 <!-- [endif]-->Load Generator Name: 用脚本负载生成器的名称替换参数 , 负载生成器是虚拟用户在运行的计算机
<!-- [if !supportLists]-->14.3.4 <!-- [endif]-->Iteration Number: 用当前迭代数目替换参数
<!-- [if !supportLists]-->14.3.5 <!-- [endif]-->Random Number: 用一个随机数替换参数
<!-- [if !supportLists]-->14.3.6 <!-- [endif]-->Unique Number: 用一个唯一的数字来替换参数 .
<!-- [if !supportLists]-->14.3.7 <!-- [endif]-->Vuser Id: 用运行时分配给 Vuser 的 id 替换参数
<!-- [if !supportLists]-->15 <!-- [endif]-->Tools/General Options/Parameterization 可以定义参数的括号类型 .
<!-- [if !supportLists]-->16 <!-- [endif]-->直接的参数化 , 只有在其作为函数参数时才能够使用 , 而且 , 有些函数的有些参数是不能被参数化的 , 在这种情况下 , 如果想要参数化 , 可以使用 lr_eval_string() 来代替要参数化的内容 , 而我们去参数化 lr_eval_string() 的参数 .
<!-- [if !supportLists]-->17 <!-- [endif]-->由于 lr_eval_string 返回的是一个指向参数值的指针 , 内容在每次 Iteration 后自动释放 , 因此 , 对于一个大的 Iteration, 如果使用 lr_eval_string 做参数化可能导致内存迟迟不能释放 , 此时可以使用 lr_eval_string_ext 和 lr_eval_string_ext_free 配对使用来自己做清理工作 .
<!-- [if !supportLists]-->18 <!-- [endif]-->Vuser/Parameter List 中可以统一管理当前脚本中所有参数的属性 .
<!-- [if !supportLists]-->19 <!-- [endif]-->参数的 update value on 意义
<!-- [if !supportLists]-->19.1 <!-- [endif]-->each occurrence: 每发生一次换一个
<!-- [if !supportLists]-->19.2 <!-- [endif]-->each iteration: 每次迭代换一个
<!-- [if !supportLists]-->19.3 <!-- [endif]-->once: 所有循环中都使用同一个值
<!-- [if !supportLists]-->20 <!-- [endif]-->参数的 when out of values 的意义
<!-- [if !supportLists]-->20.1 <!-- [endif]-->Abort Vuser: 中止
<!-- [if !supportLists]-->20.2 <!-- [endif]-->Continue in a cyclick manner: 继续循环取值
<!-- [if !supportLists]-->20.3 <!-- [endif]-->Continue with last value: 取最后一个值
<!-- [if !supportLists]-->21 <!-- [endif]-->从数据库导入参数
<!-- [if !supportLists]-->21.1 <!-- [endif]-->利用 Microsoft Query 从已存在的数据库中导入参数数据 (Microsoft Query 是 Office 的套件之一 , 没有安装开始菜单中的快捷方式 , 可以在 Office 安装目录下找 MSQRY32.EXE, 如果没有 , 可能是安装 Office 时没有安装 , 运行安装程序添加组件即可 )
<!-- [if !supportLists]-->21.2 <!-- [endif]-->指定数据库连接或 SQL: 在设置参数的界面如下顺序操作
<!-- [if !supportLists]-->21.2.1 <!-- [endif]-->点击 Data wizard
<!-- [if !supportLists]-->21.2.2 <!-- [endif]-->选择 Specify SQL statement manually
<!-- [if !supportLists]-->21.2.3 <!-- [endif]-->Creat
<!-- [if !supportLists]-->21.2.4 <!-- [endif]-->新建数据源 , 导入数据即可
<!-- [if !supportLists]-->22 <!-- [endif]-->检查点 : 对于 web 应用 , vuser 中的请求执行成功并不能代表业务流程是成功的 , 比如用户名密码错误也会返回 200 响应 , 所以 , 需要检查服务器的响应内容来判断业务流程是否执行成功 , 这个判断的点就是检查点 .
<!-- [if !supportLists]-->22.1 <!-- [endif]-->全局检查点 : 运行时设置中设置 ContentCheck, 这种检查点对于有统一出错处理页面的系统是有效的 .
<!-- [if !supportLists]-->22.2 <!-- [endif]-->检查函数 : 在一个请求完成后 , 运行检查函数 , 然后作出期望的处理返回 .
<!-- [if !supportLists]-->22.2.1 <!-- [endif]-->web_find: 检查文本
<!-- [if !supportLists]-->22.2.2 <!-- [endif]-->web_image_check: 检查图片
<!-- [if !supportLists]-->22.2.3 <!-- [endif]-->web_reg_find: 与 web_find 类似 , 不过 , 这个函数是先注册 ( 在请求之前 ), 然后查找 , 并且 , 这个函数可以查找多次 , 通过 SaveCount 保存查找到的次数 . 另外 , 通过运行时设置设置的 enable image and text check 对 web_find 有效 , 而对 web_reg_find 无效 , 即 web_reg_find 只要写了就会查找 .
<!-- [if !supportLists]-->23 <!-- [endif]-->Action/Import Action into vuser 可以将其他 Action 引入进来
<!-- [if !supportLists]-->24 <!-- [endif]-->在 Run-time settings 中可以设置脚本的全局错误处理机制 ( 是否继续执行 ), 但是 , 对于某些特殊段的脚本如果期望得到特殊的效果 , 可以通过 lr_continue_on_error 函数来控制 , 该函数接受参数 0 或 1, 0 表示以下代码在发生错误时退出 , 反之则继续执行 .
<!-- [if !supportLists]-->25 <!-- [endif]-->动态运行 : Tools/General Options/Replay 中设置动态运行的延时 , 然后在 view 菜单内选择 Animated run 即可以进入动态运行状态 , 此时运行脚本每运行一句都会暂停设定的毫秒数 .
<!-- [if !supportLists]-->26 <!-- [endif]-->扩展日志选项的意义 :
<!-- [if !supportLists]-->26.1 <!-- [endif]-->参数替换 : 记录指定给脚本的所有参数及其相应的值
<!-- [if !supportLists]-->26.2 <!-- [endif]-->服务器返回的数据 : 记录服务器返回的所有数据
<!-- [if !supportLists]-->26.3 <!-- [endif]-->高级跟踪 : 记录 vuser 在会话期间发送的所有函数和消息 .
<!-- [if !supportLists]-->27 <!-- [endif]-->由于扩展日志内容较大 , 因此可以选择性的开启 , 以自定义函数方式 , 调用处理时同错误处理一样 .
void ud_log_extend(int switch) {
lr_set_debug_message(LR_MSG_CLASS_EXTENDED_LOG, switch); // 设置扩展日志
lr_set_debug_message(LR_MSG_CLASS_PARAMETERS_LOG, switch); // 设置参数替换日志
lr_set_debug_message(LR_MSG_CLASS_RESULT_LOG, switch); // 设置服务器返回数据日志
lr_set_debug_message(LR_MSG_CLASS_FULL_LOG, switch); // 设置高级跟踪日志
}
Action_test{
ud_log_extend(1); /* 开启扩展日志 */
web_link(“test”, “Text=test”, LAST);
ud_log_extend(0); /* 关闭扩展日志 */
return 0;
}
<!-- [if !supportLists]-->28 <!-- [endif]-->验证测试脚本的通常流程 :
<!-- [if !supportLists]-->28.1 <!-- [endif]-->录制或开发脚本
<!-- [if !supportLists]-->28.2 <!-- [endif]-->单用户单迭代 : 解决可能存在的关联问题
<!-- [if !supportLists]-->28.3 <!-- [endif]-->单用户多迭代 : 验证参数化问题
<!-- [if !supportLists]-->28.4 <!-- [endif]-->多用户单迭代 : 验证可能存在的多线程问题
<!-- [if !supportLists]-->28.5 <!-- [endif]-->多用户多线程 : 实际就是真正的性能测试开始 .
<!-- [if !supportLists]-->29 <!-- [endif]-->Tools/Create Controller Scenario 根据当前脚本创建场景
<!-- [if !supportLists]-->1 <!-- [endif]-->手工场景 : 负载测试通常使用手工场景 , 首先设置虚拟用户数目 , 脚本 , 以及它们运行的方式 , 然后运行得出服务器的响应时间等指标 .
<!-- [if !supportLists]-->2 <!-- [endif]-->面向目标的场景 : 首先定义测试要达到的目标 , 然后 LoadRunner 自动基于这些目标创建场景 , 运行过程中 , 不断把结果和目标相比较决定下一步走向 .
<!-- [if !supportLists]-->3 <!-- [endif]-->虚拟用户组 : 一组用户指的就是针对同一个脚本的多个虚拟用户 , 在同一个场景中 , 可以用多个用户组使用同一个脚本 .
<!-- [if !supportLists]-->4 <!-- [endif]-->集合点 ( 同步点 ): 如果当前场景中的脚本中包含集合点 (rendezvous), 那么可以通过 Scenario/Rendezvous 打开集合点信息面板来设置集合点信息
<!-- [if !supportLists]-->4.1 <!-- [endif]-->点击 Policy 按钮 : 这里设置集合点的策略 . 三个 Release 选项用来设置释放集合点的策略 , timeout 表明第一个 vuser 等待一定时间后就不再等待 , 释放等待用户 , 继续执行场景 .
<!-- [if !supportLists]-->5 <!-- [endif]-->负载生成器 : 网内安装了负载生成器的机器都可以被同一个 Controller 控制用来生成负载 .
<!-- [if !supportLists]-->6 <!-- [endif]-->在 Controller 中可以对 vuser 组进行运行时设置 , 这里可以设置网络带宽来模拟真实的情况 .
<!-- [if !supportLists]-->7 <!-- [endif]-->在 schedule( 调度栏 ) 内可以设置 vuser 加载及卸载的方式等调度策略 .
<!-- [if !supportLists]-->8 <!-- [endif]-->Scenario/Convert scenario to the percentage mode 可以将场景转换为百分比模式 . 百分比模式的场景只是对场景内的 vuser group 中的 vuser 数量进行了百分比分配
<!-- [if !supportLists]-->9 <!-- [endif]-->面向场景的目标类型 : 一次只能设置一个目标 .
<!-- [if !supportLists]-->9.1 <!-- [endif]-->virtual users: 虚拟用户数量 , 如果测试服务器的并发处理能力 , 使用这个目标 .
<!-- [if !supportLists]-->9.2 <!-- [endif]-->hits per second: 每秒点击数 , 测试 web 的真正响应处理能力 .
<!-- [if !supportLists]-->9.3 <!-- [endif]-->transaction per second: 每秒事务数 , 这种目标需要选择事务名 .transaction response time: 事务响应时间 , 需要选择事务名 , 测试 web 的真正响应处理能力 .
<!-- [if !supportLists]-->9.4 <!-- [endif]-->pages per minute: 每分钟页面响应数
<!-- [if !supportLists]-->10 <!-- [endif]-->Controller 的加载策略 :
<!-- [if !supportLists]-->10.1 <!-- [endif]-->在使用 pages per minute, hits/transaction per second 这几种目标时 , 加载时首先用最小用户数除以定义的目标 , 得到一个值 , 然后确定每个用户应该达到的数据 , 然后 Controller 开始按照以下策略加载用户 :
<!-- [if !supportLists]-->10.1.1 <!-- [endif]-->如果选择的是自动加载 vuser, controller 会首先记载 50 个 vuser, 如果定义的最大用户数小于 50, 会一次加载所有的 vuser.
<!-- [if !supportLists]-->10.1.2 <!-- [endif]-->如果选择的是在场景运行一段时间后达到目标 , LoadRunner 会尝试在定义的这段时间内达到目标 , 根据时间限制和计算出的单用户数据确定第一批加载多少 vuser.
<!-- [if !supportLists]-->10.1.3 <!-- [endif]-->如果选择的是按照一定的阶段达到目标 ( 也就是 x 长时间内达到 y 数据 , 然后达到下一目标 ), LoadRunner 计算每个用户应该达到的数字后 , 再确定第一批加载多少用户 .
<!-- [if !supportLists]-->10.2 <!-- [endif]-->每加载一批用户 , LoadRunner 会判断是否达到这批用户的目标 , 如果这批用户目标没有达到 , LoadRunner 重新计算每一个用户应该达到的目标数字后 , 重新调整下一批加载用户数量 .
<!-- [if !supportLists]-->10.3 <!-- [endif]-->如果 Controller 加载了最多数量的用户还没有达到预订目标 , 会重新计算每个用户的目标 , 然后同时运行最大数量的用户 , 尝试达到预订目标
<!-- [if !supportLists]-->10.4 <!-- [endif]-->如果出现以下情况 , pages per minute, hits/transaction per second 三种类型的面向目标场景会置于 ”Failed” 状态 :
<!-- [if !supportLists]-->10.4.1 <!-- [endif]-->Controller 使用了指定的最大数量用户 , 并且两次都没有达到目标
<!-- [if !supportLists]-->10.4.2 <!-- [endif]-->所有的用户运行都失败
<!-- [if !supportLists]-->10.4.3 <!-- [endif]-->没有足够的 LoadGenerator 机器
<!-- [if !supportLists]-->10.4.4 <!-- [endif]-->Controller 增加了几批用户后 , pages per minute, hits/transaction per second 数据没有增加 .
<!-- [if !supportLists]-->11 <!-- [endif]-->IP 欺骗设置 : 应对某些服务器要求不允许单 IP 多登的测试 .
<!-- [if !supportLists]-->11.1 <!-- [endif]-->在负载生成器机器上 ( 必须使用固定 IP), “Windows 开始 ”/LoadRunner/Tools/Ip wizard 打开 IP 向导 , 根据向导配置 IP 列表 .
<!-- [if !supportLists]-->11.2 <!-- [endif]-->在 Controller 中 , Scenario/Enable IP spoofer 打开 IP 欺骗
<!-- [if !supportLists]-->12 <!-- [endif]-->场景的运行时控制
<!-- [if !supportLists]-->12.1 <!-- [endif]-->场景开始运行后 , 可以通过 stop 按钮停止 , 但是停止的方式需要在运行之前通过 Tools/Options/Run-time settings 中设置好
<!-- [if !supportLists]-->12.2 <!-- [endif]-->场景开始运行后的 reset 按钮用来将方案中的所有 vuser 组重置为其方案前的关闭状态
<!-- [if !supportLists]-->12.3 <!-- [endif]-->Vusers 用来查看 vuser 组内每个 vuser 的详细状态
<!-- [if !supportLists]-->12.4 <!-- [endif]-->Run/Stop Vusers 打开 ” 运行 / 停止 vuser” 对话框 , 在场景运行时决定是继续执行还是停止某个用户组 .
<!-- [if !supportLists]-->12.5 <!-- [endif]-->运行时释放集合点用户 : Scenario/Rendezvous 然后选定用户 disable vuser
<!-- [if !supportLists]-->13 <!-- [endif]-->如果系统提供的数据采集点不能满足需求 , 可以在脚本中用 lr_user_data_point 自定义数据采集点 .
<!-- [if !supportLists]-->14 <!-- [endif]-->判断磁盘瓶颈的方法 : 每磁盘 I/O 数 = [ 读次数 +(4* 写次数 )]/ 磁盘个数 , 如果每磁盘的 I/O 数大于磁盘的处理能力 , 那么磁盘存在瓶颈 .
<!-- [if !supportLists]-->1 <!-- [endif]-->Analysis 功能 :
<!-- [if !supportLists]-->1.1 <!-- [endif]-->Analysis 图有助于确定系统性能瓶颈 .
<!-- [if !supportLists]-->1.2 <!-- [endif]-->“ 图数据 ” 视图和 ” 原始数据 ” 视图以电子表格格式显示用于生成图的实际数据 .
<!-- [if !supportLists]-->1.3 <!-- [endif]-->“ 报告 ” 功能可以使用户查看每个图的摘要 , HTML 报告或各种性能和活动报告 .
<!-- [if !supportLists]-->2 <!-- [endif]-->摘要报告 (summary):
<!-- [if !supportLists]-->2.1 <!-- [endif]-->Analysis summary( 统计摘要 ):
<!-- [if !supportLists]-->2.1.1 <!-- [endif]-->Maximum Running vusers: 最大同时运行用户数
<!-- [if !supportLists]-->2.1.2 <!-- [endif]-->Total Throughput(bytes): 吞吐量
<!-- [if !supportLists]-->2.1.3 <!-- [endif]-->Average Thoughput(bytes/second): 吞吐率
<!-- [if !supportLists]-->2.1.4 <!-- [endif]-->Total Hits: 总点击数
<!-- [if !supportLists]-->2.1.5 <!-- [endif]-->Average Hits per Second: 每秒点击数
<!-- [if !supportLists]-->2.1.6 <!-- [endif]-->View HTTP Responses Summary: 查看 HTTP 响应的摘要
<!-- [if !supportLists]-->3 <!-- [endif]-->Trasaction summary( 事务摘要 ):
<!-- [if !supportLists]-->3.1 <!-- [endif]-->Minimum: 事务最小时间
<!-- [if !supportLists]-->3.2 <!-- [endif]-->Average: 平均事务时间
<!-- [if !supportLists]-->3.3 <!-- [endif]-->Maximum: 事务最大时间
<!-- [if !supportLists]-->3.4 <!-- [endif]-->Std.Deviation: 标准方差 . 值越大数据越离散也就说明不稳定 .
<!-- [if !supportLists]-->3.5 <!-- [endif]-->90 Percent: 90% 的事务消耗的时间 , 通常这个值比总平均时间个更可靠 .
<!-- [if !supportLists]-->3.6 <!-- [endif]-->Pass/Fail/Stop: 通过 / 失败 / 中途停止的事务数
<!-- [if !supportLists]-->4 <!-- [endif]-->在 Average Transaction Response Time 图中 , 可以选择某个事务曲线 , 右键 ”Web Page Breakdown for login” 将事务进行分解 , 查看事务过程中每个请求的每一步是怎么样完成的 .
<!-- [if !supportLists]-->5 <!-- [endif]-->Time to first buffer breakdown(Over Time) 图中可以对比页面响应时间中的服务器时间和网络时间 , 从而分析是网络还是服务器造成的耗时 .
<!-- [if !supportLists]-->6 <!-- [endif]-->Page Download Time Breakdown(Over Time) 图中可以看出每次请求详细分解的请求时间 ( 包括客户端时间 , 连接时间 , DNS 解析时间 , 错误时间 , 首次缓存时间 , FTP 鉴权时间 , 接收时间 , SSL 处理时间等等 ).
<!-- [if !supportLists]-->7 <!-- [endif]-->图的合并 :
<!-- [if !supportLists]-->7.1 <!-- [endif]-->叠加 : 重叠共用一个 x 轴的两个图的内容 , 合并图使用左右两个不同的 y 轴
<!-- [if !supportLists]-->7.2 <!-- [endif]-->平铺 : 共用同一个 x 轴的数据 , 但显示上上下分离 , 合并图仍然是左右两个不同的 y 轴
<!-- [if !supportLists]-->7.3 <!-- [endif]-->关联 : 当前图的 y 轴成为合并图的 x 轴 , 被合并图的 y 轴是合并图的 y 轴
<!-- [if !supportLists]-->8 <!-- [endif]-->可以使用 Reports 生成报告 .