摘要:分析了Windows Mobile中的軟件自動化測試框架及其層次關系,通過實例在Visual Studio 2005中實現了對目標設備UI的自動化測試。在產品開發實踐中表明,這種自動化測試具有測試效率高、可靠性好、易維護等優點,對于Windows Mobile設備中其他方面的自動化測試研究具有一定參考價值。
關鍵詞:Windows Mobile;軟件測試;自動化測試;用戶接口測試;測試用例
中圖分類號:TP309文獻標志碼:A
文章編號:1001-3695(2007)07-0165-03
Key words:Windows Mobile;software testing;automation testing;UI testing;test case
軟件測試是軟件工程過程的一個重要階段,是在軟件投入運行前,對軟件需求分析、設計和編碼各階段產品的最終檢查,是為了保證軟件開發產品的正確性、完全性和一致性,從而檢測軟件錯誤、修正軟件錯誤的過程[1]。在嵌入式智能終端中,有限的硬件資源對其軟件的功能性和穩定性方面提出了更高的要求。因此,需要對設備上的各種軟件進行全面測試。
Windows Mobile 是 Microsoft 用于 Pocket PC 和 Smartphone 的軟件平臺,面向個人移動電子消費市場,最新版本是Windows Mobile 2005,現在Windows Mobile的合作伙伴已擴展到全球48個國家的40家硬件廠商和68家移動運營商。對原始設備制造商(OEM)來講,Windows Mobile是一個集合,包括一組事先定制的Windows CE(微軟的通用嵌入式操作系統)組件、其他附加的與Windows Mobile相關的組件和OEM所必須遵守的產品功能性要求。OEM利用這些組件,并添加必要的設備驅動程序和其他應用,然后拷貝到設備的ROM中。在Windows Mobile的產品開發中,軟件測試大約占50%的開銷。針對如何在Windows Mobile中開發自動化測試以降低測試費用、提高測試質量和效率,本文分析了Windows Mobile中自動化測試框架及其內部各模塊的關系,并實現了對產品UI自動化測試的實例。
1Windows Mobile中的自動化測試框架
在Windows Mobile的智能終端上,采用Mobility Toolkit Development Kit工具包來對UI進行自動化測試[7]。Windows Mobile中自動化測試框架由.NET類庫組成。在實際中為實現不同的測試功能,測試框架采用分層結構。圖1描述了各類庫層次依賴關系。
虛線下的Logging 和Utils.NET可以被其他各模塊使用。
1.1Logging
Logging庫包含了與導出測試數據和測試結果管理相關的類。Logging是通用的,滿足了除.NET測試工具之外的如桌面測試工具可使用Logging。對于.NET自動化測試來說,Logging的主要接口是GlobalLogger和GlobalLogResultManager。
MTK、UIAL、Area Libraries和Test components利用GlobalLogger在測試中自動向日志文件導出測試信息。此外,GlobalLogger還支持不同的測試信息導出等級。例如,對UIAL層的注釋是在調試等級,在調試過程GlobalLogger才記錄相關信息;而對測試等級下的測試信息則無此限制。GlobalLogResultManager主要用在Test Cases and Suites和Area Libraries兩層,當一次執行多個測試用例時可以用來跟蹤每個用例的測試結果。
1.2Utils.NET
Utils.NET代碼庫包含了可以被MTK、UIAL、Area Libraries和Tests使用的面向設備的代碼。.NET Framework為桌面工具提供了豐富的代碼庫,而.NET Compact Framework只包含了該代碼庫的一個子集。Utils.NET涵蓋了在.NET Compact Framework中所沒有但在測試目標設備要用到的代碼。
Utils.NET提供的代碼對于.NET自動化測試和.NET Compact Framework的使用者都是很有幫助的。此外,Utils.NET還為在目標設備與開發工作站之間共享代碼提供了方便。
1.3Device Automation ToolKit (DATK)
主要是C#類庫,其中的類映射了對目標設備上UI的控制。DATK中的有些類映射了目標設備上的編輯框、列表視圖和按鈕等。除了這些可以映射的控制類之外,還有Windows Finder類,該類在使用DATK中是很重要的。Windows Finder可以指定對設備進行控制的某些特征如類型、文本或進程等,并將該控制與DATK控制對象綁定。而利用DATK控制對象可以得到對目標設備控制的信息如類型、已選/未選狀態等,進一步利用DATK控制對象可以與目標設備控制的交互,這樣就實現了利用DATK對目標設備上UI的自動化測試。
DATK目前尚不依賴Logging或Utils.NET組件。
1.4Mobility ToolKit (MTK)
MTK是與DATK類庫中對MDPG部分的擴展。比如說,軟按鍵在Windows Mobile的設備上是很重要的組件,但Windows CE本身卻不支持,因此DATK中也不提供與軟按鍵對應的控制類,這在對Windows Mobile的設備測試時是很不方便的。基于此,在DATK中添加了針對Windows Mobile設備的控制類,形成了測試Windows Mobile設備的專用類庫即MTK。此外,MTK還提供了有助于自動化測試的其他類,如ApplicationManager可以映射為啟動Windows Mobile設備上的應用程序。
MTK包含了很多從DATK衍生而來的類,且依賴于Logging 和Utils.NET。
1.5UIAL
DATK提供了大量的類來映射UI控件對目標設備的UI進行控制。實際中要映射到目標設備的UI控件還要使用DATK中的Windows Finder類來初始化DATK層的UI控件。提供給Windows Finder搜索條件如類名字、標題、控制ID號等,Windows Finder會根據給定條件找出所需的控制類。搜索條件對設備UI中設計與實現上的變化是很敏感的,這樣提供了一種抽象模式來保護UI測試自動化免受上述變化的影響。
UIAL在一個應用程序中封裝了各種形式的控件,這樣自動化測試開發者可直接用Windows Finder來獲取該控件。C#庫為目標設備上的具體控件和DATK控制對象提供了1∶1的映射。應用中,每個應用程序應該對應一個UIAL,且UIAL中具有相應的屬性與該應用程序中的控件對應。主要是對控件屬性進行標記,避免了UI中有控件變化時不必修改全部測試代碼,只需改動UIAL即可。UIAL依賴于DATK、MTK、Utils.NET和 Logging。且被Area Libraries所調用。
1.6Area Libraries
UIAL降低了在DATK中尋找控件的難度,但并未將這些控件與特定的應用場景綁定。Area Libraries可以在目標設備上將這些控件應用到特定的情境中。
Area Libraries的目的是使自動化測試腳本的編寫,像描述手動測試用例的步驟一樣直觀。這樣與手工測試相比,代碼就變得非常簡潔。例如測試Microsoft Word的用例中第一個步驟是打開Word,該步驟對應了在UI中的一組命令:點擊開始、選擇程序、點擊Word等。測試用例的Open Word步驟就可以在Area Library中直接執行,屏蔽了打開Word時的細節。此外,Area Library還自適應不同的產品(PocketPC或Smartphone)、使用的SKU等。Area Libraries依賴于UIAL、MTK、Utils.NET和Logging,且只為其上層的Tests層服務。
1.7Tests Cases and Suites
在.NET Automation Framework中,測試套件是從TestSuite類繼承來的一系列子類。測試用例是標記了屬性的C#方法,是根據屬性包含在相應的測試套件中,從功能上依賴于Area Libraries,包含了根據需求對該庫的一系列調用。這樣一系列的特定行為組成了測試用例要完成的測試動作。一般情況下,測試用例并不直接調用UIAL,除非對較特殊的設備應用程序進行測試。該層依賴于Area Libraries,少數情況下需要UIAL、MTK或DATK的支持。
2基于DATK開發UI自動化測試
利用DATK實現UI自動化測試關鍵在于創建抽象運行對話框和設計測試用例。
2.1開發環境搭建
(1)將Visual Studio 2005安裝文件中的MtkKit文件拷貝到C:\\MtkKit。
(2)安裝ActiveSync和Visual Studio 2005。
ActiveSync. ActiveSync是開發工作站與目標設備之間的同步軟件,利用ActiveSync可使兩者的數據保持實時更新。
Visual Studio 2005,微軟的最新系列的集成開發環境,其最新版本是Visual Studio 2005 Team Suite。
(3)將Windows Mobile上的設備連接到ActiveSync。
將模擬器與ActiveSync相連。在Visual Studio 2005的模擬器管理器中可以啟動模擬器。需要注意的是連接模式選擇DMA,且需要Cradle待連接的模擬器。
(4)將開發工作站上的c:\\mtkkit\\DeviceFiles\\文件拷貝到目標設備的\est目錄下。
2.2創建抽象運行對話框
當開發環境搭建好后,就可以開始實現UI自動化測試了。關鍵之一是要創建抽象運行對話框,當創建好之后需要編寫測試用例進行調用。
首先,在Visual Studio 2005的工程目錄下創建要建立的工程文件MyDemo,一般路徑為C:\\Documents and Settings\\XXX\\My Documents\\Visual Studio 2005\\Projects\\,將C:\\MtkKit\\TuxNetSkeleton下的內容拷貝到工程文件夾MyDemo下,需要注意的是,要將拷貝過來的與Windows Explorer相關的文件屬性清除只讀的限制。其次,把C:\\MtkKit\\Common文件夾及其內容拷貝到工程目錄下,同樣,對文件屬性清除只讀的限制。
在目標設備上激活shell32.exe,打開運行程序對話框。其次還需要生成RCML文件,在該文件中含有對話框的XML形式表示,采取這種形式有利于向對話框及其控件添加必要信息。生成RCML文件的具體步驟:在開發工作站上執行C:\\WINDOWS\\system32\\cmd.exe /k .\\Bin\\CommandWindow.bat,其快捷鍵為C:\\MtkKit\\CommandWindow.lnk。
在命令行窗口中鍵入rapistart \"\est\\RcmlSnap.exe\"命令,這實際上是在工作站上遠程執行了RCML Snap程序,該程序產生與shell32對話框相關的RCML文件。對話框如圖2所示。
大約一分鐘過后,目標設備上出現顯示了產生的RCML文件名字的對話框,可以點擊OK,如圖3所示。此時目標設備上屏幕的截圖也會以位圖的形式保存下來,這兩個文件默認情況在目標設備的根目錄下。之后需要將這兩個文件拷貝到工作站的工程文件夾下。在Visual Studio 2005下打開產生的RCML文件shell32.exeDialog.RCML和c:\\MtkKit\\RunDialogSample\\RunDialog.rcml文件,編輯shell32.exeDialog.RCML文件的標記屬性使之與RunDialog.rcml文件中的屬性匹配。
接下來需要從RCML文件中產生C#源文件。為此需要在圖2的命令行對話框中到MyDemo目錄下,運行rctocs -dll shell32.exe -rcml . -o c:\\Auto命令,該命令啟動了RCML文件中的RcToCs工具,RcToCs產生在工程中需要的一組C#源文件,同時創建c:\\Auto文件夾,自動將產生的兩個C#文件拷貝到該文件夾,因此還需要手動拷貝到工程文件MyDemo。C#源文件如圖4所示。
在Visual Studio 2005中打開c:\\mtkkit\\MyDemo\\TuxNetSkeleton.sln,且將C#源文件中的代碼添加到TuxNetSkeleton工程中。至此已經成功地創建了抽象運行對話框。
2.3設計測試用例
在編寫測試用例之前需要對有關文件及類進行重命名:將SkeletonTests.cs源文件改為RunDialogTests.cs;將TuxNetSkeletonTests類更名為RunDialogTests(同時對其構造函數更名)。接下來可以編寫測試用例了。
在RunDialogTests.cs文件的using區添加using Microsoft.MobileDevices.AbstractionLayer.Shell.PocketPC;//聲明測試用例針對PocketPC對RunDialogTests類添加啟動方法。實現代碼為
#region Utility Methods
/// 〈summary〉Launch the run dialog using Win+R 〈/summary〉
public void Launch()
{
Utils.GlobalLogger.AddComment(\"Launch the Run Dialog\");
//向XML測試結果中添加注釋
Datk.KeyBoard.SendKey(Datk.KeyBoard.Key.LWin, Datk.KeyBoard.EventFlags.KeyDown);
Datk.KeyBoard.SendKey(′R′);
Datk.KeyBoard.SendKey(Datk.KeyBoard.Key.LWin, Datk.KeyBoard.EventFlags.KeyUp);
}
#endregion
展開測試用例的功能區,添加實現該測試用例的功能性代碼:
/// 〈summary〉Use the Run dialog to launch iexplore.exe
/// 說明: 該測試用例只在Pocket PC phone上適用.〈/summary〉
///〈returns〉LogResult.Pass on success〈/returns〉
[TestCaseAttribute(\"RunDialog launching iexplore\", Type = TestType.Functional)]
//標記測試用例的屬性,以便Tux.NET可以識別該用例
[MobileDevicesDescriptor ( Product = Products.PocketPC ) ]
//測試用例針對PocketPC產品
public Log.LogResult LaunchIExplore()
{
RunDialog run = new RunDialog();
Launch(); //啟動一個運行對話框
Utils.GlobalLogger.AddComment(\"Select the edit control\");
//向XML測試結果中添加注釋
run.OpenTextBox.Click();
Utils.GlobalLogger.AddComment(\"Enter 'iexplore'\");
Datk.KeyBoard.SendString(\"iexplore\");
Utils.GlobalLogger.AddComment(\"Click Ok\");
run.OKButton.Click();
Utils.GlobalLogger.AddComment(\"Verify that iexplore is launched\");
Datk.WindowFinder iexploreFinder = new Datk.WindowFinder();
iexploreFinder.ProcessName = \"iexplore.exe\";
iexploreFinder.FindForm();
//如果iexplorer未找到,則拋出異常,并有效地記錄測試失敗
return Log.LogResult.Pass; //返回測試結果為Pass
}
至此已經完成對測試用例的設計。
2.4運行對Internet Explorer自動化測試
利用快捷鍵F5(Start with Debugging)運行該測試。可看到目標設備上鼠標自動啟動運行對話框,鍵入iexplorer.exe,點擊OK按鈕,之后Internet Explorer就被啟動了。該測試用例實現了對目標設備上瀏覽器的自動化測試。通過ActiveSync可以在目標設備的\est文件夾下查看測試日志文件Result.log。其中以XML形式記錄了測試過程中的詳細信息。
3結束語
Windows Mobile為嵌入式智能移動終端產品的開發提供了比較完整的解決方案,特別是在PocketPC和Smartphone領域正獲得越來越廣泛的應用。針對基于Windows Mobile上的設備,微軟提供了Logo Testing規范在一定程度上來保證OEM廠商的產品質量,實際上,廠家所發布的產品不僅要嚴格通過該規范,還需要就具體產品作出更有針對性的測試。本文就利用Tux.NET在Visual Studio 2005中實現了Windows Mobile上設備UI自動化測試,對實現其他應用程序UI自動化測試具有借鑒意義。在實際應用中,可以對一系列應用程序UI設計具體自動化測試,將之集成到Windows Mobile CE Test Kit中,實現自動執行對多個應用程序UI測試,從而在較大程度上提高了測試效率,有助于提高測試質量,縮短了產品開發周期。
參考文獻:
[1]陳浩,鄒北驥,江文,等.基于消息機制的自動化黑盒測試方法研究[J]. 計算機應用研究,2004,21(10):33-35,103.
[2]劉淵,王開云,范曉嵐,姜建國.內核網絡協議棧功能測試自動化的實現[J].計算機應用,2005,25(5):1052-1054.
[3]王軼辰,劉斌.嵌入式軟件仿真測試環境的軟件體系結構設計[J]. 計算機工程與應用,2005,41(16):97-99.
[4]王毅,蔡建平.基于API測試的分布式測試框架的研究與實現[J].計算機工程與設計,2004,25(8):1299-1301,1304.
[5]MOHAMOD A B.Using genetic algorithm to improve the performance of multi-host vulnerability checkers[J].IEEE,2001,23(17):368-376.
[6]WEYUKER E J.Experience with performance testing of software systems:issues,an approach, and case study[J].IEEE Transaction on Software Engineering,2000,26(12): 1147-1156.
[7]FEWSTER M,GRAHAM D.軟件測試自動化技術與實例詳解[M].舒智勇,等譯.北京:電子工業出版社,2000.
[8]ROBINSON S,et al.C#高級編程[M]. 李敏波,等譯.北京:清華大學出版社,2005:45-78,160-219.
注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”