简介:本文主要介绍了一种验证时间日期格式的自动化方法。首先本文简要介绍了软件全球化的相关知识,以及简要叙述了ICU和GVP的相关内容,其次文章详细地介绍了如何实现时间日期格式的自动化验证。最后通过实例证明我们提出的方法具有较好的应用效果,并且具有较为广阔应用前景。
随着计算机产业的飞速发展,全球市场的不断扩大,产品的全球化已经成为软件应用开发中一个重要的环节,其目的是使程序能够跨多个文化地区可用而不必顾及语言及地区性的差别,要求其功能和设计不仅仅支持单一的语言和区域,还要保证一套确定的支持Unicode的语言以及特定区域的相关数据能够正常输入、显示、输出。软件全球化能力是一个关系到产品市场覆盖率、客户满意度、系统稳定性和可用性,以及产品人文支持度的重要问题。
为了保证软件产品全球化的质量,就需要进行全球化方面的测试。与全球化开发过程相对应的全球性软件测试过程,包含一系列相互关联的测试技术和流程。全球化测试与一般的性能或者功能测试不一样。因此,我们需要研究一套较为规范的测试方法以保证全球化测试的质量。这对于产品全球化具有非常重要的实用价值。
概述
GVT(GlobalizationVerificationTest)是软件开发周期中是一个重要的阶段。GVT不仅为了确保软件可以被翻译成多国语言地区的版本,更重要的是要确保软件可以支持各类文化的日期、时间、数字、货币格式规则,支持不同的语言输入系统、字符集、键盘布局等。
在GVT测试中,时间日期格式的测试是非常重要的测试点,也是非常繁琐,是很容易出错的测试点之一。由于全世界不同地区国家的日期格式是不统一的,同一个国家和地区的不同区域之间也可能存在许多差异。虽然每种日期格式都是由日、月和年来表示,但它们的表示顺序和分隔符却是不相同的,不同文化的日历也是不同的。除了日期的格式有多种形式,时间的格式同样也具有多文化差异的。因为不同的国家/地区所处的时区不同,有的使用12小时制,有的则是使用24小时制。此外,用于分隔小时、分、秒的分隔符也是不同的。
目前针对时间日期格式的GVT测试多是由测试人员手动地切换软件或操作系统的国家区域设置,用眼睛直观地对比软件上显示的格式和ICU(InternationalComponentforUnicode)标准中对其的规定是否一致。在测试过程中,测试人员很容易遗漏一些特殊的国家和地区,并且各种时间日期格式的不同排列组合容易混淆,格式中的分隔符差异又非常细小,这样就有很大可能带来漏测,误测的风险。我们提出了以一种自动化测试方法,可以有效地测试人员的提高测试效率,帮助他们发现一些容易遗漏的关于时间日期格式验证方面的问题。
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(GlobalizationVerificationPackage)是基于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. } |