-
软件测试自动化流程与框架设计
2008-01-25 09:52:44
软件测试自动化流程与框架设计原文
2007-12-03 22:31:18 / 个人分类:自动化测试框架
一. 为何需要软件自动化测试框架
软件测试框架是软件测试自动化规模发展到一定阶段的必然需求,因为自
动化测试将会面临如下问题:
1. 如何定义脚本的规范,使之具有良好的可复用性和可维护性。
2. 众多脚本的管理问题,如何管理不同版本的测试脚本以及测试脚本之间
的关联关系。
3. 众多脚本的执行问题,如何无人值守地执行测试脚本,以节约测试时间
4. 如何获得最大的自动化测试收益,怎样调整测试策略来达到最高的automation效益。
目前在微软,IBM等自动化测试比较成熟的公司,都已经实现并应用了软件自动化测试框架。可以说,框架是自动化测试的趋势。二.软件自动化测试框架架构思想
其实MS也好,IBM也好,自动化测试框架虽然形式各有不同,但思想却大同小异。总体来说,成熟的自动化测试框架必须提供以下几个功能:
1. controller-agent的拓扑结构。此点最妙之处是扩展性极强,在空间上能够兼容各种类型测试程序及脚本,在时间上能够并发执行测试任务。
2. 内嵌灵活的自动化测试案例的管理策略。此处可根据企业实际具体应用定义相应的测试组件
3. 强大的测试报告和日志展现。一份好的自动化测试报告能满足不同人的口味和需要,比如给老板以清晰直观的测试图表分析;给开发人员以强大的日志debug分析;给测试人员以bug自动关联作用。下面以automation center为例,分析一下自动化测试框架的设计
展现层:
给终端用户提供基于Web页面的四大功能模块
· 测试任务
发起安装/测试任务,并对任务状态进行实时监控
· 测试结果
展现测试结果,生成测试报告,邮件通知,提交bug全程自动化
· 日志分析
SMB协议访问日志服务器,轻松获得automation执行时的日志和抓图
· AC管理
脚本管理策略
测试组件策略
测试实例生成
Agent 资源管理,添加/删除
Server资源管理,添加/删除
AC核心设置
控制层:
controller是AC核心,负责如下工作
· 接收并处理用户发送的任务请求
· 管理和控制安装/测试Agent
· 分析和整理测试结果
· 内嵌测试报表/邮件逻辑
· 连接数据库,日志服务器和脚本服务器
Agent层:
Agent 安装在任务机上,负责:
· 执行安装任务
· 执行测试任务
· 生成log/抓图数据,供后续分析框架应用策略
1. 自动化测试框架是代码,流程,策略的集合(这句话已经耳熟能详了,但能深刻理解并能成功地用到工作实践中却不容易)
2. 当你有超过10个自动化测试案例时,就应该开始考虑自动化测试框架的实施了(规范,管理,执行策略等等)
3. 实现框架的语言以编译语言为优先选择(我看过用vbscrīpt编写的上万行的框架代码,惨不忍睹,维护和扩展那是相当滴困难)
4. 在设计时,框架和案例要分工清楚明确(框架,纲举目张也,不宜管得太多太细,否则案例丧失了灵活性,框架推广起来就步履维艰了,嘿嘿) -
[原创]wr虚拟控件向导的使用和建议(控件不可识别问题的解决)
2007-07-21 17:07:52
[原创]wr虚拟控件向导的使用和建议(控件不可识别问题的解决)作者:wss123(转载请注明作者)
相信朋友们都有因为wr不能识别部分控件而烦恼的经历吧,论坛里也经常有提问如何识别某某控件的各种声音,wr为可能出现的不能识别控件提供了一个识别工具,即虚拟控件向导。说白了,就是获取被测控件在显示二维平面的位置(x轴、Y轴)来唯一标识;小弟冒昧将自己在使用wr的虚拟控件向导的一些体会写下来,供大家参考和指正;
首先,还是啰嗦一下如何使用虚拟控件向导:可以从 tools--->virtual
object wizard 和 tools---->GUI Map Editor --->tools---->virtual object
wizard 两个路径运行向导,它提供的标准控件类别有:
check_button,list,object,push_button,radion_button,table;
向导提供了一个mark object 的功能,用于框选需要识别的控件。以下是我利用虚拟向导学习的一个按钮控件Gui的物理描述:
{
class: push_button,
virtual: TRUE,
x: 545,
y: 510,
width: 80,
height: 18,
rows: 1,
columns: 1
}
wr的学习Gui对象的原理就是要通过物理描述唯一标识Gui对象,这样在 脚本中
就能正确地指向被描述的控件。
说了这么多,该说说我在使用中遇到的不如意了 。
首先:移植性糟糕,在800*600像素15寸平面直角的显示学习的虚拟控件,在1024*760像素中就不能用了,因为物理描述中的x轴,y轴指向的肯定不是原来的控件(被测软件的界面不是固定大小的情况)
还有一种情况是被测软件提供了横向和纵向滚动条,您在学习虚拟Gui的时候拉动滚动条,在录制过程中又拉动滚动条,控件不能在两次拉动滚动条都出现在同一个位置
(当然如果可以在显示器上标识还是可以做到两次都出现在同一位置的可能)
综上所述,如果只是少部分的控件不能识别的话,建议使用虚拟控件向导,但是如
果很多的话,这样做是一个非常繁重的工作,还是去为wr加载插件来的妙些。
(以上浅见,欢迎批评,但愿能为论坛和各位同仁做点贡献) -
tsl脚本命令(转贴)四
2007-07-21 11:10:31
tsl脚本命令(转贴)四
301、win_max ( window );最大化窗口到全屏
302、最小化窗口为一个图标
303、win_mouse_click ( window, x, y [, mouse_button [, modifier] ] );在窗口点击鼠标
304、win_mouse_dbl_click ( window, x, y [, mouse_button [, modifier ] ] );在窗口双击鼠标
305、win_mouse_drag ( window, start_x, start_y, end_x, end_y [, mouse_button ] );在窗口做鼠标拖动操作
306、win_mouse_move ( window, x, y );移动鼠标焦点到指定的位置
307、win_move ( window, x, y );移动窗口到一个绝对位置
308、win_move_locator_text ( window, string [ ,search_area [ ,string_def ] ] );移动鼠标焦点到窗口的某个字符串
309、win_open ( window );打开应用程序窗口
310、win_resize ( window, width, height );调整窗口大小
311、win_restore ( window );恢复窗口从前的大小
312、win_type ( window, keyboard_input );用键盘输入窗口
313、win_wait_bitmap ( window, bitmap, time [, x, y, width, height] );等待窗口位图
314、win_wait_info ( window, property, value, time );等待窗口属性值
315、atan2 ( y, x );返回y/x(正切)的弧度
316、cos ( x );返回余弦值
317、exp ( x );返回e的指数值
318、int ( x );返回实数的整数部分
319、log ( x );返回自然对数
320、sin ( x );返回正弦值
321、sqrt ( x );返回平方根值
322、delete array [ subscrīpt ];删除数组里某个元素
323、split ( string, array [ , field_separators ] );将输入分成区域保存在数组里
324、call test_name ( [ parameter1, parameter2, ... parametern ] );调用其他测试脚本
325、call_chain_get_attr ( property, level, out_value );返回调用链里测试或函数的信息
326、call_chain_get_depth ( );返回调用链选项的个数
327、call_close test_name ( [ parameter1, parameter2, ... parametern ] );调用测试脚本,完成时关闭测试
328、call_ex ( Astra_test_path );从winrunner里调用Astra QuickTest测试
329、return [ expression ];返回测试或函数的结果表达式
330、texit ( [ expression ] );停止执行当前的测试
331、treturn [ ( expression ) ];停止调用测试返回控制调用测试
332、load ( module_name [,1/0 [,1/0 ] ] );载入一个编译过的模块
333、reload ( module_name [,1|0 [,1|0] ]);删除编译过的模块并重新载入内存
334、unload ( [ module | test [ , function_name ] ] );从内存里删除编译模块
335、define_object_exception (recovery_scenario_name, function, window, object, property [ , value ] );对一个gui对象异常事件定义简单的观察场景
336、define_popup_exception (recovery_scenario_name, function, window );对pop-up事件定义异常
337、define_tsl_exception (recovery_scenario_name, return_code [, TSL_function ] );定义tsl事件异常事件
338、exception_off ( recovery_scenario_name );解除指定的观察场景
339、exception_off_all ( );解除所有的观察场景
340、exception_on (recovery_scenario_name );激活指定的观察场景
341、file_close ( file_name );关闭用file-open打开的文件
342、file_compare ( file1, file2 [ , save_file ] );比较两个文件的内容
343、file_getline ( file_name, out_line );读取文件下一行,并将其分配给一个变量
344、file_open ( file_name, mode );打开或创建指定的文件
345、file_printf ( file_name, format, exp1 [ , exp2,... exp30 ] );按格式打印文件
346、pause ( [ expression ] );暂停测试执行并输出提示信息
347、report_msg ( message );往测试报告里写信息
348、sprintf ( format, exp1, exp2,...expn );返回固定格式字符串到一个变量
349、str_map_logical_to_visual ( logical_string, visual_string );把逻辑字符串转换成形象字符串
350、eval ( statement1 [; statement2;.... statementn;] );评估并执行附属的tsl语句
351、get_unique_filename ( folder_path , file_prefix , file_extension , out_filename , with_underscore );基于指定的前缀,创建唯一的文件名
352、nargs ( );返回参数通过的个数
353、tl_step ( step_name, status, descrīption );把测试脚本分成几块,并在当前测试结果里插入状态信息
354、invoke_application ( file, command_option, working_dir, show );调用windows应用程序
355、dos_system ( expression );执行dos命令
356、ascii ( string );返回字符串第一个字符的asc码
357、compare_text ( str1, str2 [, chars1, chars2 ] );比较两个字符串
358、index ( string1, string2 );显示两个字符串位置
359、length ( string );计算字符串里字符的个数
360、match ( string, regular_expression );寻找字符串里正规表达式的事件
361、substr ( string, position [, length ] );从字符串里提取子字符串
362、tolower ( string );转换全部大写字母到小写字母
363、toupper ( string ); 转换全部小写字母到大写字母
364、end_transaction ( transaction [ , status ] );标记一个性能分析的结束
365、get_time ( );返回当前系统时间
366、start_transaction ( transaction_name ); 标记一个性能分析的开始
367、time_str ( [ expression ] );将返回的整数时间转换成字符串
368、wait ( seconds [, milliseconds] );测试暂停
invoke_application(file,command_option,working_dir,show);
file:应用程序的文件名,绝对路径;
command_option:应用程序的参数;
working_dir:应用程序工作路径;
show:程序运行时的显示模式;
数据库检查点:标准检查点和运行时检查点
标准检查点检查行数、列数、内容是否一致;包括defaultcheck仅检查数据库内容是否一致;custom check 可随意组合上面三种方式检查
运行时检查点检查程序界面上某些控件显示的内容是否在数据库中匹配记录,三种方式:匹配一条、匹配多条、没有匹配记录 -
tsl脚本命令(转贴)三
2007-07-21 11:09:47
tsl脚本命令(转贴)三
201、tab_get_item ( tab, item_num, out_item );返回tab选项的名称
202、tab_get_selected ( tab, out_item, out_num );返回选定的tab选项的名称和个数
203、tab_select_item ( tab, item );选择tab选项
204、tab_wait_info ( tab, property, value, time );等待tab属性的值
205、tbl_activate_cell ( table, row, column );双击表里某个单元
206、tbl_activate_col ( table, column );双击表里某列
207、tbl_activate_header ( table, column );双击表里某列标题
208、tbl_activate_row ( table, row );双击表里某行
209、tbl_deselect_col ( table, column );取消选择表的某列
210、tbl_deselect_cols_range ( table, from_column, to_column );取消选择表里某几列
211、tbl_deselect_row ( table, row );取消选择表里某行
212、tbl_deselect_rows_range ( table, from_row, to_row );取消选择表里某几行
213、tbl_extend_col ( table, column );往表里当前列加一列
214、tbl_extend_cols_range ( table, from_column, to_column );往表里当前列加多列
215、tbl_extend_row ( table, row );往表里当前行前加一行
216、tbl_extend_rows_range ( table, from_row, to_row );往表里当前行加多行
217、tbl_get_cell_data ( table, row, column, out_text );返回表里指定单元的内容
218、tbl_get_cols_count ( table, out_cols_count );返回表的列数
219、tbl_get_column_name ( table, col_index, out_col_name );返回表里指定列的标题名称
220、tbl_get_column_names ( table, out_col_names, out_cols_count );返回表里列的名称和个数
221、tbl_get_rows_count ( table, out_rows_count );返回表的行数
222、tbl_get_selected_cell ( table, out_row, out_column );返回表里焦点所在单元
223、tbl_get_selected_row ( table, row );返回当前焦点所在行
224、tbl_select_cells_range ( table, start_row, start_col, end_row, end_col );在表里点击选定的几个单元
225、tbl_select_col_header ( table, column );选定指定的列的标题
226、tbl_select_cols_range ( table, from_column, to_column );在表里选定指定的几列
227、tbl_select_rows_range ( table, from_row, to_row );在表里选定指定的几行
228、tbl_set_cell_data ( table, row, column, data );设置表里某单元的内容
229、tbl_set_cell_focus ( table, row, column );设置表里焦点到某个单元
230、tbl_set_selected_cell ( table, row, column );在表里选定指定的单元
231、tbl_set_selected_col ( table, column );在表里选定指定的列
232、tbl_set_selected_row ( table, row );在表里选定指定的行
233、obj_click_on_text ( object, string [ ,search_area [ , string_def [ , mouse_button ] ] ] );点击一个对象的文本
234、obj_find_text ( object, string, result_array [, search_area [, string_def ] ] );返回一个对象字符串的位置
235、obj_get_text ( object, out_text [, x1, y1, x2, y2 ] );从对象里读取文本
236、obj_move_locator_text ( object, string [ , search_area [ , string_def ] ] );在对象里把鼠标焦点落在字符串
237、win_find_text ( window, string, result_array [, search_area [, string_def ] ] );在一个窗口返回字符串位置
238、win_click_on_text (window, string [ ,search_area [ , string_def [ , mouse_button ] ] ] );在窗口搜索文本
239、win_get_text ( window, out_text [, x1, y1, x2, y2] );从窗口指定的区域读取文本
240、win_move_locator_text ( window, string [ ,search_area [ ,string_def ] ] );在窗口里把鼠标焦点落在字符串
241、toolbar_button_press ( toolbar, button, mouse_button );点击工具栏按钮
242、toolbar_get_button ( toolbar, button_num, out_text );返回工具栏按钮名称
243、toolbar_get_button_info ( toolbar, button, property, out_value );返回工具栏按钮属性值
244、toolbar_get_button_num ( toolbar, button, out_num );返回工具栏按钮位置
245、toolbar_get_buttons_count ( toolbar, out_num );返回工具栏按钮的个数
246、toolbar_select_item ( toolbar, toolbar_item_chain [, mouse_button ] );选择类菜单工具栏的某项
247、web_browser_invoke ( browser, site );调用ie打开某个站点
248、web_cursor_to_image ( image, x, y );移动鼠标指针到某个图片
249、web_cursor_to_label ( label, x, y );移动鼠标指针到某个标签
250、web_cursor_to_link ( link, x, y );移动鼠标指针到某个链接
251、web_cursor_to_obj ( object, x, y );移动鼠标指针到某个对象
252、web_event ( object, event_name [, x , y ] );在指定对象运行一个事件
253、web_file_browse ( object );点击浏览按钮
254、web_file_set ( object, value );在文件类型的对象设置文本值
255、web_find_text ( frame, text_to_find, result_array [, text_before, text_after, index, show ] );返回帧内文本位置
256、web_frame_get_text ( frame, out_text [, text_before, text_after, index ] );返回帧内文本的内容
257、web_frame_get_text_count ( frame, regex_text_to_find, count );返回帧内标准表达式的事件个数
258、web_frame_text_exists ( frame, text_to_find [, text_before, text_after ] );检查帧内指定的文本字符串是否存在
259、web_get_run_event_mode ( out_mode );返回当前的运行模式
260、web_get_timeout ( out_timeout );返回winrunner响应web的最大等待时间
261、web_image_click ( image, x, y );点击一个图片链接或图片
262、web_label_click ( label );点击指定的标签
263、web_link_click ( link );点击朝文本链接
264、web_link_valid ( name, valid );检查url链接是否有效
265、web_obj_get_child_item ( object, table_row, table_column, object_type, index, out_object );返回对象的子对象的物理描述
266、web_obj_get_child_item_count ( object, table_row, table_column, object_type, object_count );返回对象的子对象的个数
267、web_obj_get_info ( object, property_name, property_value );返回对象属性的值
268、web_obj_get_text ( object, table_row, table_column, out_text [, text_before, text_after, index] );返回对象的文本字符串
269、web_obj_get_text_count ( object, table_row, table_column, regex_text_to_find, count ); 返回对象内标准表达式的事件个数
270、web_obj_text_exists ( object, table_row, table_column, text_to_find [, text_before, text_after] );在对象里如果该文本存在,返回该文本
271、web_refresh ( frame );winrunner重新连接指定的帧
272、web_restore_event_default ( );重新设置全部事件为默认值
273、web_set_event ( class, event_name, event_type, event_status );设置事件状态
274、web_set_run_event_mode ( mode );设置事件运行模式
275、web_set_timeout ( timeout );设置winrunner响应web的最大时间
276、web_set_tooltip_color ( fg_color, bg_color );设置webtest工具条的颜色
277、web_sync ( timeout );等待帧的导航完成
278、web_tbl_get_cell_data ( table, row, column, starting_pos, out_text, out_actual_text_length );返回web表内指定单元的内容,开始于指定的字符
279、web_url_valid ( URL, valid );检查url是否有效
280、tbl_get_cell_data ( table, row, column, out_text );返回table里指定单元的内容(加载webtest)
281、tbl_get_cols_count ( table, out_cols_count );返回表的列数(加载webtest)
282、tbl_get_column_name ( table, col_index, out_col_name );返回表里指定列的标题的名称(加载webtest)
283、tbl_get_rows_count ( table, out_rows_count );返回表的行数(加载webtest)
284、web_password_encrypt ( password );将web页面的密码加密
285、set_window ( window [,time] );激活窗口并确定等待时间
286、win_activate ( window );激活窗口
287、win_check_bitmap ( window, bitmap, time [, x, y, width, height ] );比较窗口的位图
288、win_check_gui ( window, checklist, expected_results_file, time );比较窗口的gui数据
289、win_check_info ( window, property, property_value [, timeout ] );检查被请求的窗口属性
290、win_click_help ( window );在窗口点击帮助按钮
291、win_click_on_text (window, string [ ,search_area [ , string_def [ , mouse_button ] ] ] );在窗口搜索文本
292、win_close ( window );关闭窗口
293、win_drag (source_window, x, y [, mouse_button ] );从源窗口拖动对象
294、win_drop ( target_window, x, y );拖动对象到目标窗口
295、win_exists ( window [, time ] );检查窗口是否显示在屏幕上
296、win_find_text ( window, string, result_array [, search_area [, string_def ] ] );返回窗口里字符串的位置
297、win_get_desc ( window, obligatory, optional, selector, out_desc );返回窗口的物理描述
298、win_get_info ( window, property, out_value );返回窗口属性的值
299、win_get_text ( window, out_text [, x1, y1, x2, y2] );从窗口指定区域读取文本
300、win_highlight ( window [, flashes ] );高亮显示窗口 -
tsl脚本命令(转贴)二
2007-07-21 11:09:08
tsl脚本命令(转贴)二
101、GUI_save ( file_name );保存guimap文件
102、GUI_save_as ( current_file_name, new_file_name );另存为guimap文件
103、GUI_set_window ( window_name );设置guimap里目标识别范围
104、GUI_unload ( file );卸载guimap文件
105、GUI_unload_all ( )卸载全部的guimap文件
106、icon_move ( icon, x, y );移动图标到新位置
107、icon_select ( icon );点击鼠标选择图标
108、java_activate_method( object, method, retval [ , param1, ... param8 ] );调用请求的java方法
109、java_fire_event ( object , class [ , constructor_param1,..., constructor_paramX ] );模拟一个java对象的事件
110、jco_create ( object , jco , class [ , constructor_param1 , ... , constructor_param8 ] )创建一个现有java对象的上下文java对象
111、jco_free ( object_name );释放内存里指定的jco对象
112、jco_free_all();释放全部内存里的jco对象
113、jdc_aut_connect ( in_timeout );建立一个winrunner和java应用程序的连接
114、method_wizard ( [ object ] );打开java方法的向导
115、obj_key_type ( object, keyboard_input );向java组件发送事件
116、obj_set_info ( object, property, value );设置对象属性的值
117、popup_select_item ( "menu component;menu item" );从java活动菜单选择一个选项
118、list_activate_item ( list, item [, offset ] );激活列表里某一项
119、list_check_info ( list, property, property_value );检查列表属性的值
120、list_check_item ( list, item_num, item_content );检查列表某项的内容
121、list_check_selected ( list, selected_items );检查选中的那项
122、list_collapse_item ( list, item [, mouse_button ] );隐藏树型图里的选项
123、list_deselect_item ( list, item [, mouse_button [, offset ]] );取消选定列表的某一项
124、list_deselect_range ( list, item1, item2 [, offset ] );取消选定2个选项
125、list_drag_item ( source_list, item [, mouse_button ] );拖动源列表的某个选项
126、list_drop_on_item ( target_list, target_item );把一个对象关联到目标列表的选项
127、list_expand_item ( list, item [, mouse_button ] );显示隐藏的树型图选项
128、list_extend_item ( list, item [, button [, offset ] ] );往指定的列表里添加一个选项
129、list_extend_multi_items ( list, item_list, [, mouse_button [, offset ] ] );添加多个选项
130、list_extend_range ( list, item1, item2 [, button [, offset ] ] );添加一定范围的选项
131、list_get_checked_items ( list, items, number );返回标记的选项的个数和值
132、list_get_info ( list, property, out_value );返回列表属性的值
133、list_get_item ( list, item_num, out_value );返回列表选项的内容
134、list_get_item_coord ( list, item, out_x, out_y, out_width, out_height );返回列表选项的四个坐标
135、list_get_item_info ( list, item, state, out_value );返回列表选项的状态
136、list_get_item_num ( list, item, out_num );返回列表选项的位置
137、list_get_selected ( list, out_item, out_num );返回列表里选定选项的数字和字符串值
138、list_select_item ( list, item [,button [, offset ] ]);选择一个列表选项
139、list_select_multi_items ( list, item_list [, mouse_button [, offset ] ] );选择一个列表的多个选项
140、list_select_range ( list, item1, item2 [, button [, offset ] ]);选定一定范围内全部选项
141、list_wait_info ( list, property, value, time );等待列表属性的值
142、menu_get_desc ( menu, oblig, optional, selector, out_desc );返回菜单的物理描述
143、menu_get_info ( menu, property, out_value );返回菜单属性的值
144、menu_get_item ( menu, item_number, out_contents );返回菜单选项的内容
145、menu_get_item_num ( menu, item, out_position );返回菜单选项的位置
146、menu_select_item ( menu;item [ x,y ] );选择一个菜单选项
147、menu_wait_info ( menu, property, value, time );等待菜单属性的值
148、obj_check_bitmap ( object, bitmap, time [, x, y, width, height] );比较对象的位图
149、obj_check_gui ( object, checklist, expected_results_file, time );比较当前的gui对象数据
150、obj_check_info ( object, property, property_value [, timeout ] );检查gui对象属性的值
151、obj_click_on_text ( object, string [ ,search_area [ , string_def [ , mouse_button ] ] ] );在对象里点击文本
152、obj_drag ( source_object, x, y [, mouse_button ] );从源对象拖动一个对象
153、obj_drop ( target_object, x, y );拖动一个对象到目标对象
154、obj_exists ( object [, time ] );检查对象是否显示在屏幕上
155、obj_find_text ( object, string, result_array [, search_area [, string_def ] ] );在对象里返回字符串的位置
156、obj_get_desc ( object, oblig, optional, selector, out_desc );返回对象的物理描述
157、obj_get_info ( object, property, out_value );返回对象属性的值
158、obj_get_text ( object, out_text [, x1, y1, x2, y2 ] );读取对象的文本
159、obj_highlight ( object [, flashes ] );高亮显示对象
160、obj_mouse_click ( object, x, y [, mouse_button ] );点击一个对象
161、obj_mouse_dbl_click ( object, x, y [, mouse_button ] );双击一个对象
162、obj_mouse_drag ( object, start_x, start_y, end_x, end_y [,mouse_button ] );在对象上拖动鼠标
163、obj_mouse_move ( object, x, y );在对象里移动鼠标指针
164、obj_move_locator_text ( object, string [ , search_area [ , string_def ] ] );在对象里移动鼠标到一个字符串
165、obj_type ( object, keyboard_input );用键盘输入对象
166、obj_wait_bitmap ( object, bitmap, time [, x, y, width, height] );等待对象位图出现在屏幕
167、obj_wait_info ( object, property, value, time );等待对象属性的值
168、scroll_check_info ( scroll, property, property_value );检查滚动条的属性值
169、scroll_check_pos ( scroll, position );检查滚动条的当前位置
170、scroll_drag ( scroll, orientation, position );滚动到指定位置
171、scroll_drag_from_min ( scroll, orientation, position );从最小值开始滚动
172、scroll_get_info ( scroll, property, out_value );返回滚动条的属性值
173、scroll_get_max ( scroll, orientation, out_max );返回滚动条的最大位置
174、scroll_get_min ( scroll, orientation, out_min );返回滚动条的最小位置
175、scroll_get_selected ( slider, min_value, max_value );返回滚动条的最小和最大值
176、scroll_get_pos ( scroll, orientation, out_pos );返回滚动条当前位置
177、scroll_line ( scroll, orientation, [ +|- ] lines );滚动指定的几行
178、scroll_max ( scroll, orientation );设置滚动条到最大位置
179、scroll_min ( scroll, orientation );设置滚动条到最小位置
180、scroll_page ( scroll, orientation, [+|-] pages );移动滚动条指定的页数
181、scroll_wait_info ( scroll, property, value, time );等待滚动条属性的值
182、spin_get_info ( spin, property, out_value );返回旋转属性的值
183、spin_get_pos ( spin, out_value );返回旋转对象的位置
184、spin_get_range ( spin, out_min_pos, out_max_pos );返回旋转对象的最小与最大位置
185、spin_max ( spin [, index ] );设置旋转对象到最大值
186、spin_min ( spin [, index ] );设置旋转对象到最小值
187、spin_next ( spin [, index ] );设置旋转对象到下一个值
188、spin_prev ( spin [, index ] ); 设置旋转对象到前一个值
189、spin_set ( spin, item [, index ] );设置选择对象到一个选项值
190、spin_wait_info ( spin, property, value, time );等待旋转属性等于指定的值
191、static_check_info ( static, property, property_value );检查静态文本对象属性的值
192、static_check_text ( static, text, case_sensitive );检查静态文本对象的内容
193、static_get_info ( static, property, out_value );返回静态文本对象属性的值
194、static_get_text ( static, out_string );返回静态文本对象的内容
195、static_wait_info ( static, property, value, time );等待静态文本对象的属性值
196、statusbar_get_field_num ( statusbar, field, field_index );返回状态栏区域的数字索引
197、statusbar_get_info ( statusbar, property, out_value );返回状态栏的属性值
198、statusbar_get_text ( statusbar, field_index, out_text );读取状态栏区域的文本
199、statusbar_wait_info ( statusbar, property, value, time );等待状态栏属性的值
200、tab_get_info ( tab, property, out_value );返回tab属性的值 -
tsl脚本命令(转贴)一
2007-07-21 11:08:16
tsl脚本命令(转贴)一
Winrunner Context Sensitive命令列表
1.ActiveBar_combo_select_item ( band_tool , item_name );选择下拉菜单某一项,例如:
set_window("Form1", 1);
ActiveBar_combo_select_item("Format;Font", "Arial");
In the following example, WinRunner selects the third item in the Format:Font tool.
set_window("Form1", 1);
ActiveBar_combo_select_item("Format;Font", "#3");
2.ActiveBar_dump ( file_name );存储活动工具栏信息,包括标题、名称、ID等。
file_name 参数包括路径,例如:
set_window("Form1", 1);
ActiveBar_dump ("d:Bardump.txt");
3、ActiveBar_select_menu ( band_tool [, events_only ] ) ;选择菜单某一项,例如:
in the following example, WinRunner selects the Cut menu item in the Edit toolbar.
set_window("Form1", 1);
ActiveBar_select_menu ("Edit;Cut",TRUE);
4、ActiveBar_select_tool (band_tool [, events_only ] ) ;选择工具栏里某一项,例如:
set_window("Form1", 1);
ActiveBar_select_tool("Format;Center", TRUE);
5、win_check_bitmap ( window, bitmap, time [, x, y, width, height ] );比较窗口位图,
6、obj_check_bitmap ( object, bitmap, time [, x, y, width, height] );比较对象位图,
7、button_check_info ( button, property, property_value );检查按钮属性的值
8、button_check_state ( button, state );检查单选框或复选框的状态
9、button_get_info ( button, property, out_value );返回按钮属性的值
10、button_get_state ( button, out_state );返回单选框或复选框的状态
11、button_press ( button );点击按钮
12、button_set ( button, state );设置单选框或复选框的状态
13、button_wait_info ( button, property, value, time );等待按钮的属性值变化
14、calendar_activate_date ( calendar, date );双击日历某个日期
15、db_check ( checklist, expected_results_file [ , max_rows [ , parameter_array ] ] );比较当前数据库数据和期待的数据库数据
16、db_connect ( session_name, connection_string );建立一个数据库session并建立odbc连接
17、db_disconnect ( session_name );断开连接结束session
18、db_execute_query ( session_name, SQL, record_number );执行sql语句返回记录集
19、db_get_field_value ( session_name, row_index, column );返回数据库特定区域的值
20、db_get_headers ( session_name, header_count, header_content );返回数据库session的列的数量及列的内容并以tab分组
21、db_get_last_error ( session_name, error );返回最后一条数据库session错误信息
22、db_get_row ( session_name, row_index, row_content );返回特定行内容
23、db_record_check ( ChecklistFileName , SuccessConditions, RecordNumber ); Compares information that appears in the application under test during a test run with the current values in the corresponding record(s) in your database.
24、db_write_records ( session_name, output_file [ , headers [ , record_limit ] ] );把结果记录集写到一个文本文件
25、ddt_close ( data_table_name );关闭数据表文件
26、ddt_close_all_tables();关闭全部数据表
27、ddt_export ( data_table_namename1, data_table_namename2 );把一个数据表信息导到另一个数据表文件
28、ddt_get_current_row ( data_table_name, out_row );返回数据表当前所在行
29、ddt_get_parameters ( table, params_list, params_num );返回数据表的参数和参数的个数
30、ddt_get_row_count ( data_table_name, out_rows_count );返回数据表行数
31、ddt_is_parameter ( data_table_name, parameter );返回一个参数是否在数据表里有效
32、ddt_next_row ( data_table_name );指向数据表中到当前行的下一行
33、ddt_open ( data_table_name [ , mode ] );打开或创建一个可以访问的数据表
34、ddt_report_row ( data_table_name );报告当前行到测试结果
35、ddt_save ( data_table_name );保存数据表信息
36、ddt_set_row ( data_table_name, row );设置当前行为第几行
37、ddt_set_val ( data_table_name, parameter, value );插入parameter列一个新值value
38、ddt_set_val_by_row ( data_table_name, row, parameter, value );插入特定行的parameter列一个新值value
39、ddt_show ( data_table_name [ , show_flag ] );显示或隐藏数据表,1是显示,0是隐藏
40、ddt_sort ( table_file, row1, col1, row2, col2, sort_by_rows, key1 [ , key2, key3 ] );根据关键字将数据表特定区域的值排序,sort_by_rows 参数1是按行,0是按列
41、ddt_update_from_db ( data_table_name, file, out_row_count [ , max_rows ] );从数据库往数据表里导数据;
42、ddt_val ( data_table_name, parameter );返回数据表当前行的参数的值
43、ddt_val_by_row ( data_table_name, row_number, parameter );返回数据表特定行的参数的值
44、date_age_string ( date, years, month, days, new_date );将日期相应改变返回新值
45、date_align_day ( align_mode, day_in_week );指定特定的日期给某天
46、date_calc_days_in_field ( field_name1, field_name2 );计算两个日期间的天数
47、date_calc_days_in_string ( string1, string2 );计算字符串格式的日期间的天数
48、edit_check_info ( edit, property, property_value );检查对象属性的值
49、edit_check_selection ( edit, selected_string );检查选择的字符串是否存在
50、edit_check_text (edit, text, case_sensitive );检查编辑对象的文本内容
51、edit_delete ( edit, start_column, end_column );删除编辑对象的文本内容
52、edit_delete_block ( edit, start_row, start_column, end_row, end_column );删除文本区
53、edit_get_block ( edit, start_row, start_column, end_row, end_column, out_string );返回文本区
54、edit_get_info ( edit, property, out_value );返回编辑对象的属性值
55、edit_get_row_length ( edit, row, out_length );返回编辑对象里行的长度
56、edit_get_rows_count ( edit, out_number );返回编辑对象里行数
57、edit_get_selection ( edit, out_string );返回编辑对象的选定字符串
58、edit_get_selection_pos ( edit, out_start_row, out_start_column, out_end_row, out_end_column );返回选定区域的开始和结束位置
59、edit_get_text ( edit, out_string );返回编辑对象的文本
60、edit_insert ( edit, text, columnI );在编辑对象第一行插入文本
61、edit_insert_block ( edit, text, row, column );在一个多行编辑对象插入文本
62、edit_replace ( edit, text, start_column, end_column );替换一个编辑对象的内容
63、edit_replace_block ( edit, text, start_row, start_column, end_row, end_column );替换一个编辑对象的多行内容
64、edit_set ( edit, text );替换编辑对象的全部内容
65、edit_set_insert_pos ( edit, row, column );把鼠标指针放到编辑对象特定位置
66、edit_set_selection ( edit, start_row, start_column, end_row, end_column );选择编辑对象的文本
67、edit_type ( edit, text );在编辑对象敲入字符串
68、edit_wait_info ( edit, property, value, time );等待编辑对象属性的值
69、obj_check_gui ( object, checklist, expected_results_file, time );比较当前的gui对象数据
70、win_check_gui ( window, checklist, expected_results_file, time );对一个窗口比较当前的gui对象数据
71、get_class_map ( custom_class, out_standard_class );返回和一个自定义的类相关的标准类
72、get_record_attr ( class, out_obligatory, out_optional, out_selector );从一个对象类返回属性
73、get_record_method ( class, out_method );返回一个对象类的方法
74、set_class_map ( custom_class, standard_class );关联一个自定义类和一个标准类
75、set_record_attr ( class, oblig_prop, optional_prop, selector );设置一个对象类的属性
76、set_record_method ( class, method );设置对一个类的记录方法
77、unset_class_map ( custom_class );解开一个自定义类和标准类的关联关系
78、GUI_add ( file path, window, object, physical_desc );往gui map文件里加一个对象
79、GUI_buf_get_desc ( file, window, object, out_desc );返回guimap文件里对象的物理描述
80、GUI_buf_get_desc_attr ( file, window, object, property, out_prop_value ); 返回guimap文件里对象的属性的值
81、GUI_buf_get_logical_name ( file, physical_desc, window, out_name ); 返回guimap文件里对象的逻辑名称
82、GUI_buf_new ( file );创建新的gui对象文件
83、GUI_buf_set_desc_attr ( file, window, object, property, value );设置guimap文件里对象的属性的值
84、GUI_close ( file );关闭guimap文件
85、GUI_close_all ();关闭全部guimap文件
86、GUI_delete ( file, window, obj );从guimap文件里删除一个对象
87、GUI_desc_compare ( desc_1, desc_2 );比较两个物理描述
88、GUI_desc_get_attr ( physical_desc, property, out_attr_value );从物理描述得到属性的值
89、GUI_desc_set_attr ( physical_desc, property, value );设置属性的值
90、GUI_get_name ( out_name, out_version );返回测试程序下gui对象的类型
91、GUI_get_window ( );在guimap里返回当前窗口
92、GUI_list_buf_windows ( file, out_windows, out_number );列举出guimap文件里所有的窗口
93、GUI_list_buffers ( out_files, out_number );列举所有打开的guimap文件
94、GUI_list_desc_attrs ( physical_desc, out_array );列举一个gui对象的属性值
95、GUI_list_map_buffers ( out_file, out_number );列举所有载入的guimap文件
96、GUI_list_win_objects ( file, window, out_objects, out_number );列举一个窗口的全部对象
97、GUI_load ( file_name );载入一个guimap文件
98、GUI_map_get_desc ( window, object, out_desc, out_file );返回guimap里对象的物理描述
99、GUI_map_get_logical_name ( physical_desc, window, out_obj, out_file );返回guimap里对象的逻辑名称
100、GUI_open ( file_name );打开guimap文件 -
NND
2007-06-28 11:04:05
尝试了论坛上所有的方法,愣是不行一怒之下,卸载了WR步骤:1、uninstall2、删除所在文件夹C:\Program Files\Mercury Interactive\WinRunner3、重启重新安装小结:后来发现原因是C:\Program Files\Common Files\Mercury Interactive\下把License Manager(里面含有lservrc文件,是注册的重要信息)、WR_Remoter文件夹删除了所以每次安装卸载新的软件时要注意不要删除正确的信息,为了防止,要安装或者卸载完软件之后启动常用的软件看看是否能正常使用,此次就是为了TD而祸害了健康的WR,呼呼现在两位老人家都很健康。。。 -
在WinRunner 7中识别Delphi控件(转载)
2007-06-22 17:50:07
在WinRunner 7中识别Delphi控件
作者:海松宝 来源:网络 优点:
不必购买昂贵的Addin即可识别相应的控件,并进行测试脚本的录制和回放;
可以自定义识别大部分的常用控件,而且可以保存下来供长期使用;
缺点:
应用程序中控件的位置是固定的,不能随着窗口或分辨率的变化而变化;
一个窗口中不能有两个同类的控件位置相同;
部分控件还是不能识别;
虽然有不少缺点,但总算可以不必购买昂贵的Addin就录制和回放大部分的自动测试脚本了。以下以Delphi中的TEdit控件为例,进行说明。
步骤:
第一部分 如何识别Delphi控件
查看WinRunner本身的识别情况。
1.1 运行WinRunner,打开菜单【Tools】-【GUY Spy】,进入GUI Spy窗口;
1.2 点击“Spy”按钮,在要识别的控件(TEdit)上点击左键,GUY Spy窗口中显示控件的属性,如下图:
1.3 我们可以看到GUI Spy识别不出TEdit控件的类,而是认为它是一个Object;
增加新的类
2.1 推出GUI Spy后,打开【Tools】-【GUI Map Configuration】,进入“GUI Map Configuration”窗口,如图:
2.2 点击“Add”按钮,出现“Add Class”窗口;
2.3 点击手形按钮,然后将光标移到指定的控件上点击左键,然后点击“OK”按钮,返回“GUI Map Configuration”窗口,窗口中增加了新增的Class;
2.4 选中刚刚增加的Class(TEdit),点击“Configure”按钮,进入“Configure Class”窗口;
2.5 选择“Mapped to Class”为该对象所继承自的Class(Edit),选择“Available”中的x属性,点击“Obligatory”下的“Insert”按钮,增加x属性,同样增加y属性;
2.6 点击“OK”按钮,返回“GUI Map Configuration”窗口,再点击“OK”按钮,返回到WinRunner窗口;重新用GUI Spy识别TEdit对象,发现识别出来的Recorded属性中Class为Edit,位置也记录下来,而All Standard属性中有了Value属性,这是测试中经常用到的。
可以用同样的方法将其他控件的类增加,以便测试时能够正确识别和回放。
第一部分的内容就讲完了,我想一些看了的朋友已经迫不及待地在制作其他控件的类了吧!不过马上就会有人说:“怎么保存我制作的内容呀!我重新运行WinRunner时这些内容就不在了,如果每次都要这样的话,那有什么用呀!”不要急,在第二部分,我将要讲到如何将这些类做成能够永久识别的内容。
第二部分 制作永久识别的内容
在第一部分中我说到了如何识别Delphi控件,可是不能保存。其实,第一部分的主要目的是要让大家知道该怎么识别Delphi控件,在第二部分,我将向大家说明如何将这些类做成能够永久识别的内容。以下是具体的步骤:在第一部分的步骤 2.5,添加好属性后,我们可以看到在窗口下方的“Gererated TSL scrīpt”框中有几行脚本,这就是让WinRunner能够正确识别控件的关键地方了,我们先把这三句脚本的前面两句Copy下来(干什么用?先别急,会告诉你的!);
然后,我们打开WinRunner的安装目录,在“lib\vbinit”这个子目录下面,我们可以看到一个名为“scrīpt”的文件,用UltraEdit编辑这个文件,可以看到文件中有很多的脚本,这就是第二部分的关键所在了;找到以下两句话:
#VB objects supprt
#OCXs that are mapped can be found in 'oleinit'然后将我们刚才Copy的两句脚本粘贴在这两句话的前面,保存;重新运行WinRunner,启动时加载 VB 的 Addin ,然后选择用 GUY Spy 再对控件进行识别,怎么样?可以正确识别控件了吧!再用第一部分的方法,将各种控件的类增加,然后将“Gererated TSL scrīpt”框中的前两行脚本 Copy 下来粘贴到这个文件中;
编辑并保存好这个文件之后,还有一个注意事项就是:运行WinRunner时,要加载 VB 的 Addin。当然,你愿意将脚本保存到 PB 的scrīpt文件中,然后加载PB的Addin,我也是没办法的咯!
好了!方法已经讲完了,希望能够对大家有所帮助,在节省银子的同时能够好好学习、利用WinRunner这个强大的功能测试工具。 -
安装WR 8.2 及Delphi插件步骤
2007-06-22 09:11:07
安装WR 8.2步骤:
1) run ".\setup\autorun.exe" to install
2) 选择14天试用版本,然后next、next(a serial enter: 9357-2820602186)。
3) 不要选择“立即注册”,不要重启。
4) 运行破解文件, 这个是破解文件,我以jpg的方式上传,只要下载之后更改后缀名即可。
5) 重新启动。
安装Delphi 插件for WR8.2步骤:
WR的DELPHI插件再我印象中有两部分,他和ROBOT的实现方式同样,插件其实有一个DELPHI的UNIT单元,通过这个单元来和WR通信。一般在网络上看到的插件,不是严格意义上的插件,只能说是把识别第三方控件的一种方法,不可识别控件映射为标准控件,用脚本来完成。
就是写了个scrīpt,在WR初始化的时候,直接调用。这种方法其实也不能完全解决所有的控件问题,有些没有包含再内的第三方控件,让需要你添加脚本映射为标准控件来解决。
WR提供的DELPHI ENABLER其实也无法识别所有的对象属性,他只能识别DELPHI中对象的PUBLISH属性。这个MI公司提供的单元实现方式的原理和ROBOT的ENABLER的实现方式不同,通过文件映射的原理来实现的。不是很稳定
其实通过上边网络流传的ADDIN,其实告诉我们解决不可识别对象的方法有,MI提供的插件,把第三方控件影射为标准控件,还有一个方法是开发DLL,扩展WR识别对象的能力(引用转载)DLL:Winrunner的自带文档中 winrunner customiztion guide中有介绍 3) 安装的过程中会提示输入注册码是:1234-5858585858
4) 在WINRUNNER安装目录下的LIB\将pbinit和pblib两个目录备份一份,然后再把装入的7.0的dehpli 插件重命名(原名是dlphinit、dlphlib),命名为‘pbinit’和'pblib'
5) 运行WR会发现出错,提示:“C:\....\pbinit Error:not found in load (m_root\\dlphlib)”
6) 在C:\Program Files\Mercury Interactive\WinRunner\lib\pbinit目录下的scrīpt文件打开,将load(m_root & "\\LIB\\dlphlib",1,1);改成load(m_root & "\\LIB\\pblib",1,1);
7) 重启WR8.2之后,发现插件还是呈现灰色,其实'PowerBuilder'插件选项就是DEPHI的内容,勾选此项就可以了,实际使用的就是DEHPI插件。
8) 在File->Text Properties->Add-in->看到Delphi插件选项
9) 重启,哇!全好了。
题外话:
####################################################################
#
# 海松宝的 Delphi Addin for WinRunner
# 版本: 1.01
# 开发环境: WinRunner 7.01
# 初次编写日期: 2002年5月29日
# 适用于: 控件相对于所属窗口的位置不随窗口变化而改变
#
####################################################################
#
# 使用说明: 1. 将本脚本的整个目录拷贝到 <WinRunner Dir>\lib 目录下;
# 2. 用 WinRunner 打开<WinRunner Dir>\dat\tslinit脚本,在脚
# 本最末尾增加一行代码 call delphi_addin();
# 3. 重新运行WinRunner,即可支持本 Addin 所支持的控件;
#
# 支持控件:
# 1.0:
# tedit tmemo TButton tcheckbox
# tradiobutton tlistbox tcombobox tscrollbar
# tgroupbox TRadioGroup TPanel tbitbtn
# tmaskedit TStringGrid TDrawGrid tscrollbox
# TCheckListBox TStaticText TControlBar TChart
# TTabControl TPageControl TTabSheet TRichEdit
# ttreeview TListView
#
# 1.01: 2002.8.23,热心网友“初学测试”提供TToolBar的映射;
#
#
#====================================================================这个还没有试。。。
刚刚发现这个文档在C:\Program Files\Mercury Interactive\WinRunner\lib\delphi_addin目录下
厄。。。。
在此特别感谢斑竹~
-
20070621小结
2007-06-21 17:55:00
- 终于会用51的超级搜索了
- 安装WR8.2成功
- 安装Delphi插件成功(这个东西真难找)
明天把2、3写出来,总结
-
WinRunner 100 问(转载)
2007-06-21 15:20:14
[Study WinRunner] WinRunner 100 问
引用Kiki http://blog.csdn.net/imlogic/archive/2005/08/04/445491.aspxWinRunner在项目中的作用
可以用WinRunner为所测试应用程序的GUI,功能和回归测试创建自动化脚本。
1. WinRunner的测试过程
主要包括如下6个阶段:
1). 创建GUI Map文件:WinRunner可以通过它来识别被测试应用程序中的GUI对象。
2). 创建测试脚本:通过录制,编程,或两者的组合创建。在录制测试脚本时,在你想检查被测试应用程序响应的地方插入验证点。
3). 调试脚本:用调试(Debug)的模式运行测试脚本以确保它们可以平稳地运行。还可以使用WinRunner提供的Step, Step Into, Step out功能来调试脚本。
4). 运行测试:用验证(Verify)的模式运行测试脚本来测试你的应用程序。当WinRunner在运行中碰到验证点时,它会将被测应用程序中的当前数据和以前捕捉的期望数据进行比较,如果发现了任何不匹配,WinRunner将会把目前的情况捕捉下来作为真实的结果。
5). 检查结果:确定测试脚本的成功或是失败。在每次测试脚本运行结束之后,WinRunner会将结果显示在报告中。它描述了所有在运行中碰到的重要的事件,例如验证点,错误信息,系统信息或是用户信息。如果发现在运行中有任何不匹配的验证点,你可以在测试结果窗口中查看期望的和实际的结果。
6). 提交缺陷:如果一个测试脚本是由于所测试应用程序中的缺陷而导致失败的,你可以直接从测试结果窗口中提取缺陷的相关信息。2. WinRunner 的GUI Map文件
WinRunner利用GUI Map文件来识别应用程序中的对象。它将学习到的窗口或对象信息储存在GUI Map文件中。当WinRunner运行测试脚本时,它利用GUI Map来定位对象。它从GUI Map文件中读取对象的描述并且在被测应用程序中寻找具有相同属性的对象。
在GUI Map文件中的每一个对象都有一个逻辑名称(logical name)和一个物理描述(physical descrīption)。对象的逻辑名称是由其类决定的。在大多数情况下,我们可以将逻辑名称看成是显示在对象上的标签。你可以修改已分配的逻辑名称当它不是十分具有描述性或太长的时候。当对象的属性发生改变时,你必须要修改其物理描述。
GUI Map文件的扩展名是".gui"。
GUI Map文件分为两种类型:
· 全局GUI Map文件:一个为整个应用程序使用的GUI Map文件
· 每个测试脚本的GUI Map文件:在每个测试脚本创建之后,WinRunner会自动为其创建一个GUI Map文件。
我们可以通过工具菜单中GUI Map Editor来查看当前载入的GUI Map文件及其内容。GUI Map Editor 显示多个已创建的GUI Map文件和认识到的带有逻辑名和物理描述的窗口和对象。
在录制脚本时,WinRunner会自已学习对象和窗口,并将它们储存在临时的GUI Map文件中。我们可以在General选项中指定是否需要每次都载入这种临时GUI Map。
当我们载入一个GUI Map文件时,关于窗口和对象的信息连同其逻辑名称和物理描述都载入到内存中。因此当WinRunner在一个特定的窗口上运行脚本时,它可以用这些在内存中的信息识别对象。3. WinRunner的脚本语言
WinRunner的脚本语言是Mercury Interactive’s Test scrīpt Language (TSL),这是一种类C的脚本语言。你可以通过增加另外的TSL函数和编程元素(例如Windows API)或WinRunner的虚拟编程工具(函数生成器(Function Generator))来增强你录制的脚本。
4. WinRunner的录制模式
在WinRunner中,有两种不同的录制模式:
· 环境判断录制(Context Sensitive recording):通过识别GUI对象录制你在被测应用程序中执行的操作。
· 模拟录制(Analog recording):录制键盘的输入,鼠标的点击,和鼠标指针在屏幕上精确的x,y轴6. WinRunner的运行模式
在WinRunner中,有三种不同的运行模式:
·验证Verify:使用这种方式来检查你的应用程序
·调试Debug:使用这种方式来帮助你识别测试脚本中的bug
· 更新Update:使用这种方式来更新测试脚本的期望结果或创建一个新的期望结果文件夹
7. WinRunner的Add-In
载入Add-Ins实际上是将在Add-In中的特殊的函数装载到内存中。当创建测试脚本时,只有这些选中的Add-In中的函数会列在函数生成器中,在运行脚本时,只有那些在载入的Add-In中的函数可以被执行,否则WinRunner将会给出一个不能识别函数的错误信息。8. WinRunner的验证点(Checkpoint)
验证点可以把被测应用程序的当前行为和早前版本的行为进行比较。
在WinRunner中有4种验证点:
·GUI checkpoints:验证GUI对象的信息。例如,你可以检查一个按钮是否可用或查看在一个列表中哪一个选项被选中。
·Bitmap checkpoints:给窗口或所测试应用程序的部分做快照,并把它和早先版本中捕捉的图像做比较。
·Text checkpoints :在GUI对象或位图中读取文字,使你可以验证它们的内容。
·Database checkpoints:基于你创建在数据库的查询,检查一个结果集的内容和列、行的数量
Checklist文件包含了我们正在验证的对象的属性和相关信息 。gui*.chk文件包含了期望的结果,并储存在exp文件夹中。
9. 同步点(synchronization points)
同步点使你可以解决预期的在测试脚本和你应用程序之间的时间问题。例如,如果你创建一个打开数据库应用程序的测试脚本,你可以增加一个同步点以让测试脚本等待直到数据库中的记录载入到屏幕上。
对于模拟测试(Analog testing),你也可以使用一个同步点来确保WinRunner在一个指定的位置重新放置窗口。当你运行一个测试脚本时,鼠标指针沿着准确的坐标行进。重新放置窗口使鼠标指针接触到窗口中正确的元素。10. 编译模块(compile module)
编译模块实际上也是一种脚本,只不过它包含了一个可以被其它的测试脚本频繁地调用,用户自定义函数集的库文件。当你载入一个编译模块时,它的函数将自动的被编译并保存在内存中。其它的测试脚本可以直接调用它们。
编译模块可以改进脚本的组织和性能。由于你在使用它们之前已经调试过编译模块,因此你的测试脚本只需要少量的错误检查。另外,调用一个已经编译的函数明显地比解释测试脚本中的函数快得多。
当编译模块用来储存可重用的函数时,测试脚本包含了在WinRunner中的可执行文件。编译模块是不可执行的。
在保存为编译模块时,WinRunner会自动执行一次预编译。
默认情况下,包含TSL代码的模块的属性是“main”。主模块可以在其他的模块中被调用执行。除了当WinRunner识别到一个“call”语句时,主模块会被动态地被编译为机器代码。例如:
call cso_init();
call( "C:\\MyAppFolder\\" & "app_init" );
编译模块被载入到内存中以便其他模块引用。
reload ("C:\\MyAppFolder\\" & "flt_lib") 或load ("C:\\MyAppFolder\\" & "flt_lib");11. 数据驱动测试(data driven tests)
当你测试你的应用程序时,你或许想检查它如何执行有着大量数据集的相同操作。你可以用一个运行10次的循环来创建一个数据驱动测试:每次循环运行时,它由不同的数据集驱动。为了使WinRunner 能够使用数据来驱动测试,你必须将数据连接到所要驱动的测试脚本。这就叫参数化(parameterizing)你的测试。数据存储在一个数据表格(data table)中。你可以手工执行这些操作,或使用DataDriver Wizard来参数化你的测试脚本并储存数据在数据表格中。
数据驱动测试的步骤如下:
·创建一测试脚本
·转换为数据驱动的测试脚本并准备一个数据库
·运行测试脚本
·分析测试结果
12. 无法识别GUI对象的原因
WinRunner会由于以下多种原因导致不能识别GUI对象。
· 不是标准的Windows对象
· 没有安装所需的Add-In
· 如果所使用的浏览器和WinRunner的版本不兼容,GUI Map编辑器将不能认识在浏览器窗口中显示的任何对象
。。。
14. 启动文件(start up file)
在General Options ->Environment-> Startup文本框中,选择或输入你希望作为启动文件的 测试脚本
15. 输入测试脚本的相关信息
在创建一个测试脚本之前,你可以在Test Properties-> General和 Descrīption中输入和脚本相关的信息,如被测功能的类型,测试脚本的详细描述,引用的相关功能说明书文档16. 如何处理定制对象(custom objects)?
定制对象是不属于WinRunner所使用的标准类之一的任何GUI 对象。WinRunner学习此类的对象为generic "object"类。WinRunner利用obj_mouse_语句来记录在定制对象的操作。
如果定制对象和一个标准的对象很相似,你可以映射它为标准类别之一。你也可以在环境判断测试(Context Sensitive testing)时配置WinRunner用于识别定制对象的属性。
17. 什么是虚拟对象(virtual object)并且如何使用它们?
应用程序可能会含有一些外观和行为和GUI对象相似的位图。WinRunner利用win_mouse_click 语句来记录操作。通过定义一个位图对象为虚拟对象,当你录制并运行测试时,你可以教WinRunner将它象一个GUI对象一样对待。 -
TSL脚本规范完整版(转载)
2007-06-21 10:31:09
原文
TSL脚本编写规范
导言
我们在Mercury Interactive Systems(WinRunner)中创建的脚本是由TSL(Test scrīpt Language)写成的。TSL是一种强化了的类C的编程语言。它是专门设计来用于测试的。在Meercury Interactive的集成测试环境的核心中,TSL是比较高层次的,而且也比较容易使用的。它既有传统编程语言的灵活与强大,也结合了许多Mercury Interactive专门开发来用于测试的功能。
为了使自己和他人能够比较容易的阅读和理解源程序,本文对今后TSL的编写制订了一个规范。
一、排版
1.1 程序块采用缩进风格编写
说明:缩进的空格数为4个,不能使用Tab键。不同的编辑环境导致不同的结果。
错误的示范:
for(counter = count - 24; counter < count - 1; counter++)
{
list_get_item("ListBox",counter,item);
str = str & item & "\r\n";
}正确的示范一:
for(counter = count - 24; counter < count - 1; counter++)
{
list_get_item("ListBox",counter,item);
str = str & item & "\r\n";
}正确的示范二:
for(counter = count - 24; counter < count - 1; counter++){
list_get_item("ListBox",counter,item);
str = str & item & "\r\n";1.2相对独立的程序块之间、变量说明之后必须加空行
说明:便于清晰的显示程序的结构。
错误的示范:
row1=0;
row2=0;
##open two tables
rc = ddt_open(tableFirst, DDT_MODE_READ);
if (rc!= E_OK && rc != E_FILE_OPEN)
pause("Cannot open table");
ddt_get_row_count(tableFirst,RowCount1);正确的示范:
row1=0;
row2=0;
##open two tables
rc = ddt_open(tableFirst, DDT_MODE_READ);
if (rc!= E_OK && rc != E_FILE_OPEN)
pause("Cannot open table");
ddt_get_row_count(tableFirst,RowCount1);1.3较长的语句要分成多行书写
说明:对大于80个字符的语句,要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读
1.4循环、判断中有较长的语句需要划分成多行
说明:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
1.5若函数中的参数较长,则要进行适当的划分
说明:便于清晰的阅读函数
错误的示范:
tl_step("2:对比两张表",FAIL,"表"&tableFirst&"的第"&col1&"列第"&table_Row1&"行的值为:"&val1&");
正确的示范:
tl_step("2:对比两张表",FAIL,
"表"&tableFirst&"的第"&col1&"列第"&table_Row1&"行的值为:"&val1&");
1.6不允许把多个短语句写在一行中
说明:即一行只写一条语句
错误的示范:
auto a;auto b;
正确的示范:
auto a;
auto b;1.7 条件、循环语句需要对语句块进行控制
说明:if 、for 、do 、while 、case 、switch 、default 等语句自占一行,且if 、for 、do 、while 等语句的执行语句部分无论多少都要加括号{}
错误的示范:
if (rc!= E_OK && rc != E_FILE_OPEN) pause("Cannot open table");
正确的示范:
if (rc!= E_OK && rc != E_FILE_OPEN){
pause("Cannot open table");
}1.8操作符前后需要加空格
说明:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格。采用这种松散方式编写代码的目的是使代码更加清晰。由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。
正确的示范一:逗号、分号在后面加空格
static a, b, c;
正确的示范二:比较操作符、赋值操作符、逻辑操作符等双目操作符的前后加空格
if (current_time >= MAX_TIME_VALUE && current_date<=DATE){
a = b + c;
}正确的示范三:单目操作符的前后不加空格
if (current_time!=MAX_TIME_VALUE){
a++;
}1.9 if、for、while、switch等与后面的括号间应加空格
说明:使关键字更加突出、明显。
错误的示范:
if(a > 0){
b=1;
}正确的示范:
if (a > 0){
b=1;
}二、注释
2.1有效注释量必须适中
说明:一般情况下,源程序的有效注释量必须在20%以上。注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。
2.2脚本程序的头部注释
说明:脚本程序头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等
正确的示范:
###########################################################
# Copyright (C), 1988-1999, HSIT. Co., Ltd.
-
WR精粹(实用资料)
2007-06-21 09:41:06
一,新手入门类
1,WIN RUNNER 的很old的视频教程,是个人做的
http://bbs.51testing.com/viewthr ... &extra=page%3D1
2,最近自学WR,写了份自学报告.
http://bbs.51testing.com/viewthr ... &extra=page%3D1
3,安装WR后,脚本中的汉字显示重叠????
http://bbs.51testing.com/viewthr ... &extra=page%3D1
4,(续)最近学的wr自学报告第二部
http://bbs.51testing.com/viewthr ... &extra=page%3D1
5,report中动态显示变量+提示信息
http://bbs.51testing.com/viewthr ... &extra=page%3D1
6,急救!怎么WR不能用了
http://bbs.51testing.com/viewthr ... &extra=page%3D3
7,插入gui检查点时,同一个object的不同状态为何提示mismatch?
http://bbs.51testing.com/viewthr ... &extra=page%3D3
8,GUI_load函数使用上的疑惑
http://bbs.51testing.com/viewthr ... &extra=page%3D3
9,能不能手动添加下拉菜单的属性到gui里
http://bbs.51testing.com/viewthr ... &extra=page%3D3
10,怎么样判断一个窗体中某个按钮是否存在?
http://bbs.51testing.com/viewthr ... &extra=page%3D4
11,二,数据库类:
1.如何用winrunner调用excel中的值
http://bbs.51testing.com/viewthread.php?tid=37714&extra=page%3D1
2.winrunner对变量的检查点设置
http://bbs.51testing.com/viewthread.php?tid=32405&extra=page%3D5
3.WR的参数化数据库检查点
http://bbs.51testing.com/thread-74569-1-3.html
4.如何参数化数据库检查点和参数化SQL
http://bbs.51testing.com/thread-72606-1-4.html
5.Database Checkpoint Wizard 中的Creat new query不能使用的问题
http://bbs.51testing.com/thread-72534-1-5.html
6.这是WR与ORACLE9I的一种连接方法
http://bbs.51testing.com/thread-12237-1-1.html三,代码经验及使用经验类
1,求助关于txt文档中正确显示\n转义的问题
http://bbs.51testing.com/viewthread.php?tid=37449&extra=page%3D2
2,在WR中调用DLL 截屏函数的问题
http://bbs.51testing.com/viewthread.php?tid=36839&extra=page%3D2
3,Winrunner中怎么样判断输入框的字符是字母还是数字?
http://bbs.51testing.com/viewthread.php?tid=36112&extra=page%3D2
4,wr 调用DLL 失败返回信息,百思不得其解,向高手求教。
http://bbs.51testing.com/viewthread.php?tid=36634&extra=page%3D3
5,WR不能回放执行的一个控件,用了各种方法都不行,请高手帮帮忙呀
http://bbs.51testing.com/viewthread.php?tid=36314&extra=page%3D3
6, 关于学习用Tsl测试脚本的问题。
http://bbs.51testing.com/viewthread.php?tid=5753&extra=page%3D4
7, Recovery Scenarios——Simple 举例
http://bbs.51testing.com/thread-63463-1-4.html
8, 如何调用CALL批处理
http://bbs.51testing.com/thread-50329-1-4.html
9,如何把一个值传到被一个调用脚本中
http://bbs.51testing.com/thread-72141-1-5.html
10,有关wr延时的问题
http://bbs.51testing.com/thread-4541-1-5.html
11,如何控制WR自动运行脚本
http://bbs.51testing.com/thread-42581-1-5.html
12,WR8.0 不能识别下拉菜单怎么办
http://bbs.51testing.com/thread-65990-1-5.html
13,为客户化对象创建GUI 检查
http://bbs.51testing.com/thread-57703-1-1.html
14,奇怪的计算问题
http://bbs.51testing.com/thread-73092-1-1.html
15,控件的 MSW_id一直变化,winrunner无法识别
http://bbs.51testing.com/viewthread.php?tid=36034四,WR文档和经验总结文档
1,分享WinRunner使用说明(中文)
http://bbs.51testing.com/thread-24170-1-1.html
2,Winrunner学习资料
http://bbs.51testing.com/thread-26568-1-1.html
3,我的MI学习笔记
http://bbs.51testing.com/thread-24900-1-1.html
4,最近自学WR,写了份自学报告
http://bbs.51testing.com/thread-35929-1-1.html
5,Winrunner8.2英文版tutorial
http://bbs.51testing.com/thread-67118-1-1.html
6,分享TSL online reference
http://bbs.51testing.com/thread-16323-1-1.html
7,TSL脚本的编写规范
http://bbs.51testing.com/thread-48499-1-1.html
8,WR7.60中文使用手册
http://bbs.51testing.com/thread-4255-1-2.html
9,winrunner中文使用说明
http://bbs.51testing.com/thread-34077-1-3.html
10,WinRunner的问题搜集
http://bbs.51testing.com/thread-76854-1-1.html
11,WinRunner资料
http://bbs.51testing.com/thread-77513-1-1.html
12,WinRunner学习交流
http://bbs.51testing.com/thread-77685-1-1.html
我的栏目
标题搜索
我的存档
数据统计
- 访问量: 267424
- 日志数: 399
- 图片数: 3
- 书签数: 4
- 建立时间: 2007-01-16
- 更新时间: 2011-04-03