Prolang varchar2(60) 从ResourceBundle文件名中提取出来的表示语言的串,如从TestBundle_zh_CN.properties中提取出的zh_CN 从ResourceBundle文件 内容中提取出来的(key-value)对中的key Key value varchar2(400) Value1 location nvarchar2(400) 从ResourceBundle文件 内容中提取出来的(key-value),因为有的value非常长,已经超出了4000个字节的字段长度限制,所以如果value超过4000个字节,提取vlaue中前400个字节否则保留全部字节。注意是400个字节不是4000个字节,因为在WinRunner中完全可以通过正则表达式的使用将字符串截短,不用保留那么长的串。 clob 这是一个备份字段,当value超过4000个字节时把整个value备份到这里,否则为空 varchar2(1200) 保留(key-value)对的出处,即它来自于哪个ResourceBundle 注意:component和version字段是为了能更有效的翻译而引入的,在导入resourcebundle时应该确定它属于哪个component的哪个version,这样在翻译时就可以通过增加where判断条件来更具体化一个查询。
抛开如何获得prevalue先不说,最终要进行的select查询就是以下两种 ● SQL精确查询
☆ 获得key的SQL语句
select key from GLOBALRES where value=’Add Another Row’ and prolang=’en’ and component=’UIX’ and version=’10.1.2.0.2’
☆ 获得postvalue的SQL语句
假设上面的SQL语句查询出来的key是TABLE_ADD_ROW_SINGLE_TEXT,则获得postvalue的语句为: select value from GLOBALRES where key=’TABLE_ADD_ROW_SINGLE_TEXT’ and prolang=’zh_cn’ and component=’UIX’ and version=’10.1.2.0.2’ ● SQL模糊查询
☆ 获得key的SQL语句
select key from GLOBALRES where value like 'Certificate Mana%') and prolang=’en’ and component=’oca’ and version=’10.1.2.0.2’
☆ 获得postvalue的SQL语句
假设上面的SQL语句查询出来的key是OCAUIAdminTabText,则获得postvalue的语句为:
select value from GLOBALRES where key=’OCAUIAdminTabText’ and prolang=’zh_cn’ and component=’oca’ and version=’10.1.2.0.2’
看到这里,您也许会有一个疑问:从key到postvalue是一对一的关系,但是从prevalue到key则是多对一的关系,比如可能有多个key在英文下的value都是OK,这就是所谓的对象多翻译的情况,我们将在3.2.4小节说明如何处理这种情况。
11
3.1.2 操作系统级数据翻译
有时测试要打开一些操作系统级的窗口使用里面的一些对象,由于我们不知道如何获得它们的ResourceBundle,所以只好用一种最笨的办法: (1) 第一次将用到的操作系统级的对象手动搜集(可以使用WinRunner的Spy来录制)
在一起,保存成在一个单独的resourcebundle中;
(2) 以后再用到时,从这个resourcebundle里找。
在COFAL中,我们单独定义了一张表SYSRES来保存操作系统级的resourcebundle,表的结构如下: 字段名 win obj value lang 这张表的结果完全是按照WinRunner中“窗口和子对象”的模式定义的,我们规定: ● win字段和obj字段都只能是英文字符串,取对象在英文环境下的名字。如“Security
Alert”窗口中的“OK”按钮对应的win字段为“Security Alert”,ob字段为“OK”。 ● value字段实际上就是对象在不同语言环境下的名字。如“Security Alert”窗口
在英文下的value是“Security Alert”,在简体中文下的value是“安全警报”。
由于我们作出了这样的规定,操作系统级数据只能从英文翻译到其他语言,且prevalue等于key,这样就可以用key直接查找postvalue,省略了从prevalue到key的过程。
另外,在SYSRES中没有象GLOBALRES中的component和version字段,这是因为操作系统的版本比较固定,不象产品那样会有很多个release,同时获得component对我们来说意义也不大。当然,您也可以根据您的实际情况添加这两个或其他字段。
字段类型 varchar2(120) varchar2(120) 描述 窗口的绝对逻辑名 对象的相对逻辑名,当对象是窗口是该字段那为null nvarchar2(240) 对象的需要翻译的属性值 varchar2(10) 语言 3.2 翻译策略
需要翻译的prevalue来自于对象的属性值,但并不是所有的对象都需要翻译,即使需要
翻译也不是所有的属性都需要翻译,即使找到了需要翻译的属性,它的值也一定都可以直接翻译,可能要经过一些特殊处理才能够翻译。下面我们就来一一说明。
3.2.1 通过class属性来判断object是否需要翻译
每个object的定义里都肯定要包含它的class属性,通过class属性可以判断出该object是否需要翻译。
12
3.2.1.1 不需要翻译的class
以下class类型一般不需要翻译:
● edit
● combobox
● check_button ● list
● radio_button
3.2.1.2 需要翻译的object
除了以上那些不需要翻译的class外,其他的class类型基本上都需要翻译。
注意,以上我们所说的class都是WinRunner能够理解的标准的web class,如果您自定义了一些新的class类型,是否需要翻译要由实际情况而定。
在Oracle AS中我们没有定义新的class类,一些非标准的object也可以用标准的class类型定义,如Oracle AS中的某一按钮的定义如下:
\{
MSW_class: html_rect, class: object, html_name: \ location: 0 }
建议,尽量用WinRunner Spy来录制应用程序中的object,不要一开始就自己手动定义。这样你才能发现WinRunner是如何识别你的object的。
3.2.1.3 需要翻译的属性
一般情况下,对于那些需要翻译的object,下列属性需要翻译: ● label
● html_name
● attached_text
注意:一个object一般只具有上列三个属性中的一个,有哪个就翻译哪个。另外,需要翻译的属性可能不只是这三个,但是在我们的测试中这三个属性就足够了。
13
3.2.2 判断是Java应用程序级对象还是操作系统级对象
由3.1.1和3.1.2两个小节可以看出,Java应用程序级对象和操作系统级对象的处理是不一样的。如果一个GUI文件或script文件中同时包含这两种类型的对象定义时,该怎么办呢?由于操作系统级对象的数量比较少,所以每次我们尝试把对象作为操作系统级对象进行翻译,如果不成功作为Java应用程序级对象进行翻译,也就是说先SYSRES中查找,不成功再在GLOBALRES中查找。
3.2.3 翻译规则及其优先级
把从GUI文件中提取出的属性值看作是prevalue,配合其他查询条件最好的情况是可以找到value字段值就等于prevalue的行,进而取出key字段。但有时没有这么幸运,那么是否就要开始模糊查询了,要知道对value字段使用like查询可能会找到很多行,也就是说很多key。无论如何这应该是最后一招,在这之前我们还应该再做些什么的。在实践中我们发现,WinRunner在学习对象的时候可能会对得到的属性值做一定处理,而且java程序在绑定数据时也可能对绑定的key返回的value一定的处理。而我们只要找到这些规则,然后通过反向运用,就可以得到一些更纯粹的子prevlaue,翻译这些子prevalue再把翻译的结果按规则正向组合起来作为最终的postvalue。
下面要介绍的这些语法规则是在我们的测试中用到的。
3.2.3.1 WinRunner的语法规则
WinRunner有许多语法规则,我们用到的就是“!.*”。 使用spy的朋友都知道,如果串过长,WinRunner会自动把它截短并在串的头和尾分别加上“!”和“.*”。其中:“!”表示省略,必须放在串首;“.*”表示任意字符串,可以放在除串首外任何位置,一般放在串尾。
3.2.3.2 SQL语法规则
在SQL语句中,用单引号作为字符串的边界符,所以不论是做select精确查询还是select模糊查询,都要把prevalue中的单引号escape掉,escape符号是SQL中的escape符:“’”(单引号)。
注意:java中字符串的边界符是双引号,escape符号是:“\\”(反斜杠)
3.2.3.3 Oracle AS绑定数据时的语法规则
在我们的测试中用到的规则有以下4条:
14
● 全串匹配
如: “submit”翻译成中文就是“提交” ● 嵌套串 如“Edit Policy Result: UniqueCertificateCo”就是由“Edit Policy Result: {0}”嵌套“UniqueCertificateCo”组成的,也要分别绑定后再组合在一起。 ● 多串连接
如”OracleAS Certificate Authority-Advanced Search”就是由”OracleAS Certificate Authority”和”Advanced Search”用”-”连接组成的,分别绑定后用”-”连接在一起。
注意:OracleAS中只存在连接两个串的情况,也就是说即使prevalue中有多个”-”,也只有一个是其连接作用的,其他的都是子串内部的。
3.2.3.3 翻译规则的优先级
根据上面的语法规则,我们制定了以下的三种翻译规则类别,优先级由高到低: 1、 准备类别
准备类别的优先级最高,是在翻译前必须要判断的,它包括以下两条: ● winrunner的省略符规则 如果在prevalue的首尾发现有“!”和“.*”,则要先去掉“!”和“.*”作为新的prevalue;然后如果对象的绝对逻辑名包含prevalue,则用对象的绝对逻辑名作为新的prevalue ● Escape掉prevalue中所有的单引号 因为最终要用prevalue在表的value字段上“=”或like的select查询,而select语句中是用单引号作为字符串的边界符的,所以要escape掉prevalue内部中的单引号,也就是说在prevalue内部的每个单引号前再加一个单引号。
注意:这两条规则没有优先级,哪条先执行都可以。
2、 精确翻译类别
准备类别后,就是精确翻译类别。包括以下4条,优先级从高到低: ● 常量规则
指prevalue在常量列表中。 ● 精确匹配规则
指用prevalue做select精确查询成功。 ● 嵌套匹配规则
把GLOBALRES表中所有满足条件的value字段包含有“{0}”的所有值取出来,把每个值中的“{i}”用“(.*)”代替后做成pattern,用prevalue与每个pattern匹配,分别解析出被嵌套的串outer和嵌套的串inner,这样可能有多个解析的结果。要求在至少一种解析结果中,outer满足精确匹配规则表示成功,而对于每个inner串,要先进行常量规则判断和精确匹配规则判断,在不满足这两个规则的情况下,取inner串本身。 ● 连接串全精确匹配规则 如果prevalue中包含“-”,则用不同的”-”解析出所有不同的前后段tmpfir和tmplas。要求在至少一种解析下,满足如下条件时表示成功:
☆ tmpfir满足常量规则或精确匹配规则或嵌套匹配规则
15