您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 用WinRunner做OracleAS的Globaliza
1用WinRunner实现软件的全球化测试作者:月白(笔名)甲骨文软件研究开发中心(北京)有限公司北京市海淀区中关村软件园孵化器2号楼A座一层邮编:100094移动电话:13651010781,邮件:tina.wang@oracle.com摘要本文采用循序渐进的方法详细的介绍了如何用WinRunner实现软件的全球化测试。当然,单靠WinRunner本身是无法完全实现的,我们开发了一个小程序COFAL来帮助WinRunner实现全球化测试。通过学习这篇文章,您可以掌握:●WinRunner的在全球化测试中的缺陷●WinRunner本身可用于全球化测试的地方●COFAL如何帮助WinRunner实现全球化测试●COFAL的实现细节关键字Globalization(g11n),Internationalization(i18n),localization(l10n),CodeOnceFitAllLanguage(COFAL)1.背景全球化已经成为当今软件发展的趋势,许多大型跨国软件公司都在亚洲设立了自己的专门从事全球化测试的部门。2004年的8月,我加入Oracle甲骨文北京研发中心,正式成为这其中的一员,我测试的软件是OracleApplicationServer10g,以下简称OracleAS。OracleAS是一个基于J2EE架构的应用系统,详细的介绍您可以参考OTN上的相关文档。1.1全球化中的概念全球化的英文是Globalization,由于单词较长,所以为了书写方便,通常缩写为G11N,中间的11代表首字母”G”和尾字母”N”之间省略的11个字母。引用”中国本地化”网站上对全球化的定义:Globalization是使产品或软件进入全球市场而进行的有关的商务活动。包括正确的国际化设计,本地化集成,以及在全球市场进行的市场推广、销售和支持的全部过程。全球化中与我们测试直接相关的有国际化设计和本地化集成。国际化的英文是internationlization,由于单词较长,通常缩写为I18N,中间的18代表首字母”I”和尾字母”N”之间省略的18个字母。引用”中国本地化”网站上的定义:国际化设计是指设计一个适用于多种语言和地区的应用程序的过程。适用于多种语言和地区2的含义是当使用不同语言及处于不同的地区的用户在使用这个应用程序时,应用程序必须使用他们能看懂的语言和符合他们文化习惯来显示信息。本地化的英文是localization,由于单词较长,通常缩写为L10N,中间的10代表首字母”L”和尾字母”N”之间生罗的10个字母。引用”中国本地化”网站上的定义:本地化是指将产品或软件针对特定国际语言和文化进行加工,使之符合特定区域市场的过程。真正的本地化要考虑目标区域市场的语言、文化、习俗和特性。通常包括改变软件的书写系统(输入法)、键盘使用、字体、日期、时间和货币格式等。Locale表示表示一个特定的地理、政治或文化的区域,在java中有Locale类,我们会在1.3小节中给出详细的描述1.2全球化测试的内容简单的说,全球化测试主要是测试软件的处理数据和显示数据的功能。以OracleAS为例:●处理不同的字符集(encoding)数据OracleInternetDirectory(简称OID)是一个LDAP服务器,数据保存在Oracle数据库中,现在想测试它创建用户的功能,要求用户的DN可以为不同国家的字符集,通俗的说,可以创建英文的DN,简体中文的DN和日文的DN等。当然具体可以创建哪些字符集的DN也要看当前Oracle数据库的字符集,只是那些在可以和当前字符集正确转换的字符集中的DN才可以正确的创建,否则很有可能无法创建或者创建的结果错误,如我们经常会看到的一些数据变成了问号(?)。●动态显示与Locale有关的数据OracleDelegatedAdministrationServices(简称DAS)是一个通过web页面访问的组件,页面的编码方式为UTF8,要求当选择不同的浏览器语言时,以下各项都可以显示为与当前Locale相符的形式:☆页上元素的文本类型的属性如某个页的标题,在英文下为“Home”,在中文下为“主页”;某个按钮上的标签,在英文下为“OK”,在中文下为“确定”。☆表示日期、时间、时区和货币等的文字如某个页上的一段表示出生日期的文字,在英文下显示为“January1,1976”,在中文下显示为“1976年1月1日”。1.3Java程序的国际化设计Java语言是平台无关的,它采用双字节字符编码(UTF16),在解决国际化问题上有天生的优势。下面我要介绍的是Java中“动态显示与Locale有关的数据”的原理。这里要用到的几个主要类都在java.util包(package)中,包括有Locale、ResourceBundle、ListResourceBundle、PropertyResourceBundle等,其继承关系如下图所示:3●Locale该类包含对主要地理区域的地域化特征的封装。通过设定Locale,我们可以为特定的国家或地区提供符合当地文化习惯的字体、符号、图标和表达格式。例如,我们可以通过获得特定Locale下的Calendar类的实例,显示符合特定表达格式的日期。Locale有以下三个构造函数:☆Locale(Stringlanguage)☆Locale(Stringlanguage,Stringcountry)☆Locale(Stringlanguage,Stringcountry,Stringvariant)language参数:代表两个小写英文字符的ISO语言编码,如zh表示Chinese,可用的语言编码可以参考::代表两个大写英文字符的ISO国家或地区编码,如,CN表示China,TW表示TAIWAN,国家代码对照表如下::代表与供应商或浏览器相关的代码。如,WIN表示windows,MAC表示Macintosh,POSIX表示POSIX。当有两个variant存在的话,用下划线(uderscore)连接,并把最重要的variant放在前面。下面是几个典型的Locale的例子Locale(ja)Locale(zh,CN)Locale(zh,TW,WIN)Locale(es,ESTraditional_WIN)Locale.getDefault(),得到当前Java虚拟机的宿主系统上默认的Locale●ResourceBundle该类是一个抽象类,它定义了三个静态方法来获得具体的实现类(ListResourceBundle的子类或PropertyResourceBundle类)的实例:☆staticfinalResourceBundlegetBundle(StringbaseName)等同于调用:getBundle(baseName,Locale.getDefault(),this.getClass.getClassLoader())使用的是系统缺省的Locale。☆staticfinalResourceBundlegetBundle(StringbaseName,Locale4locale)等同于调用:getBundle(baseName,locale,this.getClass.getClassLoader())使用的是参数locale指定的Locale。☆staticfinalResourceBundlegetBundle(StringbaseName,Localelocale,ClassLoaderloader)下面我们来说说baseName参数和locale参数。BaseName参数指定的是一组ReourceBundle的公共的基础名称,例如,设baseName等于“TestBundle”。如果用ListResourceBundle子类来实现,则要有如下这样的类:TestBundle.class、TestBundle_zh_CN.class和TestBundle_fr.class等;如果用PropertyResourceBundle来实现,则要有如下这样的属性文件:TestBundle.properties、TestBundle_zh_CN.properties和TestBundle_fr.properties等。locale参数和选择策略一起决定运行时具体选择这组ResourceBundle中的哪一个。假设locale参数指定的Locale为(language1,country1,variant1),系统默认的Locale为(language2,country2,variant2),则按照以下优先级的顺序查找最满足条件的ResourceBundle:baseName+_+language1+_+country1+_+variant1baseName+_+language1+_+country1baseName+_+language1baseName+_+language2+_+country2+_+variant2baseName+_+language2+_+country2baseName+_+language2baseName在每一种情况下,会先尝试按ListResourceBundle类的方式加载,失败后会再尝试按照访问属性文件的方式加载PropertyResourceBundle类。如果所有这些情况都没有找到的话最后会抛出一个MissingResourceException的异常。注意,在第一个getBundle静态函数中locale参数指定的Locale就是系统默认的Locale。●ListResourceBundle该类继承ResourceBundle类,也是一个抽象类。它实现了ResourceBundle类中的抽象函数getKeys()和handleGetObject(Stringkey),并提供了一个抽象函数getContents()。在应用中,通过创建继承ListResourceBundle的子类来实现ResourceBundle。要求子类必须实现getContents函数并提供一个包含有一组属性对的数组,如:packageoracle.cdc.sgt.unicode;importjava.util.ListResourceBundle;publicclassMResourcesextendsListResourceBundle{5publicObject[][]getContents(){returncontents;}staticfinalObject[][]contents={{s1,Home}};}packageoracle.cdc.sgt.unicode;importjava.util.ListResourceBundle;publicclassMResources_zh_CNextendsListResourceBundle{publicObject[][]getContents(){returncontents;}staticfinalObject[][]contents={{s1,主页}};}下面是一个java类根据不同的Locale从相应的ListResourceBundle子类中取数据来显示:packageoracle.cdc.sgt.unicode;importjava.util.ResourceBundle;importjava.util.Locale;publicclassTestListResourceBundle{publicstaticvoidmain(String[]args){ResourceBundlemessages;Locale
本文标题:用WinRunner做OracleAS的Globaliza
链接地址:https://www.777doc.com/doc-14423 .html