WinRunner

2019-04-15 15:55

用WinRunner实现软件的全球化测试

作者:月白(笔名)

甲骨文软件研究开发中心(北京)有限公司

北京市海淀区中关村软件园孵化器2号楼A座一层 邮编:100094 移动电话:13651010781,邮件:tina.wang@oracle.com

摘要

本文采用循序渐进的方法详细的介绍了如何用WinRunner实现软件的全球化测试。当然,单靠WinRunner本身是无法完全实现的,我们开发了一个小程序COFAL来帮助WinRunner实现全球化测试。通过学习这篇文章,您可以掌握: ● WinRunner的在全球化测试中的缺陷 ● WinRunner本身可用于全球化测试的地方 ● COFAL如何帮助WinRunner实现全球化测试 ● COFAL的实现细节

关键字

Globalization(g11n),Internationalization(i18n),localization(l10n),Code Once Fit All Language(COFAL)

1. 背景

全球化已经成为当今软件发展的趋势,许多大型跨国软件公司都在亚洲设立了自己的专门从事全球化测试的部门。2004年的8月,我加入Oracle甲骨文北京研发中心,正式成为这其中的一员,我测试的软件是Oracle Application Server 10g,以下简称Oracle AS。Oracle AS是一个基于J2EE架构的应用系统,详细的介绍您可以参考OTN上的相关文档。

1.1 全球化中的概念

全球化的英文是Globalization,由于单词较长,所以为了书写方便,通常缩写为G11N,

中间的11代表首字母”G”和尾字母”N”之间省略的11个字母。

引用”中国本地化”网站上对全球化的定义:Globalization是使产品或软件进入全球市场而进行的有关的商务活动。包括正确的国际化设计,本地化集成,以及在全球市场进行的市场推广、销售和支持的全部过程。

全球化中与我们测试直接相关的有国际化设计和本地化集成。

国际化的英文是internationlization,由于单词较长,通常缩写为I18N,中间的

18代表首字母”I”和尾字母”N”之间省略的18个字母。引用”中国本地化”网站上的定义:国际化设计是指设计一个适用于多种语言和地区的应用程序的过程。适用于多种语言和地区

1

的含义是当使用不同语言及处于不同的地区的用户在使用这个应用程序时,应用程序必须使用他们能看懂的语言和符合他们文化习惯来显示信息。

本地化的英文是localization,由于单词较长,通常缩写为L10N,中间的10代表首字

母”L”和尾字母”N”之间生罗的10个字母。引用”中国本地化”网站上的定义:本地化是指将产品或软件针对特定国际语言和文化进行加工,使之符合特定区域市场的过程。真正的本地化要考虑目标区域市场的语言、文化、习俗和特性。通常包括改变软件的书写系统(输入法)、键盘使用、字体、日期、时间和货币格式等。

Locale表示表示一个特定的地理、政治或文化的区域,在java中有Locale类,我们会在1.3小节中给出详细的描述

1.2 全球化测试的内容

简单的说,全球化测试主要是测试软件的处理数据和显示数据的功能。以Oracle AS为例: ● 处理不同的字符集(encoding)数据

Oracle Internet Directory(简称OID)是一个LDAP服务器,数据保存在Oracle数据库中,现在想测试它创建用户的功能,要求用户的DN可以为不同国家的字符集,通俗的说,可以创建英文的DN,简体中文的DN和日文的DN等。当然具体可以创建哪些字符集的DN也要看当前Oracle数据库的字符集,只是那些在可以和当前字符集正确转换的字符集中的DN才可以正确的创建,否则很有可能无法创建或者创建的结果错误,如我们经常会看到的一些数据变成了问号(?)。 ● 动态显示与Locale有关的数据

Oracle Delegated Administration Services(简称DAS)是一个通过web页面访问的组件,页面的编码方式为UTF8,要求当选择不同的浏览器语言时,以下各项都可以显示为与当前Locale相符的形式:

☆ 页上元素的文本类型的属性

如某个页的标题,在英文下为“Home”,在中文下为“主页”;某个按钮上的标签,在英文下为“OK”,在中文下为“确定”。 ☆ 表示日期、时间、时区和货币等的文字

如某个页上的一段表示出生日期的文字,在英文下显示为“January 1, 1976”,在中文下显示为“1976年1月1日”。

1.3 Java程序的国际化设计

Java语言是平台无关的,它采用双字节字符编码(UTF16),在解决国际化问题上有天生的优势。下面我要介绍的是Java中“动态显示与Locale有关的数据”的原理。

这里要用到的几个主要类都在java.util包(package)中,包括有Locale、ResourceBundle、ListResourceBundle、PropertyResourceBundle等,其继承关系如下图所示:

2

● Locale

该类包含对主要地理区域的地域化特征的封装。通过设定Locale,我们可以为特定的国家或地区提供符合当地文化习惯的字体、符号、图标和表达格式。例如,我们可以通过获得特定Locale下的Calendar类的实例,显示符合特定表达格式的日期。Locale有以下三个构造函数:

☆ Locale(String language)

☆ Locale(String language,String country)

☆ Locale(String language,String country,String variant)

language参数:代表两个小写英文字符的ISO语言编码,如zh表示Chinese,可用的语言编码可以参考:

http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt

country参数:代表两个大写英文字符的ISO国家或地区编码,如,CN表示China,TW表示TAIWAN,国家代码对照表如下:

http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.html variant参数:代表与供应商或浏览器相关的代码。如,WIN表示windows,MAC表示Macintosh,POSIX表示POSIX。当有两个variant存在的话,用下划线(uderscore)连接,并把最重要的variant放在前面。

下面是几个典型的Locale的例子 Locale(\

Locale(\

Locale(\

Locale(\

Locale.getDefault(),得到当前Java虚拟机的宿主系统上默认的Locale

● ResourceBundle

该类是一个抽象类,它定义了三个静态方法来获得具体的实现类(ListResourceBundle的子类或PropertyResourceBundle类)的实例:

☆ static final ResourceBundle getBundle(String baseName) 等同于调用:

getBundle(baseName,Locale.getDefault(),this.getClass.getClassLoader())

使用的是系统缺省的Locale。

☆ static final ResourceBundle getBundle(String baseName,Locale

3

locale) 等同于调用:

getBundle(baseName,locale,this.getClass.getClassLoader()) 使用的是参数locale指定的Locale。

☆ static final ResourceBundle getBundle(String baseName,Locale

locale,ClassLoader loader)

下面我们来说说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 + \+ variant1 ? baseName + \? baseName + \

? baseName + \+ language2 + \+ country2 + \+ variant2 ? baseName + \? baseName + \? baseName

在每一种情况下,会先尝试按ListResourceBundle类的方式加载,失败后会再尝试按照访问属性文件的方式加载PropertyResourceBundle类。如果所有这些情况都没有找到的话最后会抛出一个MissingResourceException的异常。

注意,在第一个getBundle静态函数中locale参数指定的Locale就是系统默认的Locale。

● ListResourceBundle

该类继承ResourceBundle类,也是一个抽象类。它实现了ResourceBundle类中的抽象函数getKeys()和handleGetObject(String key),并提供了一个抽象函数getContents()。在应用中,通过创建继承ListResourceBundle的子类来实现ResourceBundle。要求子类必须实现getContents函数并提供一个包含有一组属性对的数组,如:

package oracle.cdc.sgt.unicode;

import java.util.ListResourceBundle;

public class MResources extends ListResourceBundle {

4

public Object[][] getContents() { return contents; }

static final Object[][] contents = { {\ }; }

package oracle.cdc.sgt.unicode;

import java.util.ListResourceBundle;

public class MResources_zh_CN extends ListResourceBundle { public Object[][] getContents() { return contents; }

static final Object[][] contents = { {\主页\ }; }

下面是一个java类根据不同的Locale从相应的ListResourceBundle子类中取数据来显示:

package oracle.cdc.sgt.unicode; import java.util.ResourceBundle; import java.util.Locale;

public class TestListResourceBundle {

public static void main(String[] args) { ResourceBundle messages; Locale curloc; try {

if (args.length != 2) {

curloc = Locale.getDefault(); } else {

curloc = new Locale(args[0], args[1]); }

messages = ResourceBundle.getBundle(

\ System.out.println(messages.getString(\ } catch (Exception e) { System.out.println(e); } } }

把这三个类加入到classpath中,运行“java TestListResourceBundle zh CN”或在简体中文操作系统上运行“java TestListResourceBundle”,打印出“主页”;运行“java TestListResourceBundle en”或在英文操作系统上运行“java

5


WinRunner.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:第四版人民币冠号印制顺序表

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: