51Testing软件测试论坛

标题: 在写FTP脚本中变量的问题 [打印本页]

作者: zenglei    时间: 2010-7-17 10:58
标题: 在写FTP脚本中变量的问题
大侠们好:
遇到一个问题,我是要从本地Windows客户端上上传数据到FTP端,并且覆盖原来数据,
注意,我希望是随机取Windows客户端的文件中5个文件之一(文件名为0,1,2,3,4),随机覆盖目标文件夹的目标文件(1000个之一,文件名位0,1,2,……999)。
所以这里取了两个随机函数取随机值;
int s,d;
s=rand()%5;
d=rand()%1000;
ftp_put_ex(&ftp_session,"Ftp_Put", "MSOURCE_PATH=d:/R710/data/%d", "TARGET_PATH=/000/%d",s,d,"MODE=BINARY", ENDITEM , LAST);

运行系统报错如下:
Virtual User Script started
Starting action vuser_init.
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(18): Debug message:Ftp Logon successful.
Action.c(24): Error: C interpreter run time error: Action.c (24):  Error -- memory violation : Exception ACCESS_VIOLATION received.
Action.c(24): Notify: CCI trace: Action.c(24): ftp_put_ex(0x02990020, 0x00b80236 "Ftp_Put", 0x00b80219 "MSOURCE_PATH=d:/R710/data/%d", 0x00b80205 "TARGET_PATH=/000/%d", 1, 169, 0x00b801f9 "MODE=BINARY", 0x00b801f1 "ENDITEM", 0x00b80243 "LAST")

.
Action.c(24): Notify: CCI trace: Compiled_code(0): Action()
.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.


请赐教,应该怎么解决这个问题。谢谢。
作者: 云层    时间: 2010-7-18 10:12
这个地方要写字符串吧,改成字符串试试,你最好把原来的代码格式也发一下
作者: msnshow    时间: 2010-7-18 18:42
关注!
作者: myallways    时间: 2010-7-19 08:49
标题: 没写过,学习中
没写过,学习中
作者: skyzhu    时间: 2010-7-19 10:57
文件名挂随机参数拼接
ftp_put_ex(&ftp, "Ftp_Put",
              "PATH=d:/R710/data/{filename5}",
"TARGET_PATH=/000/{filename1000}",
"MODE=ASCII",
              ENDITEM,
              LAST);

ftp_put应该也可以的,参数基本一样
作者: zenglei    时间: 2010-7-19 11:03
原帖由 云层 于 2010-7-18 10:12 发表
这个地方要写字符串吧,改成字符串试试,你最好把原来的代码格式也发一下


改成了字符串也不可以的。Action中代码如下:
Action()
{
     // Logon to the FTP server
unsigned long *ftp_session1=NULL;
//unsigned long *ftp_session2=NULL;
//unsigned long *ftp_session3=NULL;
//unsigned long *ftp_session4=NULL;
char source_dir[200];
char dest_dir[200];
char *directorys;
char *directoryd;
int s,d;

ftp_logon_ex(&ftp_session1,"FTP","URL=ftp://zl:zl@129.22.145.200",  LAST);
s=rand()%5;
d=(rand()%899)+100;
sprintf(source_dir,"%s%d", directorys,s);
sprintf(dest_dir,"%s", directoryd);
ftp_put_ex(&ftp_session1,"Ftp_Put", "SOURCE_PATH=d:/R710/data/%s", "TARGET_PATH=/0/000/000/%s",source_dir,dest_dir,"MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);   
// Logout from the FTP server      
ftp_logout_ex(&ftp_session1);      
return 0;
}


在ftp_put_ex中,"SOURCE_PATH=d:/R710/data/%s", "TARGET_PATH=/0/000/000/%s"是被双引号引用的,里面就是一串字符了,想在一串字符中插入变量应该是没问题哦。
就像sprintf(source_dir,"%s123456/%d", directorys,s);生成的source_dir是“directorys”123456“s”一样。
现在就是想要在其中加入变量,请教下怎么能让他识别呢?

作者: 云层    时间: 2010-7-19 11:38
5#的可能性大点,不是说sprintf可以带参数写法,ftp就能写
作者: zenglei    时间: 2010-7-19 11:55
原帖由 skyzhu 于 2010-7-19 10:57 发表
文件名挂随机参数拼接
ftp_put_ex(&ftp, "Ftp_Put",
              "PATH=d:/R710/data/{filename5}",
"TARGET_PATH=/000/{filename1000}",
"MODE=ASCII",
              ENDITEM,
              LAST);  ...




哥,说清楚点吧,我试了不行。不知道是不是照着你的意思做的。

对了,我的源文件和目标文件是随机生成的,文件名是源是{0,1,2,3,4}  目标文件夹{0,1,……999},我希望能随机取源{0,1,2,3,4}中任一个文件取覆盖目标文件夹{0,1,……999}中任一个文件。
作者: zenglei    时间: 2010-7-19 11:58
原帖由 云层 于 2010-7-19 11:38 发表
5#的可能性大点,不是说sprintf可以带参数写法,ftp就能写



是这个道理。
我也就只是试试了下,结果不得行滴。
作者: 云层    时间: 2010-7-19 12:03
那么你可以试试直接拼接Target_path整个字符串,一般就可以了
作者: zenglei    时间: 2010-7-19 14:03
原帖由 云层 于 2010-7-19 12:03 发表
那么你可以试试直接拼接Target_path整个字符串,一般就可以了

是可以的。

程序是:
unsigned long *ftp_session1=NULL;
char source_dir[200], S[250];
char dest_dir[200], D[250];
char *directorys="d:\\R710\\data\\";
char *directoryd="/0/000/000/";
int s,d;
char temps[60];
char tempd[60];
char x[10] , y[10];
ftp_logon_ex(&ftp_session1,"FTP","URL=ftp://zl:zl@129.22.145.200",  LAST);
s=rand()%5;
d=(rand()%899)+100;
    if (!itoa(s, temps, 10))
          lr_output_message("Cannot convert i to ascii char");
     else {
          //sprintf(source_dir,"%s", directorys);
          sprintf (source_dir, "%s%s", directorys, temps);
          lr_output_message("Source file name %s", source_dir);
     }
if (!itoa(d, tempd, 10))
          lr_output_message("Cannot convert i to ascii char");
     else {
          //sprintf(source_dir,"%s", directorys);
          sprintf (dest_dir, "%s%s", directoryd, tempd);
          lr_output_message("Dest file name %s", dest_dir);
     }
sprintf (S, "SOURCE_PATH=%s", source_dir);
sprintf (D, "TARGET_PATH=%s", dest_dir);
lr_output_message(source_dir);
lr_output_message(dest_dir);
ftp_put_ex(&ftp_session1,"Ftp_Put","%s",S, "%s",D,"MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);

[ 本帖最后由 zenglei 于 2010-7-19 15:17 编辑 ]
作者: skyzhu    时间: 2010-7-19 14:36
path 、 TARGET_PATH 都一定要指到 文件名为止,到文件夹会报错,帮助里面写错了,直接拷出来肯定报错

ftp_put_ex(&ftp, "Ftp_Put",
"PATH=d:/R710/data/{随机文件名5}",
"TARGET_PATH=/父目录/{随机目录1000}/{随机文件名5}",
"MODE=ASCII",
ENDITEM,
LAST);

[ 本帖最后由 skyzhu 于 2010-7-19 14:42 编辑 ]
作者: zenglei    时间: 2010-7-19 14:55
原帖由 skyzhu 于 2010-7-19 14:36 发表
path 、 TARGET_PATH 都一定要指到 文件名为止,到文件夹会报错,帮助里面写错了,直接拷出来肯定报错

ftp_put_ex(&ftp, "Ftp_Put",
"ATH=d:/R710/data/{随机文件名5}",
"TARGET_PATH=/父目录/{随机目录1000}/ ...


关键是ftp_put_ex识别不了,我的程序路径就指向到具体的文件的,程序是:
ftp_put_ex(&ftp_session1,"Ftp_Put", "SOURCE_PATH=d:/R710/data/{0,1,2,3,4}", "TARGET_PATH=/0/000/000/{000.0,001.0,002.0}","MODE=ASCII", ENDITEM ,LAST);

报错是:

Action.c(42): Debug messageutting file d:/R710/data/{0,1,2,3,4} in /0/000/000/{000.0,001.0,002.0}, passive mode set to 0
Action.c(42): Error -86026:Failed to open d:/R710/data/{0,1,2,3,4} for reading.
Action.c(42): Error -86027:Failed to put data: 226 File successfully transferred


作者: zenglei    时间: 2010-7-19 15:03
ftp_put_ex(&ftp_session1,"Ftp_Put", "SOURCE_PATH=d:/R710/data/test4", "TARGET_PATH=/0/000/000/000.0","MODE=ASCII", ENDITEM ,LAST);

SOURCE_PATH和TARGET_PATH中直接放具体某一文件的目录:
SOURCE_PATH=d:/R710/data/test4
TARGET_PATH=/0/000/000/000.0
是可以传输的。这是肯定的。
结果是:
Action.c(42): Debug messageutting file d:/R710/data/test4 in /0/000/000/000.0, passive mode set to 0
Action.c(42): Debug message:Ftp put of d:/R710/data/test4 finished successfully
Action.c(42): Debug message:Ftp Put ended successfully.
Action.c(79): Debug message:Ftp Session closed successfully.

现在我希望SOURCE_PATH和TARGET_PATH中不是指向某一具体文件,而是一个变量,这个变量是指随机的文件名。
作者: zenglei    时间: 2010-7-19 15:22
标题: 答谢贴
问题解决。
ftp_put_ex只能识别特定顺序的字符串参数PATH和TARGET_PATH,所以要把变量都转化位字符。
为以后的童鞋们能解决类似问题,特把正确的程序发出来,如下:
Action()
{
     // Logon to the FTP server
unsigned long *ftp_session1=NULL;
char source_dir[200], S[250];
char dest_dir[200], D[250];
char *directorys="d:\\R710\\data\\";
char *directoryd="/0/000/000/";
int s,d;
char temps[60];
char tempd[60];
char x[10] , y[10];
ftp_logon_ex(&ftp_session1,"FTP","URL=ftp://zl:zl@129.22.145.200",  LAST);
s=rand()%5;
d=(rand()%899)+100;

     if (!itoa(s, temps, 10))
          lr_output_message("Cannot convert i to ascii char");
     else {
          sprintf (source_dir, "%s%s", directorys, temps);
          lr_output_message("Source file name %s", source_dir);
     }
if (!itoa(d, tempd, 10))
          lr_output_message("Cannot convert i to ascii char");
     else {
          //sprintf(source_dir,"%s", directorys);
          sprintf (dest_dir, "%s%s", directoryd, tempd);
          lr_output_message("Dest file name %s", dest_dir);
     }
sprintf (S, "SOURCE_PATH=%s", source_dir);
sprintf (D, "TARGET_PATH=%s", dest_dir);
lr_output_message(source_dir);
lr_output_message(dest_dir);
ftp_put_ex(&ftp_session1,"Ftp_Put",S,D,"MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);
// Logout from the FTP server      
ftp_logout_ex(&ftp_session1);      
return 0;
}


感谢大家的帮助,把问题解决了,尤其感谢云层大叔,他的回复是正确的。谢谢。
作者: skyzhu    时间: 2010-7-19 16:24
额,看来楼主不太会用LR自带的参数。。。
写这么多用参数形式就一句话,呵呵
参数不是 {0,1,2,3,4} 这么用的。。。
作者: 云层    时间: 2010-7-19 16:56
额虽然没试过,不过大概明白你们两个在说啥了,

一个是用c语言解决
一个是用参数化解决
作者: zenglei    时间: 2010-7-19 17:24
原帖由 skyzhu 于 2010-7-19 16:24 发表
额,看来楼主不太会用LR自带的参数。。。
写这么多用参数形式就一句话,呵呵
参数不是 {0,1,2,3,4} 这么用的。。。



哈哈,楼主是菜鸟,接触LR才几天,关于你说的参数化{0,1,2,3,4},是怎么用的呢?
请赐教。
比如我向把&ftp_session也植入变量,应该怎么弄呢?
ftp_put_ex(&ftp_session1,"Ftp_Put",S,D,"MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);
谢啦,大侠

[ 本帖最后由 zenglei 于 2010-7-19 17:27 编辑 ]
作者: skyzhu    时间: 2010-7-19 18:04
原帖由 zenglei 于 2010-7-19 17:24 发表



哈哈,楼主是菜鸟,接触LR才几天,关于你说的参数化{0,1,2,3,4},是怎么用的呢?
请赐教。
比如我向把&ftp_session也植入变量,应该怎么弄呢?
ftp_put_ex(&ftp_session1,"Ftp_Put",S,D,"MODE=ASCII",  ...



ftp_logon_ex(&ftp_session1,"FTP","URL=ftp://zl:zl@129.22.145.200",  LAST);
ftp_put_ex(&ftp_session1,"Ftp_Put",
"PATH=d:\R710\data/{aaaa}",
"TARGET_PATH=/0/000/000/{bbbb}/{aaaa}",
"MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);
ftp_logout_ex(&ftp_session1);   

/0/000/000/  是服务器不变的父目录,不知道你这里是不是
点 param list, ctrl + L 新建 aaaa, bbbb 的参数,具体设置网上看看吧
aaaa 参数里面设置你要的文件名
bbbb 参数里面设置你要的文件夹名字

&ftp_session1能不能搞定不知道,试出来告诉你
作者: zenglei    时间: 2010-7-20 14:40
原帖由 skyzhu 于 2010-7-19 18:04 发表



ftp_logon_ex(&ftp_session1,"FTP","URL=ftp://zl:zl@129.22.145.200",  LAST);
ftp_put_ex(&ftp_session1,"Ftp_Put",
"PATH=d:\R710\data/{aaaa}",
"TARGET_PATH=/0/000/000/{bbbb}/{aaaa}",
"MODE=ASCI ...

对了,我研究了下参数化。发现只用一句话就搞定了。自己试了试ftpsession,没有弄出来。

ftp_put_ex(&ftp_session,"Ftp_Put","SOURCE_PATH=d:/R710/data/{NewParam}","TARGET_PATH=/0/000/000/{NewParam_1}.{NewParam_2}","MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);


你试出来了没?
作者: skyzhu    时间: 2010-7-20 16:10
标题: 回复 20# 的帖子
还是放弃&ftp_session的参数化吧,反正这个没有影响
就算真弄出来了,内存地址也不是随便可以乱来的
作者: zenglei    时间: 2010-7-21 09:00
原帖由 skyzhu 于 2010-7-20 16:10 发表
还是放弃&ftp_session的参数化吧,反正这个没有影响
就算真弄出来了,内存地址也不是随便可以乱来的



我已经放弃了,要做99个Session并发,看来只能是一个一个添加99个session了。
作者: skyzhu    时间: 2010-7-21 10:29
标题: 回复 22# 的帖子
并发不用写不一样的吧? &ftp这个只是globals里 FTP ftp;分配的一个初始内存地址。。。每个user实际的内存地址不会出来一样的
作者: ibossyu    时间: 2011-7-20 19:14
我已经放弃了,要做99个Session并发,看来只能是一个一个添加99个session了。
zenglei 发表于 2010-7-21 09:00


&ftp_Session, 如果多用户并发的话,会报错哦。
是否只有100个用户的话,搞一百个sesion哦?




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2