劉雅君,李愛民,劉 晟,袁 婷
(西安理工大學,西安 710043)
國際化軟件的硬編碼和過度翻譯問題自動測試研究①
劉雅君,李愛民,劉 晟,袁 婷
(西安理工大學,西安 710043)
伴隨軟件國際化開發技術不斷發展的同時,國際化測試的研究起更多重視.本文針對國際化軟件中的硬編碼和過度翻譯兩個問題,研究并實現了自動化測試方案.通過分析硬編碼和過度翻譯問題的概念、分類和測試方法現狀,本文總結現有人工測試的不足和Struts2國際化的技術特點,最后結合被測項后的實際情況,詳細闡述了自動化測試方案.該方案已經應用于某公司的Web產品的國際化測試中,實踐驗證了對硬編碼和過度翻譯問題的自動測試的支持,并取得了良好的效果.
軟件國際化測試;硬編碼;過度翻譯;自動化測試
早期的軟件產品一般只能支持單一的語言,且以英語為主要語言.然而,伴隨軟件技術的推廣和普遍應用,技術人員也開始積極考慮處理非英語語言的支持問題.因此,軟件的國際化和本地化逐步起重視.
在軟件開發中,國際化與本地化是指調整軟件,使之能適用于不同的語言及地區[1].其中,國際化(Internationalization)是指將軟件與特定語言及地區解耦的過程,即軟件設計和文檔開發過程中,使得功能和代碼設計能處理多種語言和文化習俗,能夠在創建不同語言版本時,不需要重新設計源程序代碼的軟件工程方法.本地化(Localization)則是指當移植軟件時,使之與特定語言及地區耦合的過程.國際化意味著產品有適用于任何地方的“潛力”;本地化則是為了更適合于“特定”地方的使用.對一項軟件產品來說,國際化只需做一次,但本地化則要針對不同的區域各做一次.這兩者之間是互補的,并且兩者合起來才能讓一個系統適用于各種語言和地區[2].
針對國際化軟件開發,國際化測試的后的是測試軟件的國際化支持能力,發現國際化軟件的潛在問題,保證軟件在世界不同區域中都能正常運行.國際化測試工作一般包括四個級別[3]:
①第一級國際化測試
測試英文版本的產品是否可以在非英語語言系統上正常運行.
②第二級國際化測試
測試軟件在任何區域設置中是否能正常運行,并且是否支持本地化的字符輸入,輸出和顯示;是否能按照本地化的習慣顯示姓名、日期、時間、貨幣等數據等.
③第三級國際化測試
測試測試軟件是否不需要重新設計或修改代碼方便地進行本地化.
④第四級國際化測試
測試是否支持雙向識別能力,主要指對于阿拉伯語等雙向語言的支持問題.
測試人員會根據項后資源和市場情況要求決定具體到某個級別的測試.總之,伴隨全球化的趨勢,軟件的國際化測試日益重要,這將為軟件本地化、軟件維護、升級帶來了極大的好處.
軟件國際化的測試通常在本地化開始前進行,以識別潛在的不支持軟件國際化特性的問題.理想的情況是,國際化測試在英文版本完成時就已結束.對于國際化軟件,硬編碼和過度翻譯問題是不可忽視的重要問題.
硬編碼問題是指將需要翻譯的字符串沒有提取到資源文件中.早期在不考慮國際化編程的情況下,顯示在網頁頁面的的數據大部分都是硬編碼在頁面中的.例如,一個頁面的標題可能采用如下的編碼方式:
其中“Demo”就是以硬編碼方式存在的.正常的國際化下,應該將這樣的字符串提取到資源文件中.根據本地瀏覽器區域設置,通過國際化程序框架調用對應字符串顯示.類似于“Demo”這樣的需要翻譯的字符串有很多,一般分為兩類,詳述如下:
①第一類硬編碼問題
第一類硬編碼問題是指不影響程序功能,只影響用戶界面顯示的硬編碼問題,這類問題比較常見.硬編碼的字符串,主要指的用戶界面上顯示的文字,例如標簽名,按鈕名稱,提示語等等.這些文字本沒有從程序中分離,確實不利于以后軟件本地化,但是僅涉及前節所述的第三級國際化測試工作.因此,這類缺陷等級不高,代碼修改較易,只需將這些遺漏的字符串將重新提取到資源文件,請翻譯專家翻譯.
值得注意的是,在這一類硬編碼的問題,不僅要測試頁面文件,而且要注意測試控制層代碼.例如在JSP項后中,Action類中方法也可能存在這類硬編碼問題.
②第二類硬編碼問題
第二類硬編碼問題指的是會影響程序功能的硬編碼問題.這類問題一般級別較高,涉及前節所述的第一級國際化測試工作.這類問題數量較少,比較隱蔽,主要涉及系統變量被硬編碼等情況.例如在Windows系統中,軟件的默認安裝路徑“C:Program Files”.微軟在做本地化操作系統時,這些字符串在部分語言操作系統中進行了翻譯.因此,如果這些字符串硬編碼后,將起相關系統功能的失常.
事物有兩面性,如果字符串分離不當,還會起另一類問題,稱為過度翻譯問題(Over translation),主要涉及第一級和第三級國際化測試工作.
過度翻譯問題是指將一些不需要本地化的內容提取到資源文件中,從而可能發用戶界面問題或軟件功能問題.例如,在頁面首頁提示語中包含時間數據.如果不慎將這個時間和提示語中的其他字符一起提取到資源文件中,則這個時間將不能根據系統的區域設置來進行變換.
針對上述問題,主要仍然依靠人工測試完成.例如第一類硬編碼問題測試工作,一般使用偽本地化加人工瀏覽的方法完成.偽翻譯(Pseudo Translation)是軟件國際化測試的重要手段之一,它不是軟件真正本地化,而是在源語言軟件的基礎上,按照一定的規則,將需要本地化的文本使用本地化文字進行替換,模擬本地化軟件的過程[4].這樣可以在進行實際本地化處理之前,預覽和查看本地化的問題.
具體操作主要是對資源文件進行處理,給資源文件中的每一個字符串加多個“#”字符組成前綴和后綴.之后通過人工瀏覽界面,確認運行軟件是否出現的英文字符串.這些英文字符串很有可能是硬編碼缺陷.在測試過程中,要求測試人員對系統業務熟悉,確保不遺漏界面,對所有字符串認真檢查.
第二類硬編碼的測試依靠人工,對測試人員要求較高.因為這些缺陷不容易發現,需要測試人員對系統業務熟悉程度高,有豐富的國際化測試經驗.測試過程中,測試人員根據軟件功能確定需要重點關注系統變量,并且更換特定環境進行測試.
過度翻譯問題也是依靠人工測試.有經驗的國際化測試人員,在了解項后業務和熟悉代碼后,總結相關測試點,進行人工檢查.
眾所周知,軟件自動化測試是軟件測試的一個非常重要的發展方向.重復且工作量大的人工測試工作,效率不高,容易讓人產生厭倦,從而容易出錯.自動化測試則能很好的解決這類問題.自動化測試能夠彌補手工測試的不足,提高測試精確度,并且大幅度提高效率.設計一種合理的自動化測試方案,可以減輕國際化測試工組強度,節省人力財力,從而降低軟件的測試成本.
針對以上論述的硬編碼和過度翻譯測試的特征和其測試方法現狀,結合具體測試項后分析,設計自動化測試方案.本方案用Java語言實現,通過靜態測試實現對硬編碼和過度翻譯兩個問題的測試.
本測試項后是某公司的Web產品,主要使用Struts2框架國際化技術.該框架是一個基于MVC設計模式的Web應用框架,是Struts的下一代產品.它成功地結合了WebWork和Struts1.x兩種Web框架.在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數據交互.
Struts 2國際化是建立在Java國際化的基礎之上.Java國際化的實現主要依靠“java.util.Locale”類和“java.util.ResourceBundle”抽象類.其中,Locale 類用來提供本地信息,主要包括語言、國家和地區等屬性,例如中國表示為.ResourceBundle類稱為資源包,包含了特定于語言環境的資源對象.Struts2框架對上述流程進行了進一步封裝,并且提供了靈活的資源包組織和加載方式.
可疑的國際化測試點可能遍布軟件的各個方面,因此自動化測試的第一步需要對項后文件進行遍歷.根據Struts2國際化的技術特點,結合被測項后的實際情況,總結測試重點涉及頁面文件(文件后綴為Jsp)、校驗器配置文件(文件命名規則為Action類名-validation.xml)、Action類文件(文件后綴為Java)和資源文件(文件后綴為Properties).
本自動化測試方案使用Java語言實現,具體流程如圖1所示.首先通過相應類庫對上述文件進行解析,提取文件中國際化敏感數據元素或方法.針對這些元素或方法,利用正則表達式進行檢測,從而確定可疑的硬編碼和過度翻譯問題候選項.

圖1 自動化測試方案總體框圖
在頁面文件中,第一類硬編碼問題比較常見.Struts2框架的用戶界面標簽是在很常見的Html標簽上額外添加前綴小號“s:”,主要分為兩類:
①表單標簽
主要用于生成Html頁面的表單元素,以及普通表單元素的標簽,對應“s:label”,“s:submit”等.
②非表單標簽
主要用于生成頁面上的非表單區域等,對應“s:text”,“s:div”等標簽.
正確的Strust2頁面國際化,主要是通過指定用戶界面標簽的Name、Key或者Label等屬性進行的,如:

硬編碼的情況是:
因此,在自動化測試時,查找頁面文件并解析標簽是首要任務.我們選取了Jsoup工具進行解析.Jsoup是著名的第三方類庫,其主要應用于解析Html文件,獲取用戶需要的數據.它提供了一套非常完善的API接口規范,開發者可以通過DOM遍歷或者類似于JQuery的操作方法來取出和操作數據.同時它還包含了一個支持最新Html5技術的解析器分支,能夠很好的降低解析的時間和內存的占用.
使用Jsoup解析頁面文件后,將分以下三類情況進行檢查:
①測試頁面文件的純文本
將頁面標簽除去,檢查是否包含純文本.如果仍存在純文本,將與需要排除的字符串進行比對.這些需要排除的字符串,由測試人員預先設定,如URL、IP地址、公司Logo等特殊字符串.如果不能對比成功,則認為該字符串是硬編碼候選項并輸出在測試報告中.
②普通的Html標簽的屬性和內容檢查
對普通的Html頁面元素的內容和屬性值進行利用正則表達式檢驗,例如Title標記、Img的Alt屬性等.
③Struts2標簽的屬性和內容檢查
如上述Struts2框架的用戶界面標簽,不僅需要對Struts2標簽的內容利用正則表達式進行檢驗,而且要檢查標簽的Name、Key或者Label等屬性.
當然,在頁面文件中,也可能出現第二類硬編碼錯誤.這類錯誤的發現,需要依賴通過預先設定國際化敏感的系統變量,將硬編碼候選項進行自動對比完成.
頁面上顯示的校驗錯誤信息也需要國際化,主要涉及第一類硬編碼問題.Struts 2 針對編碼驗證和驗證框架都提供了國際化實現,處理非常便捷.在本測試項后中,校驗信息是通過校驗器完成的.例如檢驗密碼的長度不小于6個字符,正確國際化的實例為:


其中Message元素的Key屬性,就是驗證錯誤信息在資源文件中的鍵值.
如果出現硬編碼,則會書寫為:
因此,首要任務是搜索校驗器配置文件和解析.這些文件是以“validation.xml”字符串為后綴的XML文件,他們的解析也是通過Jsoup工具完成的.Jsoup提供了強大的XML操作能力,高效又靈活.通過Select方法和Xpath,程序將返回一個Message標簽的Elements對象集合.從而,逐個檢查Message標簽中是否缺少Key屬性,即可得到硬編碼候選項.
Action類文件也可能存在硬編碼問題.與頁面文件相似,這些缺陷多半是第一類硬編碼問題,極個別是第二類硬編碼問題.
針對這些以Java為后綴的Action類文件,主要采用普通文件讀取方式,進行逐行測試.在Action類中,想要正確地進行文本信息國際化,一般需要使用“getText(String key)”方法.這個函數將返回國際化資源文件中 Key 對應的值.當然,也有時通過 “getText(String key,String[] params)”實現占位符填充.
因此,自動化測試的重點是檢驗缺乏“getText”方法的字符串或輸出語句.這里的輸出,有涉及頁面的直接輸出,也有涉及業務的異常錯誤輸出.另外,第二類硬編碼問題的發現,與頁面文件相同,與測試人員的預先設定相關,不再贅述.
Struts2的國際化資源文件分為三種級別:①全局范圍資源文件.② 包范圍資源文件.③ Action 范圍資源文件.針對國際化資源文件的測試,三類文件均需考慮其中的過度翻譯問題.下面是一個日期信息過度翻譯的消息文本:
demo1=今天是 2017-1-1
正確的國際化方式,日期不需翻譯.首先,在資源文件中使用參數參數替換占位符{0}替代日期內容.在頁面文件中,使用嵌套的Param標簽來設置參數.例如,資源文件中消息文本為:
demo1 =今天是{0}.
頁面文件代碼片段為:

Properties屬性文件內容都是以鍵值對形式存在的.因此自動化測試時,讀取Properties文件后獲取值的部分,檢查其中是否包含過度翻譯的內容.其中,國際化敏感的數據作為測試的重點,數據格式可能遍布資源文件的各個地方,包括數字、貨幣、時間、日期、度量衡等.
伴隨軟件國際化開發技術不斷發展的同時,國際化測試的研究也需要更多重視.本文論述了國際化軟件的硬編碼和過度翻譯問題的概念、分類和測試方法現狀.針對硬編碼和過度翻譯兩個問題,分析了現有人工測試的不足和Struts2國際化的技術特點,結合被測項后的實際情況,研究并實現了自動化測試方案.
本文提出的已經應用于某公司的Web產品的國際化測試中,實踐驗證了對硬編碼和過度翻譯的自動測試的支持,并取得了良好的效果.當然,國際化測試涉及的問題還有很多需要繼續深入研究,例如對數據庫數據國際化的研究和國際化測試平臺的研究等.
1 董俊龍,王武魁.淺議基于JSF的Java國際化編程及其實現.微計算機信息,2009,25(27):170–171.
2 劉雅君,徐進.軟件全球化測試技術的研究與實現.計算機系統應用,2010,19(1):40–45.
3 劉建國.軟件項后國際化和本地化的研究[碩士學位論文].北京:華北電力大學(北京),2013.
4 雷輝.國際化軟件測試研究[碩士學位論文].武漢:湖北大學,2007.
5 劉雅君.軟件回歸測試技術.計算機系統應用,2011,20(7):156–159.
Research on the Automatic Testing of Hardcoding and Over-Translation Problems in the International Software
LIU Ya-Jun,LI Ai-Min,LIU Sheng,YUAN Ting
(Xi’an University of Technology,Xi’an 710043,China)
With the development of software internationalization technology,internationalization testing research is attracting more attention.In order to solve the problems of hardcoding and over-translation in international software,this paper proposes an automatic testing scheme.By analyzing the concept,classification and testing methods of the two problems,this paper summarizes the shortcomings of existing manual testing and the characteristics of Struts2 internationalization technology.Finally,combined with the actual situation of the tested project,the automatic test scheme is elaborated.The scheme has been applied to the internationalization testing of a real Web product,which is proved to be the support to hardcoding and over-translation automatic test,and has achieved good results.
software internationalization testing;hard coding;over-translation;automated testing
劉雅君,李愛民,劉晟,袁婷.國際化軟件的硬編碼和過度翻譯問題自動測試研究.計算機系統應用,2017,26(9):274–278.http://www.c-sa.org.cn/1003-3254/5983.html
2017-01-04;采用時間:2017-02-13