平平庸庸

响应号召,开始写日志(四):lr脚本中oracle2 tier虚拟用户相关内容

上一篇 / 下一篇  2009-03-19 16:00:53 / 个人分类:测试工具

目的:

本文记录一些在使用oracle 2tier时了解的东西。以防止自己忘记

(一)如果选择录制脚本的话

1、vugen会生成以下这些跟其他协议不同的文件

vdf.h

作用:定义各种变量

print.inl

作用:打印表格使用的函数。录制脚本时才有用,写脚本的话没有用

oracle20090225b.grd

作用:打印表格的格式。录制脚本时才有用,写脚本的话没有用

oracle20090225b.rdf

作用:这个不大清楚,应该是打印表格的内容。用ue打开都是些框框。录制脚本时才有用,写脚本的话没有用

2、录制脚本的好处

  需要的东西什么都有了。只要找到要执行的sql。然后将其中的sqltext部分参数化掉就可以了。

   select时生成的几个表格不错。可以在上面完成参数的保存和将搜索的结果保存成dat文件。用起来还是比较直观的

3、录制脚本不好的地方

使用plsql或者toad这样的工具录制出来的脚本有很多的操作就是测试中不需要的。对于不了解lr脚本的用户来说这些东西会造成一些麻烦。了解的话把这些不需要的语句都去掉就行了。

(二)如果选择自己写脚本的话

需要用到以下这些语句

#include "lrd.h"

static LRD_INIT_INFO InitInfo = {LRD_INIT_INFO_EYECAT};
static LRD_DEFAULT_DB_VERSION DBTypeVersion[] =
{
        {LRD_DBTYPE_NONE, LRD_DBVERSION_NONE}
};


//定义各种变量。录制生成的脚本中,这些变量的定义在vdf.h中。
static void FAR *       OraEnv1;

。。。

unsigned long           rownum;
static unsigned long        uliRowsProcessed;
static unsigned long        uliFetchedRows;

static LRD_VAR_DESC      MEMBERCODE_D55 =
    {LRD_VAR_DESC_EYECAT, 500, 8, LRD_DBTYPE_ORACLE, {1, 0, 0},

。。。。

vuser_init()
{
//初始化数据库部分
lrd_init(&InitInfo, DBTypeVersion);
lrd_initialize_db(LRD_DBTYPE_ORACLE, 3, 0);
lrd_env_init(LRD_DBTYPE_ORACLE, &OraEnv1, 0, 0);
lrd_ora8_handle_alloc(OraEnv1, SVCCTX, &OraSvc1, 0);
lrd_ora8_handle_alloc(OraEnv1, SERVER, &OraSrv1, 0);
lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes1, 0);

//连接数据库
lrd_server_attach(OraSrv1, "aaa", -1, 0, 0); //这里填写数据库的名称
lrd_ora8_attr_set_from_handle(OraSvc1, SERVER, OraSrv1, 0, 0);

//设定数据库密码
lrd_ora8_attr_set(OraSes1, USERNAME, "aaa", -1, 0); //这里填写用户名
lrd_ora8_attr_set(OraSes1, PASSWORD, "bbb", -1, 0);//这里填写密码

//初始化连接session
lrd_ora8_attr_set_from_handle(OraSvc1, SESSION, OraSes1, 0, 0);

//开始连接数据库
lrd_session_begin(OraSvc1, OraSes1, 1, 0, 0);
lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm4, 0);
}

Action()
{//设定查询语句
lrd_ora8_stmt(OraStm4, "select * from member", 1, 0, 0);//这里填写SQL语句

//执行查询语句
lrd_ora8_exec(OraSvc1, OraStm4, 0, 0,&rownum, 0, 0, 0, 0, 1);


//这些无聊的东西不绑定的话无法执行lrd_ora8_fetch。一个查询结果的每个字段都要绑定一下。像这样的东西OraDef37,MEMBERCODE_D55。需要在上面定义一下
 lrd_ora8_bind_col(OraStm4, &OraDef37, 1, &MEMBERCODE_D55, 0, 0);
//保存变量第1列 第1行。保存到参数a中。通过这个就可以在之后使用查询到的直的。这个函数一般用在fatch之前。
 lrd_ora8_save_col(OraStm4,1,1,0,"a");
//执行fetch。倒数第4个参数是0。在帮助中是PrintRow1这类的东西,这是在print.inl那个文件中定义的用来把表格打出来的函数。这里用0就是不用这个打印的东西,这样的话也就用不到print.inl这个文件和其他的定义打印表格格式的文件了。
 lrd_ora8_fetch(OraStm4, 2,2, &uliFetchedRows, 0, 2, 0, 0);

 lr_output_message("%s.%s",lr_eval_string("{a}"));


}

vuser_end()
{
//释放数据库连接
lrd_handle_free(&OraStm4, 0);
lrd_session_end(OraSvc1, OraSes1, 0, 0);
lrd_server_detach(OraSrv1, 0, 0);
lrd_handle_free(&OraEnv1, 0);

}


TAG: 2tier 性能测试 LoadRunner LR lr Oracle oracle

孙明星的测试技术空间 引用 删除 Lennon   /   2009-07-29 15:47:00
恩.N久没有来看了.刚刚看到这个东西.不好意思了.是这个方法.在WEB协议的脚本里面添加oracle 2tier协议.这样可以解决你的这个问题.关于为什么并发的时候取不到,这个我就不清楚了,可能在取的时候数据还没有生成好.
credit_hly的个人空间 引用 删除 credit_hly   /   2009-06-29 10:57:15
其实我用这个主要是为了得到数据库里的值。因为程序中不是通过服务器返回方式获取某值(即无法关联),而是通过直接读取数据库里的值。
上述是个人理解,若有更好方式请赐教!
credit_hly的个人空间 引用 删除 credit_hly   /   2009-06-29 09:30:35
大量用户执行时,会遇到lrd_ora8_save_col取不到数据,应如何处理?
引用 删除 tanky   /   2009-04-24 17:36:38
谢谢回复!选择ORACLE+WEB协议,进行BS程序录制完毕的时候就会报错。不录制的情况下,把web脚本里的内容复制到多协议的脚本中是没有问题的。但是采取这种方式的话,Tree视图没法查看,不便于脚本调试。我现在是在web脚本中调试成功后,再放到双协议的脚本中,添加上oralce相关函数
孙明星的测试技术空间 引用 删除 Lennon   /   2009-04-24 10:33:39
你说的问题我到没有碰到过。
但感觉上应该这样处理
选择了oracle 2tier和web的多协议后lr在globel头里面包含了vdf.H。然后你录制数据库部分成功的话会生成 一个vdf.h。里面会把lrd.H包含进来。如果没有录制数据库部分但是想用其函数的话(没有vdf.h文件的情况下 )需要把#include "lrd.h"加在globel。h里面或者 加在init方法上面
引用 删除 tanky   /   2009-04-23 21:13:05
再问:如何在只选择web协议的情况下执行ORACLE协议的函数,我今天选择双协议录制完毕lr报错:Error:  Failed to open c:\documents and settings\ibm\local settings\temp\noname51\data\noname51.ibf。明明选了两个协议,录完后,lr显示只有web协议。郁闷,之前都是可以的,所以才会问你SQL返回为空的问题。
引用 删除 tanky   /   2009-04-23 20:26:59
正解,谢谢!
孙明星的测试技术空间 引用 删除 Lennon   /   2009-04-23 14:51:32
刚刚是怎么判断的回答
关于a的值是什么这个问题:
a没有值
lr_eval_string("{a}");如果没有数据被取回的话,用这句话会抱错,跟你说a没有初始化。
孙明星的测试技术空间 引用 删除 Lennon   /   2009-04-23 14:47:09
lrd_ora8_fetch(OraStm4, 2,2, &uliFetchedRows, 0, 2, 0, 0);
fetch这句话像上面这样加一个&uliFetchedRows(原来的0,改成这个)。这个东西保存实际取回的条目数。
在后面用在那个参数的语句前判断这个值是不是0。
if (uliFetchedRows==0){
。。。。
return 0
}
就这样了。
引用 删除 tanky   /   2009-04-22 19:42:08
请问如果SQL返回为空的话,a的值是什么,怎么判断?
                                 51testing
                                                                  tanky
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar