用loadrunner编写tuxedo脚本,使用 lrt_Fname32()报错
本帖最后由 ares444 于 2013-1-25 12:17 编辑各位,最近由于工作需要,要测试一个C/S架构的系统性能。要编写tuxedo的性能测试脚本。采用的FML32格式。
本来,我准备使用录制回放的方式来搞定脚本,但是很不幸,客户端是在unix上的,无法直接使用loadrunner进行录制。我在网上也找了个方案《多机代理方式录制》,但是没有能够成功。
于是,我想试着手工编写tuxedo脚本。【第一步】:我定义了一个front.fml32,内容如下:
#name rel_number typeflags comments
*base 2000
CHANNELID 1 string- channel id
MSGTYPE 2 long - message type
MESSAGE 3 carray- transaction message
SNODEID 4 string- send node
RNODEID 5 string- recv node
【第二步】:
编译生成对应的*.h文件,front.fml32.h如下:
/*
fname
fldid */
/*
-----
----- */
#define
CHANNELID
((FLDID32)167774161)
/* number: 2001
type: string */
#define
MSGTYPE
((FLDID32)33556434)
/* number: 2002
type: long */
#define
MESSAGE
((FLDID32)201328595)
/* number: 2003
type: carray */
#define
SNODEID
((FLDID32)167774164)
/* number: 2004
type: string */
#define
RNODEID
((FLDID32)167774165)
/* number: 2005
type: string */
【第三步】:编写脚本,这里卡住了。
在编写脚本中我发现了个问题,脚本好像根本就没有读我的fml32描述文件“front.fml32”,我做了个试验,代码如下:
action.c:
#include "lrt.h"#include "front.fml32.h"
//我把front.fml32.h放到的了loadrunner的include目录
Action()
{
/*****************************************************************************
设定环境变量,其中FLDTBLDIR32用于指定fml文件存放路径,FIELDTBLS32指定FML文件名称。
/*****************************************************************************/
static char *env_allow_array[] = {
"WSNADDR=",
"FLDTBLDIR32=",
"FIELDTBLS32=",
NULL
};
lrt_set_env_list(env_allow_array);
lrt_tuxputenv("WSNADDR=//192.168.21.1:15010");
lrt_tuxputenv("FLDTBLDIR32=E:\bea\tuxedo8.1\etc"); //我把front.fml32放在了这个目录
lrt_tuxputenv("FIELDTBLS32=front.fml32");
lrt_abort_on_error();
lr_output_message("name is %s", lrt_Fname32(33556434));
lr_output_message("id is %d", lrt_Fldid32("CHANNELID"));
rc = lrt_getFerror32();
lr_output_message("error code is %d", rc);
lr_output_message("error message is %s", lrt_Fstrerror(rc));
return 0;
}
预期输出:name is MSGTYPE
id is 167774161
实际报错:
Action.c(10): lrt_Fname32
Action.c(10): fieldid = 33556434
Action.c(10): Fname = (null)
Action.c(10): 错误: lrt_Fname:
Action.c(10): name is (null)
Action.c(11): lrt_Fldid32
Action.c(11): name = "CHANNELID"
Action.c(11): Fldid = 0
Action.c(11): 错误: lrt_Fldid32:
Action.c(11): id is 0
Action.c(14): lrt_getFerror32()
Action.c(14): getFerror32 = 11
Action.c(16): error code is 11
Action.c(18): lrt_Fstrerror
Action.c(18): err = 11
Action.c(18): Ferror = LIBFML_CAT:11: ERROR: Cannot find or open field table
Action.c(18): 确定
Action.c(18): error message is LIBFML_CAT:11: ERROR: Cannot find or open field table
请问,这个是什么原因啊?我在网上找了半天,没找到原因。。。。请赐教。。这个问题解决以后,我在继续往下摸索。。解决不了再继续请假
如果写成这样:
lr_output_message("name is %s", lrt_Fname(33556434));
返回结果是:
Action.c(10): lrt_Fname
Action.c(10): fieldid = 2002
Action.c(10): Fname = (null)
这就证明了,应该是能读到我的头文件front.fml32.h了。
有朋友说,是没有读到front.fml32。我觉得也是,但是哪里写错了呢? lr应用要把.h文件丢到脚本目录下或者lr自己的Include目录下吧?个人猜测 回复 3# 云层
我丢到LR的include下面去了。
刚重点研究了下那行报错。
在tuxedo的官方文档中看到这行报错的解释:
ERROR: Cannot find or open field table
Description:When processing the field tables, one of the field tables was not found.
Action:Check that the environment variables are set correctly for the field table files and that the files have read permission.
意思是说我环境变量没设置或者没有可读权限,但是我在windows的环境变量里设置了啊。。。 自己顶一下。。。。谁能帮帮忙 汗,这个问题解决了。。。
估计是环境变量的问题。我多设置几次,重新生成了几次frontfml,然后居然好了。。
下面还有个问题就是怎么将报文加解密了~!
嘿嘿。好高兴 恭喜恭喜,具体问题还是得靠你自己解决啊 回复 7# 云层
呵呵,谢谢。。
现在在研究如何将报文通过安全节点加密后发出去呢。
遇到问题还是得多和人交流,可能马上就会有茅塞顿开的感觉出现 fml32格式的报文连上服务后,通过
lrt_Fadd32_fld((FBFR32*)sSendBuf //就可以根据id来发送
lrt_save32_fld_val((FBFR32*)sRecvBuf //可以抓取返回字段验证是否成功。
页:
[1]