LoadRunner中常用的字符串操作函数
LoadRunner中常用的字符串操作函数有:
strcpy(destination_string, source_string);
strcat(string_that_gets_appended, string_that_is_appended);51Testing软件测试网:J3~c:c[(wR%A2l
atoi(string_to_convert_to_int); //returns the integer value
itoa(integer_to_conver_to_string, destination_string, base); // base is 10
strcmp(string1, string2); // returns 0 if both strings are equal51Testing软件测试网q%USEK
对各函数的定义:
strcpy( ):拷贝一个字符串到另一个字符串中.
strcat( ):添加一个字符串到另一个字符串的末尾。
strcmp( ):比较两个字符串,如果相等返回0。
atoi():转换一个ASCII字符串为一个整型。
itoa():根据给定的进制,转换一个整型数据为ASCII字符串51Testing软件测试网D&VI2KD|
下面的例子使用了上面这些函数:
Actions() { char MyString1[] = ""; char MyString2[] = ""; char MyString3[] = "Mercury2"; char Cstring[] = ""; int Cint; // MyString1 is empty // lr_output_message(">>>>>>>>>> MyString1 = %s",MyString1); // copy "Mercury1" into MyString1 // strcpy(MyString1,"Mercury1"); // Now MyString1 contains "Mercury1" // lr_output_message(">>>>>>>>>> MyString1 = %s",MyString1); // Copy MyString3 into MyString2 // lr_output_message(">>>>>>>>>> MyString2 = %s",MyString2); strcpy(MyString2,MyString3); lr_output_message(">>>>>>>>>> MyString2 = %s",MyString2); // Catenate MyString2 to MyString1 // strcat(MyString1,MyString2); lr_output_message(">>>>>>>>>> MyString1 = %s",MyString1); // Cstring is converted to integer Cint // lr_output_message(">>>>>>>>>> Cstring = %s",Cstring); Cint = atoi(Cstring); lr_output_message(">>>>>>>>>> Cint = %d",Cint); // Cint is converted to string Cint = ; itoa(Cint,Cstring,); lr_output_message(">>>>>>>>>> Cstring = %s",Cstring); return ; }
LoadRunner字符串比较的常见错误 最近在论坛上看到有人提问LoadRunner如何对两个字符串进行比较,其脚本中两个字符串进行比较结果总是不一样的。我把问题整理了一下以便注意这个容易被忽略的错误。
脚本如下:
...
lr_save_string( "Hello World!","string1" );
lr_save_string( "Hello World!","string2" );
result = strcmp("string1","string2");
if ( result == 0 )
{
lr_output_message("the result is 0.");
}
else
{
lr_output_message("the result is not 0.");
}
大家可以看出脚本那里错了吗?
问题错在result = strcmp("string1","string2");这个上,这样变成了对字符串"string1"和"string2"的比较,而不是对变量的值进行比较,因此比较结果肯定是不一样的。 正确的写法有两种:
result = strcmp(&string1,&string2);
result = strcmp(lr_eval_string("{string1}"),lr_eval_string("{string2}"));
Loadrunner的字符串处理函数 1)strcat编辑本段回目录 char *strcat ( char *to, const char *from );
功能:链接两个字符串。 例子:
这个例子是用strcat链接字符串:Cheers_Lee和 @hotmail.com 脚本如下:
char test[1024], *a = "@hotmail.com";
strcpy(test, "Cheers_Lee");
strcat(test, a);
lr_output_message("We can see %s",test); 运行后在executon log中看到如下语句:
Starting action Action.
Action.c(16): We can see Cheers_Lee@hotmail.com 2)strchr编辑本段回目录 char *strchr ( const char *string, int c );
功能:返回字符串中指定字符后面的字符串。 例子:
这个例子是返回第一个出现e字符以后所有的字符,和最后一次出现e字符以后所有的字符。 脚本如下:
char *string = "Cheers is a tester";
char *first_e, *last_e;
first_e = (char *)strchr(string, 'e');
lr_output_message("We can see the first occurrence of e: %s",first_e);
last_e = (char *)strrchr(string, 'e');
lr_output_message("We can see the last occurrence of e: %s", last_e); 运行后在executon log中看到如下语句: Starting action Action.
Action.c(12): We can see the first occurrence of e: eers is a tester
Action.c(14): We can see the last occurrence of e: er 3)Strcmp&stricmp编辑本段回目录 int strcmp ( const char *string1, const char *string2 );大小写敏感。
int stricmp ( const char *string1, const char *string2 );大小写不敏感。
功能:比较字符串。 例子:
按是否区分大小写对比两个字符串,并打印出它们的大小关系。 脚本如下:
int result;
char tmp[20];
char string1[] = "We can see the string:Cheers";
char string2[] = "We can see the string:cheers";
result = strcmp( string1, string2 );
if( result > 0 )
strcpy( tmp, "大于" );
else if( result < 0 )
strcpy( tmp, "小于" );
else
strcpy( tmp, "等于" );
lr_output_message( "strcmp: String 1 %s string 2", tmp );
result = stricmp( string1, string2 );
if( result > 0 )
strcpy( tmp, "大于" );
else if( result < 0 )
strcpy( tmp, "小于" );
else
strcpy( tmp, "等于" );
lr_output_message( "stricmp: String 1 %s string 2", tmp ); 运行后在executon log中看到如下语句: Starting action Action.
Action.c(22): strcmp: String 1 小于 string 2
Action.c(33): stricmp: String 1 等于 string 2 4)strcpy编辑本段回目录 char *strcpy ( char *dest, const char *source );
功能:复制一个字符串到另一个字符串中。 例子:
复制一个字符串到字符数组中,并打印出来。 脚本如下:
char test[1024];
strcpy(test, "what can we see?");
lr_output_message("%s", test); 运行后在executon log中看到如下语句: Starting action Action.
Action.c(10): what can we see? 5)Strdup& strlwr编辑本段回目录 char *strdup ( const char *string );
功能:复制一个字符串。
char *strlwr ( char *string );
功能:转换成小写字母。 例子:
在这个例子中,Vuser的组名被转换为小写字母。但是lr_whoami把组名作为静态buffer返回。这样的buffer不能被操作。如果有操作需要,就复制这个静态buffer。 脚本如下:
int id;
char *groupname_static, *groupname;
lr_whoami(&id, &groupname_static, NULL);
lr_output_message("groupname=%s", groupname_static);
groupname = (char *)strdup(groupname_static);
groupname = (char *)strlwr(groupname);
lr_output_message("lower case groupname=%s", groupname);
free(groupname); 上述脚本用vugen保存为:CHANGE
在controller中运行(设置为总是发送消息)
运行后在log中看到如下语句:
Starting action Action. [MsgId: MMSG-15919]
Action.c(11): groupname=CHANGE [MsgId: MMSG-17999]
Action.c(16): lower case groupname=change [MsgId: MMSG-17999] 6)Strlen编辑本段回目录 size_t strlen ( const char *string );
功能:返回字符串长度(bytes). 例子:
这个例子很简单,就是得到一个字符串中的字符的个数。然后打印出来。 脚本如下:
Starting action Action. [MsgId: MMSG-15919]
Action.c(11): groupname=CHANGE [MsgId: MMSG-17999]
Action.c(16): lower case groupname=change [MsgId: MMSG-17999] 运行后在log中看到如下语句: Action.c(13): The sentence has 18 letters 7)Strncat编辑本段回目录 char *strncat ( char *to_string, const char *from_string, size_t n );
功能:把一个字符串连接到另一个字符串后面。 例子:
在这里,我随便写了两个字符串,用此函数把他们连接起来,并打印出来。 脚本如下:
char str1[]="Cheers is ";
char str2[]="a tester.";
lr_output_message("What can we see?");
lr_output_message("The str1 is %s.",str1);
strncat(str1,str2,20);
lr_output_message("The str1 is %s.",str1); 运行后在log中看到如下语句: Action.c(9): What can we see?
Action.c(10): The str1 is Cheers is .
Action.c(13): The str1 is Cheers is a tester.. 注:我们可以看到,没有连接前的str1是:Cheers is,连接后的字符串是:Zee is a tester。也可以看看strcat函数。 8)strncmp编辑本段回目录 int strncmp ( const char *string1, const char *string2, size_t n );
功能:对比两个字符串的前n位。 例子:
对比两个字符串,并把对比结果打印出来。这里我和上面的strcmp一起写。 脚本如下:
char result;
char str1[]="Cheers is a tester.";
char str2[]="Cheers is a tester.";
char str3[]="Cheers is a tester?";
result = strcmp(str1,str2);
if(result > 0)
lr_output_message("str1 is greater than str2.");
else if(result < 0)
lr_output_message("str1 is less than str2.");
else
lr_output_message("str1 is equal to str2.");
result = strncmp( str1, str3 , 30);
if(result > 0)
lr_output_message("str1 is greater than str3.");
else if(result < 0)
lr_output_message("str1 is less than str3.");
else
lr_output_message("str1 is equal to str3."); 运行后在log中看到如下语句:
Starting iteration 1.
Starting action Action.
Action.c(18): str1 is equal to str2.
Action.c(28): str1 is less than str3.
loadrunner比较有用的字符串函数 strcat的串连两个字串。 strchr返回指向第一次出现的字符串中的字符。 STRCMP比较两个字符串来确定的字母顺序。 STRCPY一个字符串复制到另一个地方。 strdup重复一个字符串。 stricmp执行区分大小写的比较两个字符串。 strlen的返回一个字符串的长度。 strlwr将字符串转换为小写。 strncat函数串连?从一个字符串到另一个字符。 STRNCMP比较两个字符串的前n个字符。 strncpy一个字符串的前n个字符复制到另一个地方。 strnicmp执行区分大小写的比较n个字符串。 strrchr查找的字符串中的字符的最后一次出现。 strset一个特定的字符填充一个字符串。 strspn返回一个指定的字符串中包含的字符串中的前导字符的长度。 strstr返回一个字符串第一次出现在另一个
把字符看成ASII的值 , 和数字比较大小一般,
if( strcmp(A,B) > 0 ) 串A > 串B
if( strcmp(A,B) == 0 ) 相同的串
if(strcmp(A,B) < 0 ) 串A < 串B
int strcmp(char *str1, char *str2);
比较字符串str1和str2是否相同。如果相同则返回0;
如果不同,在不同的字符处如果str1的字符大于str2的字符,则返回1,否则返回-1
比如:
char a[]="abcd";
char *b="abcd";
char *d="abcde";
int d=strcmp(a,b); //那么d的值是0
d=strcmp(b,d); //d的值是-1 因为 '\0' 比'e' 小
d=strcmp(d,b); //d的值是1,因为 'e' 比'\0'大
{
break;
}
LR中常用的C函数
char test[1024], *a = "slo@hotmail.com";
strcpy(test, "zee");
strcat(test, a);
lr_output_message("We can see %s",test);
|
Starting action Action.
Action.c(16): We can see zeeslo@hotmail.com
|
char *string = "Zee is a tester";
char *first_e, *last_e;
first_e = (char *)strchr(string, 'e');
lr_output_message("We can see the first occurrence of e: %s",first_e);
last_e = (char *)strrchr(string, 'e');
lr_output_message("We can see the last occurrence of e: %s", last_e);
|
Starting action Action.
Action.c(12): We can see the first occurrence of e: ee is a tester
Action.c(14): We can see the last occurrence of e: er
|
int result;
char tmp[20];
char string1[] = "We can see the string:ZEE";
char string2[] = "We can see the string:zee";
result = strcmp( string1, string2 ); /*区分大小写,比较字符串 */
if( result > 0 )
strcpy( tmp, "大于" );
else if( result < 0 )
strcpy( tmp, "小于" );
else
strcpy( tmp, "等于" );
lr_output_message( "strcmp: String 1 %s string 2", tmp );
result = stricmp( string1, string2 ); /* 不区分大小写,比较字符串 */
if( result > 0 )
strcpy( tmp, "大于" );
else if( result < 0 )
strcpy( tmp, "小于" );
else
strcpy( tmp, "等于" );
lr_output_message( "stricmp: String 1 %s string 2", tmp );
|
Starting action Action.
Action.c(22): strcmp: String 1 小于 string 2
Action.c(33): stricmp: String 1 等于 string 2
|
char test[1024];
strcpy(test, "what can we see? ");
lr_output_message("%s", test);
|
Starting action Action.
Action.c(10): what can we see?
|
int id;
char *groupname_static, *groupname;
/* 从VuGen中得到组名 */
lr_whoami(&id, &groupname_static, NULL);
lr_output_message("groupname=%s", groupname_static);
/*复制这个静态组名以便我们可以操作它 */
groupname = (char *)strdup(groupname_static);
groupname = (char *)strlwr(groupname);
lr_output_message("lower case groupname=%s", groupname);
free(groupname);
|
Starting action Action. [MsgId: MMSG-15919]
Action.c(11): groupname=CHANGE [MsgId: MMSG-17999]
Action.c(16): lower case groupname=change [MsgId: MMSG-17999]
|
char *str = "Zee is a tester";
unsigned int len;
len = strlen(str);
lr_output_message("The sentence has %d letters",len);
|
Action.c(13): The sentence has 15 letters
|
char str1[]="Zee is ";
char str2[]="a tester.";
lr_output_message("What can we see?");
lr_output_message("The str1 is %s.",str1);
strncat(str1,str2,20);
lr_output_message("The str1 is %s.",str1);
|
Action.c(9): What can we see?
Action.c(10): The str1 is Zee is .
Action.c(13): The str1 is Zee is a tester..
|
char result;
char str1[]="Zee is a tester.";
char str2[]="Zee is a tester.";
char str3[]="zee is a tester?";
result = strcmp(str1,str2);
if(result > 0)
lr_output_message("str1 is greater than str2.");
else if(result < 0)
lr_output_message("str1 is less than str2.");
else
lr_output_message("str1 is equal to str2.");
result = strncmp( str1, str3 , 30);
if(result > 0)
lr_output_message("str1 is greater than str3.");
else if(result < 0)
lr_output_message("str1 is less than str3.");
else
lr_output_message("str1 is equal to str3.");
|
Starting iteration 1.
Starting action Action.
Action.c(18): str1 is equal to str2.
Action.c(28): str1 is less than str3.
|
字符串判断用strcmp
请一下判断lr_eval_string("{test}")是否为空怎么写呢?
一样的,你定义一个空值字符串,然后用取到的值进行比较。
char * mystr=" ";
char *str="";
int result;
result=strcmp(mystr,str);
lr_output_message("result is %d",result);
前边已经发了不少关于Loadrunner中脚本编写的文章,现在发一个帖子,作为Loadrunner中C脚本编写一些该注意问题的帖子,作为对脚本编写知识的进一步巩固。
1.全局变量和局部变量
vuser_init() { //Allocates a block of memory. char * p = (char * )malloc(1000 * sizeof(char)); return ; } ------------------------------------------ Action() { return ; } ------------------------------------------ vuser_end() { //Frees a block of memory. free(p); return ; } |
如上脚本所示:
最初的思路是在 vuser_init中定义指针p,并为其malloc函数申请1000个字节的内存空间,为了避免内存泄露,用户试图在vuser_end中释放p指向的内存空间,但free(p),由于变量p是在vuser_init中定义的,其作用域仅局限于vuser_init,离开了vuser_init,在vuser_end编译是会报错“p变量未被定义”。
这样我们的问题就产生了,那如何在vuser_init()、Action()、vuser_end()中使用全局变量呢?
这里我们就要用到全局变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。
在Loadrunner的HTTP协议录制的web系统时,会生成一个globals.h文件,在这里定义的变量相当于;Loadrunner脚本的全局变量,可以在vuser_init()、Action()、vuser_end()中被使用。
在globals.h文件中,添加全局变量的方法如下:
#ifndef _GLOBALS_H #define _GLOBALS_H //-------------------------------------------------------------------- // Include Files #include "lrun.h" #include "web_api.h" #include "lrw_custom_body.h" //-------------------------------------------------------------------- // Global Variables 包含全局变量 char * p; #endif // _GLOBALS_H |
注意:红色部分为添加的全局变量的位置;
然后,执行脚本,脚本就可以通过了,呵呵!
2.lr_whoami() 使用的一点说明;
说明:lr_whoami()在VU中运行返回的值是:-1
举例:
Action() { int id, scid; char *vuser_group; lr_whoami(&id, &vuser_group, &scid); lr_message( "Group: %s, vuser id: %d, scenario id %d", vuser_group, id, scid); return 0; } |
执行脚本结果如下:
Virtual User Script started Starting action vuser_init. Web Turbo Replay of LoadRunner 9.0.0 for WINXP; WebReplay82 build 5727 [MsgId: MMSG-27143] Run-Time Settings file: "C:\Documents and Settings\Administrator\Local Settings\Temp\noname3\\default.cfg" [MsgId: MMSG-27141] Ending action vuser_init. Running Vuser... Starting iteration 1. Starting action Action. Group: None, vuser id: -1, scenario id 0 Ending action Action. Ending iteration 1. Ending Vuser... Starting action vuser_end. Ending action vuser_end. Vuser Terminated.
这里需要说明的是:lr_whoami()在VU中运行返回的值是:-1(见结果绿色部分显示),只有在conctroller中多用户并发的时候才会输出正确的值。
3.多个action()逻辑排序。
比如说,我们的一个脚本中有多个action,我们想改变执行顺序,我们可以这样来操作。
在VU菜单栏,Vuser - Run-Time Settings...- Run Logic中,通过 move up 、move down 改变action()执行的顺序。
4.Loadrunner中检查点判断执行那些操作;
web_reg_find("Text=ABC", "SaveCount=abc_count", LAST);
web_url("Step", "URL=...", LAST); if (strcmp(lr_eval_string("{abc_count}"), "0") == 0) Action A else Action B |
5.利用数组做冒泡排序法例子
Action() { int a[]={,,,,}; int i; int j; int temp; for (i=;i<;i++) for (j=i+1;j<;j++) if (a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } for (i=;i<;i++) { lr_message("%d",a[i]); } return ; } |
脚本:
vuser_init()
{
int result;
char string1;
char string2;
lr_save_string( "We can see the string:zee","string1" );
lr_save_string( "We can see the string:zee","string2" );
lr_output_message("the string1 is %s.",lr_eval_string("{string1}"));
lr_output_message("the string2 is %s.",lr_eval_string("{string2}"));
result = strcmp(lr_eval_string("{string1}"),lr_eval_string("{string1}"));
if ( result == 0 )
{
lr_output_message("the result is 0.");
}
else
{
lr_output_message("the result is not 0.");
}
return 0;
}
结果:
Starting action vuser_init.
Web Turbo Replay of LoadRunner 8.1.0 for WINXP; Web build 4788 [MsgId: MMSG-27143]
Run-Time Settings file: "C:\Documents and Settings\Zee\Local Settings\Temp\noname26\\default.cfg" [MsgId: MMSG-27141]
vuser_init.c(10): the string1 is We can see the string:zee.
vuser_init.c(11): the string2 is We can see the string:zee.
vuser_init.c(16): the result is 0.
Ending action vuser_init.
Running Vuser...
LoadRunner中常用的字符串操作函数的更多相关文章
- PHP开发中常用的字符串操作函数
1,拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行 ...
- C语言中常用的字符串操作函数
程序开头要声明 #include <string.h> 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char ...
- JavaScript中常见的字符串操作函数及用法
JavaScript中常见的字符串操作函数及用法 最近几次参加前端实习生招聘的笔试,发现很多笔试题都会考到字符串的处理,比方说去哪儿网笔试题.淘宝的笔试题等.如果你经常参加笔试或者也是一个过来人,相信 ...
- php中常用的字符串查找函数strstr()、strpos()实例解释
string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] ) 1.$haystack被查找的字 ...
- PHP中常用的字符串格式化函数总结
注意:在PHP中提供的字符串函数处理的字符串,大部分都不是在原字符串上修改,而是返回一个格式化后的新字符串. 一.取出空格和字符串填补函数 空格也是一个有效的字符,在字符串中也会占据一个位置.用户在表 ...
- C语言中常用的字符串处理函数总结
C语言中字符串处理函数备注 此文仅用于自己研究和记录 字符串处理函数 1. char *gets(char *s); #include<stdio.h> 功能: 从标准输入读入字符,并保存 ...
- matlab常用的字符串操作函数之一
1,strcat和strvcat strcat:依次横向连接字符串: strvcat:依次纵向连接字符串: 实例1: >>a1='sophia '; >>a2='is a '; ...
- ASP.NET中常用的字符串分割函数
asp.net字符串分割函数用法 先来看个简单的实例 但是其数组长度却是25,而不是3.下面这种方法是先将“[111cn.net]”替换成一个特殊字符,比如$,在根据这个字符执行Split 例如下面我 ...
- SQL中常用的字符串LEFT函数和RIGHT函数详解!
今天继续整理日常可能经常遇到的一些处理字符串的函数,记得点赞收藏!以备不时之需!看到最后有惊喜! LEFT(expression, length)函数 解析:从提供的字符串的左侧开始提取给定长度的字符 ...
随机推荐
- python访问需要登录的网页
有些网页需要你登录之后才可以访问,你需要提供账户和密码. 只要在发送http请求时,带上含有正常登陆的cookie就可以了. 1.首先我们要先了解cookie的工作原理. Cookie是由服务器端生成 ...
- 微信小程序传值
方式一:通过设置id方式传值 <button class="btninvest" bindtap="goinvet" id="{{item.tx ...
- [DeeplearningAI笔记]卷积神经网络1.9-1.11池化层/卷积神经网络示例/优点
4.1卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.9池化层 优点 池化层可以缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性. 池化层操作 池化操作与卷积操作类似 ...
- libuv移植到ios
libuv官网只提供了os x的编译方法,没有IOS的.既然os x和ios的系统内核差不多,并且编译工具都是xcode,那我们只要重新指定cpu架构,就可以编译出ios版的了. 1.安装python ...
- nginx 与 tomcat 组合搭建web服务
部分内容转自 http://www.cnblogs.com/naaoveGIS/ 1. Web服务 nginx是常用的web服务器,用于获取静态资源,类似的服务器还有apache. tomcat是基于 ...
- 边双连通缩点+树dp 2015 ACM Arabella Collegiate Programming Contest的Gym - 100676H
http://codeforces.com/gym/100676/attachments 题目大意: 有n个城市,有m条路,每条路都有边长,如果某几个城市的路能组成一个环,那么在环中的这些城市就有传送 ...
- Shiro实战教程(一)
Shiro完整架构图 Shiro认证过程 Shiro授权的内部处理机制 Shiro 支持三种方式的授权 1.编程式:通过写if/else 授权代码块完成: Subject subject = Secu ...
- 【Nginx】修改响应头,根据不同请求IP重定向到不同IP
背景: 使用CAS登录的过程中会涉及到三次重定向,如果在同一个局域网内,是没有任何问题的,但如果涉及到跨网访问,这个问题就比较蛋疼了. 解决思路: 通过Nginx对要访问的系统进行代理,根据请求IP来 ...
- 使用 WebSockets 技术的 9 个应用场景
没有其他技术能够像WebSocket一样提供真正的双向通信,许多web开发者仍然是依赖于ajax的长轮询来实现.对Websocket缺少热情,也许是因为多年前他的安全性的脆弱,抑或者是缺少浏览器的支持 ...
- 12款jQuery幻灯片插件和幻灯片特效教程
jQuery 使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入一些非常好的效果.滑块和幻灯片效果是常用的内容展示方式之一,这是一种在有限的网页空间内展示系列项目时非常好的方法.今 ...