跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

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

宋 强, 软件工程师, IBM
宋强,IBM China Development Lab 的一名软件测试工程师,他具有敏捷测试和测试自动化方面的经验,2010 年加入 IBM,一直从事自动化测试的工作。
陈 挚, 软件工程师, IBM
陈挚是 IBM China Development Lab 的一名软件测试工程师,他具有敏捷测试和测试自动化方面的经验,2010 年加入 IBM,从事自动化测试的开发已有4年。
尚 琨, 软件工程师, IBM
尚琨是 IBM China Development Lab 的一名软件测试工程师,她具有敏捷测试方面的经验,2010 年加入 IBM,从事项目管理工作。

简介: 本文主要介绍了一种验证时间日期格式的自动化方法。首先本文简要介绍了软件全球化的相关知识,以及简要叙述了 ICU 和 GVP 的相关内容,其次文章详细地介绍了如何实现时间日期格式的自动化验证。最后通过实例证明我们提出的方法具有较好的应用效果,并且具有较为广阔应用前景。

发布日期: 2011 年 12 月 08 日
级别: 中级
访问情况 : 2082 次浏览
评论: 


随着计算机产业的飞速发展,全球市场的不断扩大,产品的全球化已经成为软件应用开发中一个重要的环节,其目的是使程序能够跨多个文化地区可用而不必顾及语言及地区性的差别,要求其功能和设计不仅仅支持单一的语言和区域,还要保证一套确定的支持 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 中关于时间日期格式的标准
图 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. 在芬兰语中显示的日期格式
图 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 编程各个方面的文章。

讨论

  • 加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。

作者简介

宋强,IBM China Development Lab 的一名软件测试工程师,他具有敏捷测试和测试自动化方面的经验,2010 年加入 IBM,一直从事自动化测试的工作。

陈挚是 IBM China Development Lab 的一名软件测试工程师,他具有敏捷测试和测试自动化方面的经验,2010 年加入 IBM,从事自动化测试的开发已有4年。

尚琨是 IBM China Development Lab 的一名软件测试工程师,她具有敏捷测试方面的经验,2010 年加入 IBM,从事项目管理工作。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology
ArticleID=778825
ArticleTitle=全球化测试中时间日期格式的自动化验证方法
publish-date=12082011

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。