51Testing软件测试论坛

标题: 多语言软件的自动化测试如何解决脚本重用问题? [打印本页]

作者: letmehappy    时间: 2006-1-12 13:58
标题: 多语言软件的自动化测试如何解决脚本重用问题?
假设在编写脚本测试时,被测软件只有一种语言(例如简体中文).到后期时需要再支持1种语言(比如英文).这时候当然希望在原有的脚本上作一些小的改动就能同时支持不同语言软件的自动化测试,也就是脚本能够重用,不用针对另外一种语言重新编写一套脚本.

此时存在2个与脚本重用有关的问题:

1 脚本中的各种窗口和菜单的内容可能与软件语言有关,例如在软件语言为简体中文时脚本语句如下:
        Window("机票预订系统").Exist

当软件语言为英文时,以上语句执行就会失败,正确的应为:
        window("Flight Reservation").Exist

此部分内容的重用,可用以下方法解决:

a 建立VBScript脚本,在脚本中定义表示窗口和菜单等与语言有关的内容的变量.例如在UI_ENU.vbs中定义如下:
Dim winFR
winFR = “Flight Reservation”

UI_CHS.vbs中定义如下:
Dim winFR
WinFR = “机票预订系统”

b 在QTP的脚本中根据系统语言载入不同的vbs文件

c QTP脚本中语句改为:
        Window(winFR).exist

这种方法应该可行,当然还可能有其他方法可以达到同样的目的

2 Object Repository中的控件资源
如果控件在Object Repository中的识别属性与语言有关的话(例如Button的名称),那么当软件是简体中文时录制的脚本,在软件是英文时脚本运行就会找不到这个控件.我想请教大家如何解决这个问题(请注意是重用原来已经有的脚本,不是重新再写一个.)?难道要重新手动识别控件吗?
在winrunner中解决这个问题比较简单,因为winrunner有GUI文件来保存控件资源,只要在软件为不同语言时分别识别保存,然后在脚本中判断当前系统语言来调入不同的GUI文件即可.而在QTP中好像没有这种机制吧?
作者: 海龙    时间: 2006-1-12 14:34
我不知道你是否试过你说的第一种方法,

a 建立VBScript脚本,在脚本中定义表示窗口和菜单等与语言有关的内容的变量.例如在UI_ENU.vbs中定义如下:
Dim winFR
winFR = “Flight Reservation”

UI_CHS.vbs中定义如下:
Dim winFR
WinFR = “机票预订系统”

b 在QTP的脚本中根据系统语言载入不同的vbs文件

c QTP脚本中语句改为:
        Window(winFR).exist


你要知道 Window(winFR)括号中的部分是对象的名字,如果你用变量替换,那么你要保证对象存储库里面存在这个以这个名称命名的对象。你要修改的是对象属性的属性值,而不是修改对象的名字。

对于2:
可以通过SetTOProperty设置语言相关的属性值,这些属相值可以保存在文件中
作者: letmehappy    时间: 2006-1-12 17:33
直接用例子说话吧:
1 录制脚本
前置条件为为:打开flashget,语言设置为英文
录制内容:点击工具栏上的'Find"按钮,在弹出的窗口中输入"this",然后点击"取消"按钮.
录制的脚本如下:
--------
Window("FlashGet").Activate
Window("FlashGet").WinToolbar("ToolbarWindow32").Press "Find"
Window("FlashGet").Dialog("Find").WinEdit("Find What:").Set "this"
Window("FlashGet").Dialog("Find").WinButton("Cancel").Click

-----------
对象存储库的内容如图片所示

2 切换flashget的语言为简体中文,然后运行脚本,结果执行失败,提示找不到对象

现在要问的问题如下:
怎样在保持对象存储库的内容不变的情况下,通过修改原来的脚本,使其在软件语言为简体中文或英文的情况下都能运行?
作者: letmehappy    时间: 2006-1-12 18:11
哈哈,终于搞定了,代码改为以下内容即可通用(与语言有关的内容另外定义变量):
---------
Window("FlashGet").Activate
Window("FlashGet").WinToolbar("ToolbarWindow32").Press 10   '不以按钮名称而是以按钮的位置来区别
Window("FlashGet").Dialog("Find").SetTOProperty "text","查找"  
'text是Find对话框的一个识别属性,语言切换后主要是这个属性的内容有变化,因此使用SetToPropetrty修改对象存储库中对象的这个属性,这样脚本运行时就对找到实际的对象了
Window("FlashGet").Dialog("Find").WinEdit("Find What:").SetTOProperty "attached text","查找(&F):"
Window("FlashGet").Dialog("Find").WinEdit("Find What:").Set "this"
Window("FlashGet").Dialog("Find").WinButton("Cancel").SetTOProperty "text","取消(&C)"
Window("FlashGet").Dialog("Find").WinButton("Cancel").Click
作者: yangkinki    时间: 2006-1-13 10:20
可以通过修改object repository中的属性来执行,例如
Dialog("Find") 中的text属性把勾去掉,那么运行时就不会判断这个属性是否与运行时匹配,即有语言转换的地方,例如text ,name等属性都可以通过这种方式来修改,使运行正常通过。
作者: letmehappy    时间: 2006-1-17 13:15
楼上说的这种方法之前跟同事讨论过,他也建议使用这种方法.我试过后发现QTP默认的识别属性通常都是比较合理的,当然可以动手改,但是一来需要多次尝试,二来我改过后出现了识别出多个对象或无法识别对象的问题,反而更麻烦.所以个人觉得还不如用SetToPropetrty来得更快些.




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