转载请注明:http://w ww.7dtest.com
参考:LR帮助手册。
1RTE协议概述
RTE Vuser将字符输入键入到终端仿真器中,将数据提交到服务器,然后等待服
务器响应。例如,假设你有一台用于维护某个维修公司的客户信息的服务器。现
场服务代表每次修改数据时,都通过调制解调器使用终端仿真器来访问服务器数
据库。服务代表访问有关客户的信息,然后记录他执行的修理操作的详细信息。
你可以使用RTE Vuser来模拟这种情况。
2RTE支持的环境
RTE Vuser可以模拟实际用户的操作。实际用户使用终端或终端仿真器来操作应用程序。
在RTE Vuser环境中,由Vuser来替代实际用户。Vuser将操作终端仿真器PowerTerm。
PowerTerm与标准的终端仿真器工作方式相同,它支持常用协议,例如IBM 3270、IBM 5250、VT100和VT220。
3RTE录制过程
在这个例子中,我以IBM的3270为例。
- 打开VuGen,点击新建,选择RTE协议。
- 在RTE窗口中点击Start Record。出现如下界面:
- 点击,Teminal->Setup,出现如下界面,选择需求模拟的终端。
- 点击General,配置Code Page,如下:
注:如果需要模拟的终端中有中文并且默认的配置会导致乱码,这一步是必须要配置的。
- 点击录制工具条上的recording option,如下:
- 配置Character Set,如下图:
ANSI为单字节,DBCS为双字节。如果应用中有中文,此项也是必须修改的。
- 点击Communication->Connect,如下图:
- 配置相应的Host Name(Server IP)/PortNumber,等,点击Connect。如下图:
接下来就是在打开的Power Term中输入业务操作即可。
- 录出的脚本如下:
/* *** The terminal type is 3270 Display. */ TE_connect( “comm-type = tn3270;” “host-name = IP;” “telnet-port = Port;” “use-tn3270e-protocol = true;” “security-type = unsecured;” “terminal-type = 3270 display;” “terminal-model = 3278-2-e (24×80);” , 60000); if (TE_errno != TE_SUCCESS) return -1; TE_wait_sync(); TE_wait_sync_transaction(”syncTrans1″); /*Enter Your Userid:*/ TE_wait_cursor(15, 3, 100, 90); lr_think_time(7); TE_type(”CICSP1<kEnter>”); TE_wait_sync(); TE_wait_sync_transaction(”syncTrans2″); /*DATE: 2009/06/19 */ lr_think_time(2); TE_type(”GIT011<kTab>”); TE_type(”A<kEnter>”); TE_wait_sync(); TE_wait_sync_transaction(”syncTrans3″); /* SSSN TEST1338SIGN-OFF COMPLETE…*/ lr_think_time(3); TE_type(”SSSS<kBack>N<kEnter>”); TE_wait_sync(); TE_wait_sync_transaction(”syncTrans4″); /*SSSN ()SEMA GROUP ASIA PACIFICPAGE 01 OF 012009170 */ lr_think_time(4); TE_type(”{PCPCUser}<kTab>”); lr_think_time(2); TE_type(”BBBBBB<kEnter>”); TE_wait_sync(); TE_wait_sync_transaction(”syncTrans5″); /* PCPC TEST0901SIGN-ON COMPLETE…*/ lr_think_time(3); TE_type(”PCPC<kEnter>”); TE_wait_sync(); TE_wait_sync_transaction(”syncTrans6″); /*PCPC ()SG CARDLINKPAGE 00 OF 012009170 */ lr_think_time(25); TE_type(”{CardNo}”); lr_think_time(2); TE_type(”<kEnter>”); TE_wait_sync(); TE_wait_sync_transaction(”syncTrans7″); TE_wait_text (”01″,10,63,1,64,1); /*PCPC ()SG CARDLINKPAGE 01 OF 012009170 */ lr_think_time(4); TE_type(”X”); TE_type(”<kEnter>”); TE_wait_sync(); TE_wait_sync_transaction(”syncTrans8″); TE_wait_text (”01″,10,63,1,64,1); /*PCPC ( PCPC )SG CARDLINKPAGE 012009170*/ lr_think_time(5); TE_type(”PCPC”); TE_type(”<kEnter>”); |
4RTE脚本编辑和场景运行
4.1参数化
由于脚本全是明文,所以数据参数化很容易做。和其他协议参数化步骤一样,这里不再详述。
4.2关联
并且RTE是对Power Term的界面操作,所以不需要做关联。如果我们希望得到返回屏幕上的某个值,可以使用TE_get_text_line函数。后面,我们会说明这些函数。
4.3事务
3270的RTE协议中事务不需要手工添加。
选择Recording Options里的Generate automatic X-System Transactions(IBM only)即可在3270的脚本中自动生成事务。如下:
生成函数如下:
TE_wait_sync_transaction(”syncTrans1″); |
4.4集合点
RTE协议中不能添加集合点,也不需要添加集合点。
4.5场景运行
- 首先要配置启用RTE vuser。如下图:
注:这里一定要选中。
- 配置run-time settings。General和一般的协议一样。这里的RTE选项卡,如有必要可以修改。
场景中其他的,都按业务需求配置即可,无特别配置。
5RTE相关的函数
RTE的函数分为:连接函数、文本检索函数、游标函数、系统变量函数、错误处理函数、输入函数、同步函数。
下面来一步步说明这些函数的用处。
5.1连接函数
int TE_connect ( const char *com_string, unsigned int timeout );
此函数是在录制过程中生成的,如果第一次连接没有成功,它会重新经常连几次,重连次数可以在Run Time Settings里设置。录制过程中会生成:连接类型、主机IP、端口、协议、安全类型、终端类型、终端模式等。详细的录制过程会记录在output.txt文件中。
特别要注意的是:
1.TE_connect必须是录制的。不能手写或者复制进来。
2.一个脚本中不能有多个TE_connect函数。所以这个函数必须要录制到init中去。
5.2文本检索函数
5.2.1TE_find_text
int TE_find_text ( const char *pattern, int col1, int row1, int col2, int row2, int *retcol, int *retrow, char *match );
在这个函数中要设置行列的值。如果不需要对比值,可以指定为空。此函数在指定的区域搜索文本,并返回match或mismatch给最后一个参数,返回精确的行列值给*retcol和*retrow。
对一个屏幕来说,坐标(1,1)是起始位置。
5.2.2TE_get_line_attribute
char * TE_get_line_attribute ( int col, int row, int width, char *buf );
此函数返回文本的格式。对每一个参数,都要指定,如果不需要使用某参数,可以指定空值。
它会检查屏幕中某行中的文本,并返回其格式,需要指定起始的坐标。并且要指定宽度。返回格式给参数*buf。
如果指定宽度为-1,则此函数会读取某行中所有文本的格式。
5.2.3TE_get_text_line
char * TE_get_text_line ( int col, int row, int width, char *text );
如果不需要使用某参数,可以指定空值。
这个函数会复制指定的文本到参数中去。如果指定的宽度小于1,则返回整行。
5.3游标函数
5.3.1TE_get_cursor_pos
int TE_get_cursor_pos ( int *col, int *row );
返回屏幕上当前光标的位置。
5.3.2TE_set_cursor_pos
int TE_set_cursor_pos( intcol, introw);
设置屏幕上光标的位置。
5.4输入函数
5.4.1TE_type
int TE_type ( const char *string );
发送一个字符串到屏幕上去。也包括操作键,比如:tab/enter等。
另外,要了解此函数,还要了解字符映射。参考手册中的说明。
5.5同步函数
5.5.1TE_wait_sync
int TE_wait_sync (void);
TE_wait_sync函数仅用于同步块模式(IBM)终端。其他TE同步函数用于同步字符模式(VT)终端。TE_wait_sync函数用于同步操作块模式(IBM)终端的RTE Vuser。块模式终端显示“XSYSTEM”消息,表示系统处于禁止输入模式。当系统处于禁止输入模式时,将无法执行任何键入操作,因为终端仿真器正在等待从服务器传送数据。默认情况下,当你在块模式终端上录制脚本时,每次显示“X SYSTEM”消息时,VuGen都会生成TE_wait_sync函数并将其插入到该脚本中。你可以使用VuGen的录制选项指定VuGen是否应该自动插入TE_wait_sync函数。当运行Vuser脚本时,TE_wait_sync函数将检查系统是否处于X SYSTEM模式。如果系统处于X SYSTEM模式,则TE_wait_sync函数将暂停脚本执行。当“X SYSTEM”消息从屏幕上消失时,脚本将继续执行。同步超时可以在Run Time Settings里设置。
5.5.2TE_wait_cursor
int TE_wait_cursor ( int col, int row, int stable, int timeout );
VT类型终端首选的同步方法是光标同步。光标同步对全屏或窗体类型的应用程序而言特别有用,对于滚动式或TTY类型的应用程序则正好相反。光标同步使用TE_wait_cursor函数。当运行RTE Vuser脚本时,TE_wait_cursor函数将指示Vuser暂停脚本执行,直至光标出现在屏幕上的指定位置。光标出现在指定位置表示该应用程序准备好接收来自终端仿真器的下一个输入。
在脚本执行期间,TE_wait_cursor函数将等待光标到达由col和row指定的位置。stable参数指定光标必须在指定位置停留的时间(以毫秒为单位)。如果你使用VuGen录制脚本,stable将被默认设置为100毫秒。如果客户端应用程序在timeout参数指定的时间内未达到稳定状态,则该函数将返回TIMEOUT。如果你使用VuGen录制脚本,则timeout将被默认设置为TIMEOUT,该值为90秒。你可以通过直接编辑所录制的脚本来更改stable和timeout参数的值。以下语句将等待光标保持稳定状态三秒钟。如果光标未能在10秒内达到稳定状态,则该函数将返回TIMEOUT。
TE_wait_cursor (10, 24, 3000, 10);
5.5.3TE_wait_text
int TE_wait_text (
const char *pattern, int timeout [, int col1, int row1, int col2, int
row2, int *retcol, int *retrow, char *match ] );
你可以使用文本同步来同步在VT终端仿真器上运行的RTE Vuser。文本同步使用TE_wait_text函数。在脚本执行期间,TE_wait_text函数将暂停脚本执行,然后等到特定字符串出现在终端窗口中以后继续执行脚本。对于那些光标不能始终出现在预定义的屏幕区域中的应用程序而言,文本同步非常有用。
其他同步函数。请参见函数参考。
6RTE的错误代码
以下代码可以使用TE_sperror and TE_perror转。
错误代码 | 返回代码名称 | 含义 |
0 | TE_SUCCESS | 操作成功 |
-1 | TE_BUSY | 忙。 |
-2 | TE_BAD_ARG | 不合法的参数传递到此函数。 |
-3 | TE_TIMEOUT | 超时。 |
-4 | TE_BAD_REGEXP | 不合法的正则表达式传到此函数。 |
-5 | TE_COMM_ERROR | 终端模拟器出现通信问题。 |
-6 | TE_NO_SELECTION | 没有选择文本。 |
-7 | TE_APPLICATION_GONE | 会话中断。 |
-8 | TE_READ_ONLY | 尝试设置只读属性。 |
-9 | TE_PARAM_ERROR | 参数化错误。 |
-10 | TE_KEYS_LOCKED | 键盘锁定。 |
-11 | TE_CANT_CONNECT | 无法连接到主机。 |
7RTE协议编写总结
对RTE协议来说,一定要关注同步。没有同步,就不可能运行起来,并且录制时要注意键盘被锁定的问题,需要用同步函数来解决。因为此协议依赖的是屏幕操作。
因为RTE协议的键盘操作。所以不需要关联函数。当然,我们可以把TE_get_text_line当成关联函数来用。
RTE协议的脚本运行出错时会把屏幕上所有的字符记录下来。以便查找原因。
有处理传统的终端应用中,此协议还是非常不错的。当然它也有一些缺点。比如,因为它需要同步,所以它提供的压力就要小一些。这个问题,可以用大用户量来弥补。RTE协议比较占资源,当然对现在这种硬件资源来说,还是可以接受的。
LR的RTE协议在压力测试工具中,还是非常有优势的。至少现在支持此协议的压力测试工具很少。