您的位置:知识库 » 软件测试

全球化测试——时间日期格式的自动化验证方法

来源: developerWorks  发布时间: 2011-12-12 15:37  阅读: 1114 次  推荐: 0   原文链接   [收藏]  
摘要:本文主要介绍了一种验证时间日期格式的自动化方法。首先本文简要介绍了软件全球化的相关知识,以及简要叙述了 ICU 和 GVP 的相关内容,其次文章详细地介绍了如何实现时间日期格式的自动化验证。最后通过实例证明我们提出的方法具有较好的应用效果,并且具有较为广阔应用前景。

  随着计算机产业的飞速发展,全球市场的不断扩大,产品的全球化已经成为软件应用开发中一个重要的环节,其目的是使程序能够跨多个文化地区可用而不必顾及语言及地区性的差别,要求其功能和设计不仅仅支持单一的语言和区域,还要保证一套确定的支持 Unicode 的语言以及特定区域的相关数据能够正常输入、显示、输出。软件全球化能力是一个关系到产品市场覆盖率、客户满意度、系统稳定性和可用性,以及产品人文支持度的重要问题。

  为了保证软件产品全球化的质量,就需要进行全球化方面的测试。与全球化开发过程相对应的全球性软件测试过程,包含一系列相互关联的测试技术和流程。全球化测试与一般的性能或者功能测试不一样。因此,我们需要研究一套较为规范的测试方法以保证全球化测试的质量。这对于产品全球化具有非常重要的实用价值。

  概述

  GVT(Globalization Verification Test)是软件开发周期中是一个重要的阶段。 GVT 不仅为了确保软件可以被翻译成多国语言地区的版本,更重要的是要确保软件可以支持各类文化的日期、时间、数字、货币格式规则,支持不同的语言输入系统、字符集、键盘布局等。

  在 GVT 测试中,时间日期格式的测试是非常重要的测试点,也是非常繁琐,是很容易出错的测试点之一。由于全世界不同地区国家的日期格式是不统一的,同一个国家和地区的不同区域之间也可能存在许多差异。虽然每种日期格式都是由日、月和年来表示,但它们的表示顺序和分隔符却是不相同的,不同文化的日历也是不同的。除了日期的格式有多种形式,时间的格式同样也具有多文化差异的。因为不同的国家 / 地区所处的时区不同,有的使用 12 小时制,有的则是使用 24 小时制。此外,用于分隔小时、分、秒的分隔符也是不同的。

  目前针对时间日期格式的 GVT 测试多是由测试人员手动地切换软件或操作系统的国家区域设置,用眼睛直观地对比软件上显示的格式和 ICU(International Component for Unicode) 标准中对其的规定是否一致。在测试过程中,测试人员很容易遗漏一些特殊的国家和地区,并且各种时间日期格式的不同排列组合容易混淆,格式中的分隔符差异又非常细小,这样就有很大可能带来漏测,误测的风险。我们提出了以一种自动化测试方法,可以有效地测试人员的提高测试效率,帮助他们发现一些容易遗漏的关于时间日期格式验证方面的问题。

  GVP 与 ICU

  ICU 是 IBM 与开源组织合作研究,基于“IBM 公共许可证”的用于支持软件国际化的开源项目。它是一套稳定成熟、功能强大、轻便易用和跨平台支持 Unicode 的开发包,使得开发人员在 C/C++ 和 Java 上开发全球化软件产品更容易,ICU 是由 IBM 发布和维护,并且是开放源代码的。ICU4 提供了 Java 和 C/C++ 平台强大的国际化开发能力,软件开发者几乎可以使用 ICU 解决任何国际化的问题,根据各地的风俗和语言习惯,实现对数字、 货币、时间、日期、和消息的格式化、解析,对字符串进行大小写转换、整理、搜索和排序等功能。另外,ICU 也提供了强大的 BIDI 算法,对阿拉伯语等 BIDI 语言提供了完善的支持。ICU 分为 ICU4J 和 ICU4C,分别对应 Java 和 C/C++ 平台。

  GVP (Globalization Verification Package) 是基于 ICU4J 开发的一个供全球化测试中自动化测试的软件包,里面封装了一些全球化测试中关于日期测试的很多方法。包括格式化日期时间、标准化日期时间格式验证,不同时区 ( 包括夏令时 ) 日期时间格式换算等。GVP 中所有方法都是严格按照 ICU 标准来进行书写,故 GVP 有着强大的理论背景的支持,它能够用来做标准格式化和一些验证操作。我们在 GVP 中实现了时间日期格式、排序、数字格式化、串联问题、文件操作等验证方法,下面本文将针对时间日期格式的验证方法做详细描述。

  GVP 中日期时间格式的具体实现

  对 GVP 中日期时间的问题加以分析

  在 GVP 中的类是 gvp.DataComputation.DateTimeByLocal。文件头包含 ICU 的引用:

 importcom.ibm.icu.util.ULocale; 
importcom.ibm.icu.text.DateFormat;
importcom.ibm.icu.util.Calendar;
importcom.ibm.icu.util.TimeZone;

  获取英文时间格式的风格

  当我们需要验证一个日期时间格式是否符合标准时,有一个重要的参数就是日期时间格式的风格,我们经常需要在英文环境下获取它的风格。
  清单 1

 System.out.println(getEnstyle("Sep 8, 2011")); 
打印 :2(Medium)

-----------------------------------------------------
public static int getEnstyle(String enDate){
DateFormat df;
df=DateFormat.getDateInstance(MEDIUM,ULocale.ENGLISH);
try{
df.parse(enDate);
return MEDIUM;
}catch(Exception e){
//e.printStackTrace();
}
df=DateFormat.getDateInstance(Long,ULocale.ENGLISH);
try{
df.parse(enDate);
return Long;
}catch(Exception e){
//e.printStackTrace();
}
df=DateFormat.getDateInstance(FULL,ULocale.ENGLISH);
try{
df.parse(enDate);
return FULL;
}catch(Exception e){
//e.printStackTrace();
}
df=DateFormat.getDateInstance(SHORT,ULocale.ENGLISH);
try{
df.parse(enDate);
return SHORT;
}catch(Exception e){
//e.printStackTrace();
}
return -1;
//if return -1, English date format is wrong.
}

  对 Date 类型数据进行格式化返回目标语言环境下的日期格式。比如我们现在需要把得到当前日期 2011 年 9 月 9 日的法语环境下的长日期格式。
  清单 2

 System.out.println(GetDateByLocal(new Date(),DateTimeByLocal.Long,new Locale("fr_FR"))); 
打印 : 9 septembre 2011

--------------------------------------------------------------
public static String GetDateByLocal(Date date,int style,Locale locale){
DateFormat df;
if(locale.equals(Locale.CHINA))
df = DateFormat.getDateInstance(style, ULocale.CHINA);
else
df = DateFormat.getDateInstance(style, locale);
return df.format(date);
}

  由于在自动化测试阶段,我们的数据都是从 UI 得到的,所以默认为字符串类型,这里对字符串类型数据在同一个 Locale 下不同风格之间进行转换 , 比如在简中环境下 2011-9-9 是中日期格式,转换为长日期格式后为 2011 年 9 月 9 日。
  清单 3

 System.out.println(DateFormatTransform("2011-9-9",DateTimeByLocal.MEDIUM,\
DateTimeByLocal.Long,new Locale("zh_cn")));
打印 : 2011 年 9 月 9 日

-----------------------------------------------------------
public static String DateFormatTransform(String sDate,int OrignStyle,int targetStyle,\
Locale locale){
DateFormat df;
java.util.Date dt = null;
String longDate = "";
if(locale.equals(Locale.CHINA))
df = DateFormat.getDateInstance(OrignStyle, ULocale.CHINA);
else
df = DateFormat.getDateInstance(OrignStyle, locale);
try {
dt = df.parse(sDate);
} catch (ParseException e) {
e.printStackTrace();
}
if(dt!=null)
longDate = DateTimeByLocal.GetDateByLocal(dt,targetStyle, locale);
return longDate;
}

  在全球化测试中,我们有不同国家间时间的测试,也就是同一个日期时间在不同国家时间日期格式以及时区的校验。比如一个在北京时间是 2011-9-9 上午 11:16:26,但是在美国洛杉矶时间就是 Sep 8, 2011 8:44:01 PM,其中包含了夏令时的校验。由于 time zone 的参数比较特别,所以此方法不常用。
  清单 4

 System.out.println(DateTimeFormatTransform("2011-9-9 上午 11:16:26",\
DateTimeByLocal.MEDIUM,DateTimeByLocal.MEDIUM,DateTimeByLocal.MEDIUM,\
DateTimeByLocal.MEDIUM,new Locale("zh_cn"),new Locale("en_US"),\
"America/Los_Angeles"));
打印 : Sep 8, 2011 8:16:26 PM
-------------------------------------------------------
public static String DateTimeFormatTransform(String sDate,\
int orignDateStyle,int orignDateTimeStyle,int targetDateStyle,\
int targetTimeStyle,Locale orignLocale,Locale targetLocale,\
String timezone){
DateFormat df;
java.util.Date dt = null;
String longDate = "";
if(orignLocale.equals(Locale.CHINA))
df = DateFormat.getDateTimeInstance(orignDateStyle,orignDateTimeStyle, ULocale.CHINA);
else
df = DateFormat.getDateTimeInstance(orignDateStyle,orignDateTimeStyle, orignLocale);
try {

dt = df.parse(sDate);
} catch (ParseException e) {
e.printStackTrace();
}
if(dt!=null)

longDate = DateTimeByLocal.GetTimeByLocale(dt,targetDateStyle,targetTimeStyle,\
targetLocale,timezone);
return longDate;
}

  时间格式的标准格式化和验证与日期大同小异,这里就不在赘述。但需要说明的是,在调用 ICU 库时,应该保持与测试软件的 ICU 版本一致 , 因为不同版本之间会有一些小差别。

  日期时间格式自动化验证方法在实际测试中的应用

  下面以我们目前开发的一个自动化测试项目 Symphony 系列产品为例来具体介绍如何自动化验证时间日期格式。图 1 给出了在 ICU 中关于时间日期的标准格式,其中 8/15/11 在 ICU 的日期格式中属于短日期格式。

图 1. ICU 中关于时间日期格式的标准

  清单 5 列出了在不同语言环境下自动验证 8/15/11 的日期格式的代码。
  清单 5

 public void testMain(Object[] args) { 
// 要被测试的不同国家的语言
String []countryGroup = {"Brazil","China","Denmark","Finland","France",\
"Germany","Greece","Italy","Japan","Netherlands","Norway","Poland",\
"Portugal", "Russia", "South Korea", "Spain", "Spain(Catalan)","Sweden",\
"Taiwan(China)","Thailand", "Turkey", "United States"};
// 与系统 locale 相同的不同语言的缩写
String []localeGroup = {"pt_BR","zh_Hans_CN","da_DK","fi_FI",\
"fr_FR","de_DE","el_GR","it_IT", "ja_JP","nl_NL","no_NO",",\
"pl_PL",pt_PT","ru_RU","ko_KR","es_ES","ca_ES","sv_SE","zh_TW",\
"th_TH","tr_TR","en_US"};
int i = 0;
CommonTask.login();
sleep(5);
// 创建一个 Speardsheet
CommonTask.newSpreadsheet();
sleep(5);
info("A1 = 8/15/11");
// 在 A1 中输入日期 8/15/11
SpreadsheetTask.selectRange("A1");
sleep(3);
inputKeys("8/15/11");
sleep(2);
for(i=0; i<=21; i++){
// 选择要测试的语言
SpreadsheetTask.selectCountry(countryGroup[i]);
sleep(2);
// 读取 A1 中的内容
String Num = Element.getText("\
//div[@class='dojoxGridMasterView']/div[2]/div/div/div/div/table/tbody/tr/td[1]");
System.out.println(countryGroup[i] + ":" + Num);
// 验证该语言是否符合短日期格式的要求
Verify.verifyTrue("The format 8/15/11 is Correctly", \
gvp.DataComputation.DateTimeByLocal.isValidDate(Num, DateFormat.SHORT, localeGroup[i]));
inputKeys("{F5}");
sleep(8);
}
}

  清单 5 详细地给出了如何实现日期的验证代码。具体的操作步骤:首先新建一个 Spreadsheet,在 A1 栏中输入要测试的时间日期,例如:8/15/11,将语言选项选到要测试语言,刷新页面,验证日期是否和该国家的日期格式相匹配。在我们测试测试的产品中一共包含 22 种语言需要进行测试,用自动化的方法可以快捷、准确地得到测试结果,比起测试人员的手工测试,节省了大量的时间,提高了测试的效率。

  另外需要说明的是,本文代码主要是以 RFT 和 Selenium 为自动化测试平台进行编写。实践证明使用这套自动化架构可以提高运行脚本的速度,对于 Web 测试具有较好的应用效果。自动化开发人员只需要将 GVP 的代码导入工程,直接调用即可便捷地使用里面所有的实现方法。图 2 给出了利用上述代码在芬兰语环境下验证日期的过程截图。

图 2. 在芬兰语中显示的日期格式

  验证的运行结果如下:

 Finland: 15.8.2011 
14:19:30 46 VP Pass. The format 8/15/11 is Correctly Expected: true Actual: true

  从图 2 中可以看出,当用户在芬兰的环境下,输入短日期的时间,产品可以显示出相应的日期格式,通过调用本文提出的方法,可以自动去验证显示的日期是否符合芬兰的日期要求,利用在英文下短日期格式是 8/15/11,而在芬兰语下短日期格式为 15.8.2011。我们的方法提供了有效地 log 及截图,可以使测试人员方便地查看。例如上述的运行结果测试人员可以清楚地看出的运行结果是 Pass,证明日期显示正确,符合芬兰的日期要求。

  通过本文提出的方法可以较为快捷,准确地验证时间日期格式,以达到全球化验证的工作,减少了测试人员的工作量,提高了测试人员的工作效率。通过本文的方法可以覆盖更多的测试平台及测试语言。

  总结

  本文我们简要介绍了全球化测试的相关领域,以及 ICU 及 GVP 的相关知识,详细给出了一种在全球化测试中如何实现利用自动化方法验证有关时间日期格式的问题,相信通过该方法可以有地提高测试人员的测试效率,减少测试人员的工作量,在实践中这种自动化方法也有着较好的应用效果。

  参考资料

  学习

  • 参考 ICU 手册,查看 ICU 中关于时间日期格式的验证规则。
  • 参考 ICU用户手册,了解 ICU 的具体使用方法。
  • 参考 ICU4C 介绍 : C/C++ 平台强大的国际化应用开发组件,文章介绍 C++ 平台强大的国际化应用开发组件 ICU4C,并且重点讨论 ICU4C 的特性。
  • 参考 ICU4C 在 IBM Lotus Symphony 中的应用,文章描述了使用 ICU 来完善 Lotus Symphony 字符串处理机制的解决方案。
  • 批处理文件国际化支持解决方案”(developerWorks,2008 年 9 月):随着软件应用的迅速推广与发展,应用软件无一例外的面临着支持多国家多语种的国际化问题,基于 Windows 的批处理文件应用广泛,然而作为一种通用脚本语言,批处理脚本没有提供一种体系化的多语言国际化支持。本文首先介绍编程语言和国际标准化对多语言问题作出的努力;其次,给出了通用多语言支持解决方案的灵活架构设计;再次,给出了批处理文件的轻量级、灵活架构的通用多语言支持解决方案,以及基于该解决方案构建支持多语言的批处理软件系统的一般步骤;最后作了一定的总结和展望。
  • 图书:全球化软件开发最佳实践,第 5 章:Java SE 国际化开发”(developerWorks,2009 年 5 月):本书是介绍全球化基本体系结构、技术和方法的经典力作。本章介绍了介绍国际化软件体系结构的特点及组成要素,包括单一可执行体、区域模型、多语言输入/输出和本地化等。
  • 图书:全球化软件开发最佳实践,第 6 章:Java Web国际化开发”(developerWorks,2009 年 5 月):本书是介绍全球化基本体系结构、技术和方法的经典力作。本章介绍了介绍国际化软件体系结构的特点及组成要素,包括单一可执行体、区域模型、多语言输入/输出和本地化等。
  • developerWorks Java 技术专区:这里有数百篇关于 Java 编程各个方面的文章。

软件测试热门文章

    软件测试最新文章

      最新新闻

        热门新闻