lingting 发表于 2009-6-19 11:02:10

谁用过oracle两层协议的性能测试,

谁用过oracle两层协议的性能测试,协议名称是oracle(2-tier)

在录制中存在大量的lrd_ora8_fetch函数,
谁能说明一下这个函数,脚本中起什么作用,在性能测试中其实什么作用,可以在性能测试中删除它吗






一直谢

prince198509 发表于 2009-6-19 11:43:01

lr脚本中oracle 2tier虚拟用户相关内容

lr脚本中oracle 2tier虚拟用户相关内容
目的:
本文记录一些在使用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);
}

prince198509 发表于 2009-6-19 11:43:53

LoadRunner的Oracle(2-tier)协议脚本排错实例

LoadRunner的Oracle(2-tier)协议脚本排错实例
客户方在对一个C/S系统进行测试的时候,使用Oracle(2-tier)协议进行录制,回放脚本时候出错.于是到现场进行脚本排错.因为是隔了很长时间才记录这次排错过程,具体的脚本和错误信息都没有保存,所以记录过程中可能会少些原始脚本和错误的信息.   
1.查看录制的脚本,发现使用该协议是可以录制产生数据库各种操作的脚本,说明协议选择是正确的.
   2.回放时出现一个错误,具体错误信息忘记了.然后就开始从头到尾的分析脚本,因为是第一次接触Oracle(2-tier)这种协议的LR脚本,分析脚本就只能靠帮助以及根据以前的数据库知识经验了。 仔细分析了在出错语句和之前的几个语句。 发现出错语句lrd_ora8_stmt(OraStm1, 。。。)这个函数的第一个参数在前面没有找到定义的地方,然后再看其他执行SQL语句的流程,执行这个语句前都需要来分配和初始化LRDDBI Handle.在错误语句前加上lrd_ora8_handle_alloc()对OraStm1声明,回放脚本,错误消失,问题解决.
3.被测系统的某个属性需要进行修改,在LR脚本中把该数据进行了参数化.参数使用顺序取值,回放迭代多次,脚本没有报错,但实际上该参数化的属性值只有在第一次回放的时候进行了修改,之后的迭代没有对系统起作用.
4.分析该操作是SQL语句的更新操作,于是对执行的SQL语句部分进行检查分析.通过和客户沟通以及参考技术文档找到了数据库表和显示界面中各属性的对应关系.然后查看该更新的SQL语句发现,LR录制的SQL更新语句中使用了很多数据库字段为查询条件,除了使用唯一确定该条记录的ID外,还把被修改的字段也作为了查询条件,很明显这样第一次执行的时候是可以执行成功的.但再执行的时候由于该字段内容已经被更新,这样也就找不到以原来更新前的内容为查询条件的记录了. 删除WHERE语句中以被更新内容为条件的这个条件,再次运行LR迭代.脚本成功修改了被测系统的数据.这样所有错误都排除了.
当然之后就是按照客户要求对该系统进行了性能测试,这个过程没有遇到什么问题,就不多说了.

lingting 发表于 2009-6-19 12:08:12

谢谢,虽然不是很懂,但是好像很有用。

如果不用lrd_ora8_fetch函数,对程序的性能优影响吗?
页: [1]
查看完整版本: 谁用过oracle两层协议的性能测试,