脚本优化-事务函数简介

by:授客 QQ:1033553122

1.事务的开始和结束名称需要相同

lr_start_transaction(“transaction_name”);

…//事务处理

lr_end_transaction(“transaction_name”,LR_AUTO);

2.事务和子事务

在VuGen中可以通过事务来完成一组操作的响应时间监控,如果想监控某一个事务中某一步操作的响应时间,就要使用子事务来完成。当然也可以使用事务嵌套

lr_start_sub_transaction(“子事务名”, “父事务名”);

lr_end_sub_transaction(“子事务名”, 子事务状态);

注意:子事务和父事务很像,但是父事务支持的很多函数在子事务中都无法实现,所以应酌情考虑。

例:做一个登录的事务,同时把打开登录页面和登录操作都做成一个事务,这样就可以得到三个事务的时间:打开页面和登录操作及整个操作的时间。

Action()

{

//开始登录事务

lr_start_transaction("login");

//打开登录界面

lr_start_sub_transaction("loginpage", "login");

web_url("WebTours",

"URL=http://127.0.0.1:1080/WebTours/",

"Resource=0",

"RecContentType=text/html",

"Referer=",

"Snapshot=t16.inf",

"Mode=HTML",

LAST);

lr_end_sub_transaction("loginpage", LR_AUTO);

lr_think_time(4);

//提交登录页面的表单

lr_start_sub_transaction("submit", "login");

web_submit_form("login.pl",

"Snapshot=t17.inf",

ITEMDATA,

"Name=username", "Value=jojo", ENDITEM,

"Name=password", "Value=bean", ENDITEM,

"Name=login.x", "Value=0", ENDITEM,

"Name=login.y", "Value=0", ENDITEM,

LAST);

lr_end_sub_transaction("submit", LR_AUTO);

lr_end_transaction("login", LR_AUTO);

}

运行结果:

3.事务状态

在默认情况下使用LR_AUTO来作为事务状态,对于一个事务有以下4个状态可以选择。

1)
LR_AUTO

指事务的状态由系统自动根据默认规则来判断,结果为PASS/FAIL/STOP

LR_AUTO也是根据服务器的返回状态信息来决定事务是以LR_PASS状态通过还是以LR_FAIL状态结束,只要服务器返回页面,那么事务就会认为请求成功发出去了,服务器看懂了请求也返回了内容,自然事务就是PASS状态。

这样由于事务的自动判断,导致虽然操作失败的,但是得到了一个响应时间,并且这个响应时间又没正确反映出做这件事情的真正时间,最终影响测试结果。添加检测函数有时候可以解决这个问题

例:判断是否登录成功(以lr自带web站点为例)

Action2()

{

lr_start_transaction("login");

//打开登录界面

web_url("WebTours",

"URL=http://127.0.0.1:1080/WebTours/",

"Resource=0",

"RecContentType=text/html",

"Referer=",

"Snapshot=t16.inf",

"Mode=HTML",

LAST);

lr_think_time(4);

//注意函数的位置

// jojo1为要查找的文本(实际文本如上图,jojo,仅在登录后才出现,这里为了演示故意找不存在的文本)

web_reg_find("Search=Body", "SaveCount=login_times", "Text=jojo1",
LAST);

//提交登录页面的表单

web_submit_form("login.pl",

"Snapshot=t17.inf",

ITEMDATA,

"Name=username", "Value=jojo", ENDITEM,

"Name=password", "Value=bean", ENDITEM,

"Name=login.x", "Value=0", ENDITEM,

"Name=login.y", "Value=0", ENDITEM,

LAST);

lr_think_time(4);

if(atoi(lr_eval_string("{login_times}"))
>= 1) //找到“jojo”,说明登录成功

lr_end_transaction("login", LR_PASS);

else 
//未找到,说明登录失败

lr_end_transaction("login", LR_FAIL);

return 0;

}

运行结果:


 

2)
LR_PASS

指事务是以PASS状态通过的,说明改事务正确地完成了,并且记录下对应的时间,这个时间就是指做这件事情所需要消耗的时间。

3)
LR_FAIL

LR_FAIL是指事务以FAIL状态结束,该事务是一个失败的事务,没有完成事务中脚本应该达到的效果,得到的时间不是正确操作的时间,这个时间在后期的统计中将被独立统计。

4)
LR_STOP

LR_STOP将事务以STOP状态停止。

说明:

事务的PASS和FAIL状态会在场景的对应计数器中记录,包括通过的次数和事务的响应时间,方便后期分析改事务的吞吐量以及响应时间的变化情况

4.事务相关的函数

//获得对应事务达到该函数运行位置时持续的时间,返回double类型

lr_get_transaction_duration(“事务名”);

//获得对应事务达到该函数运行位置时的wasted时间,返回double类型。

lr_get_transaction_wasted_time(“事务名”);

//为一个事务添加wasted时间,无返回值

lr_wasted_time(毫秒)

//将一个事务暂停,该函数后的操作都不会被记录事务时间

lr_stop_transaction(“事务名”);

Action2()

{

double duration  = 0;

double wastedtime = 0;

lr_start_transaction("login");

//打开登录界面

web_url("WebTours",

"URL=http://127.0.0.1:1080/WebTours/",

"Resource=0",

"RecContentType=text/html",

"Referer=",

"Snapshot=t16.inf",

"Mode=HTML",

LAST);

lr_think_time(4);

//事务达到该函数运行位置时持续的时间

duration = lr_get_transaction_duration("login");

lr_output_message("duration %f", duration);

//事务达到该函数运行位置时浪费的时间

wastedtime = lr_get_transaction_wasted_time("login");

lr_output_message("wastedtime %f", wastedtime);

//为事务添加一个浪费时间
5s//该浪费时间无法直接通过lr_get_transaction_wasted_time获得

lr_wasted_time(5);

wastedtime = lr_get_transaction_wasted_time("login");

lr_output_message("wastedtime %f", wastedtime);

//暂停事务

lr_stop_transaction("login");

//注意函数的位置

web_reg_find("Search=Body", "SaveCount=login_times", "Text=jojo",
LAST);

//提交登录页面的表单

web_submit_form("login.pl",

"Snapshot=t17.inf",

ITEMDATA,

"Name=username", "Value=jojo", ENDITEM,

"Name=password", "Value=bean", ENDITEM,

"Name=login.x", "Value=0", ENDITEM,

"Name=login.y", "Value=0", ENDITEM,

LAST);

lr_think_time(4);

//事务达到该函数运行位置时浪费的时间

wastedtime = lr_get_transaction_wasted_time("login");

lr_output_message("wastedtime %f", wastedtime);

if(atoi(lr_eval_string("{login_times}")) >= 1)

lr_end_transaction("login", LR_PASS);

else

lr_end_transaction("login", LR_FAIL);

return 0;

}

注意:通过代码stop事务后可以重新通过lr_start_transaction函数恢复被暂停的事务

5.包含“资源下载”的事务处理

一般情况都可以十分简单地获得请求的响应时间,但是对于下载操作来说就并不是那么方便了,这个时候需要利用一个web_get_int_property()函数来解决。

Action()

{

int
i;

lr_start_transaction(“download”);

web_url(“LoadRunner”,”RUL=http://127.0.0.1/loadrunner.iso”,LAST);
//下载操作请求

i=web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);

if(i>5000)
//当下载的文件大小大于5000个字节时认为下载成功,否则失败。

lr_end_transaction(“download”,LR_PASS);

else

lr_end_transaction(“download”,LR_FAIL);

}

一般来说,对于下载操作的性能测试集中在需要多少时间弹出下载对话框,而后面的内容其实属于网络带宽的问题了,另一个方面现在很少使用IE进行直接下载,而采用迅雷一类的p2p下载工具,所以很少考虑具体下载文件操作对网络和服务器读写操作的影响。

Loadrunner 脚本优化-事务函数简介的更多相关文章

  1. loadrunner 脚本优化-事务时间简介

    脚本优化-事务时间简介 by:授客 QQ:1033553122 事务概念 事务是指用户在客户端做一种或多种业务所需要的操作集(actions),通过事务开始和结束函数可以标记完成该业务所需要的操作内容 ...

  2. loadrunner 脚本优化-参数化之Parameter List参数同行取值

    脚本优化-参数化之Parameter List参数同行取值 by:授客 QQ:1033553122 select next row 记录选择方式 Same line as,这个选项只有当参数多余一个时 ...

  3. loadrunner 脚本优化-关联函数web_reg_save_param()函数详解

    脚本优化-关联函数web_reg_save_param()函数详解   by:授客 QQ:1033553122 Insert->New Step,打开Add Step对话框 选择函数web_re ...

  4. loadrunner 脚本优化-参数化方法

    脚本优化-参数化方法 by:授客 QQ:1033553122 方法一 1.确定需要参数化的内容 2.选中需要参数化的内容 3.右键选中的内容->Replace with a Parameter- ...

  5. LoadRunner脚本优化之—参数化迭代介

    在LoadRunner的脚本优化时,有时发送给服务器的请求参数化时,服务器返回的内容也会和参数化的内容相对应,例如发送的请求带有查询key=123,则服务器也会返回含有123相关的内容.这时我们在使用 ...

  6. loadrunner 脚本优化-检查点设置

    脚本优化-检查点设置 by:授客 QQ:1033553122 VuGen判断脚本是否执行成功是根据服务器返回的状态来确定的,如果服务器返回的是HTTP状态为200 OK,那么VuGen就认为脚本正确地 ...

  7. loadrunner 脚本优化-集合点设置

    脚本优化-集合点设置 by:授客 QQ:1033553122 添加集合点(Insert->Rendezvous) 当一个集合点被插入,VuGen往Vuser脚本中插入一个lr_rendezvou ...

  8. loadrunner 脚本优化-参数化之Parameter List参数取值

    脚本优化-参数化之Parameter List参数取值 by:授客 QQ:1033553122 参数取值选项 Select next row Update value on 以上两个选项是改变参数化取 ...

  9. loadrunner 脚本优化-加密与解密

    脚本优化-加密与解密 by:授客 QQ:1033553122   密码加密 可以给密码加密,意在把结果字符串作为脚本的参数或者参数值.例如,完整可能有一个用户密码填写的表单,你想测试网站针对不同密码的 ...

随机推荐

  1. 开发十年,只剩下这套Java开发体系了 原

    蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力.培训.出国.大公司的经历,还有很多很好的朋友.但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,可惜 ...

  2. deque源码3(deque的构造与内存、ctor、push_back、push_front)

    deque源码1(deque概述.deque中的控制器) deque源码2(deque迭代器.deque的数据结构) deque源码3(deque的构造与内存.ctor.push_back.push_ ...

  3. Selenuim自动化测试模型

    本章内容: 概念介绍 自动化测试模型 一.概念 自动化测试库.框架.工具之间的区别: 库是由代码集合成的一个产品,供程序员调用,面向对象的代码组织形成的库叫类库,面向过程的代码组织形成的库叫函数库. ...

  4. 小程序this.setData

    data: { isChecked: [ { key: true },{ key: true },{ key: true} ]} 如上,如果我想动态修改isChecked里面指定某个下标的值怎么办? ...

  5. 知其然而所以然:Operating System 概述和学习图

    大神绕道,鄙人初入 OS . 一.想知OS,先知计算机系统概述 #图解 #基本指令和中断周期 #直接内存存取(Direct Memory Access,DMA) I/O模块对存储器发出读命令或者写命令 ...

  6. 【EF6学习笔记】(九)异步处理和存储过程

    本篇原文:Async and Stored Procedures 为何要采用异步? 一个Web服务器肯定有可用线程的限制,那么在一些访问量特别大的情况下,线程肯定会消耗完:这个时候服务器肯定处理不了请 ...

  7. 【干货】利用MVC5+EF6搭建博客系统(四)(上)前后台页面布局页面实现,介绍使用的UI框架以及JS组件

    一.博客系统进度回顾以及页面设计 1.1页面设计说明 紧接前面基础基本完成了框架搭建,现在开始设计页面,前台页面设计我是模仿我博客园的风格来设计的,后台是常规的左右布局风格. 1.2前台页面风格 主页 ...

  8. WCF 的学习过程

    之前没有接触过WCF,这两天学习中.把遇到的问题和解决办法记下来. 遇到的问题: (1).HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 ...

  9. 基于redis的分布式锁实现

    1.分布式锁介绍 在计算机系统中,锁作为一种控制并发的机制无处不在. 单机环境下,操作系统能够在进程或线程之间通过本地的锁来控制并发程序的行为.而在如今的大型复杂系统中,通常采用的是分布式架构提供服务 ...

  10. mysql列反转Pivoting

    Pivoting是一项可以把行旋转为列的技术.在执行Pivoting的过程中可能会使用到聚合.Pivoting技术应用非常广泛.下面讨论的都是静态的Pivoting查询,即用户需要提前知道旋转的属性和 ...