翁省輝 ,喻武龍
(1.北京理工大學(xué) 珠海學(xué)院 計(jì)算機(jī)學(xué)院,廣東 珠海 519088;2.北京理工大學(xué) 珠海學(xué)院 信息學(xué)院,廣東 珠海 519088)
Windows下掃描儀驅(qū)動程序主要使用Twain協(xié)議[1]。由于Twain協(xié)議的復(fù)雜性,Twain Driver一般會以圖形界面方式提供眾多掃描選項(xiàng)以供用戶使用。掃描選項(xiàng)數(shù)量眾多以及選項(xiàng)之間的依賴性,決定了Twain Driver的測試是一項(xiàng)非常艱巨的任務(wù)。Twain Driver的測試主要包括基本功能測試以及回歸測試。一般一個(gè)Twain Driver包含近百個(gè)基本功能測試用例以及隨著缺陷數(shù)量增長而不斷增加的回歸測試用例。特別是臨近產(chǎn)品正式發(fā)布日期時(shí),每修正一個(gè)缺陷,都會帶來極大的工作量:一方面,要做基本功能測試檢查是否有新的缺陷;另一方面,要做回歸測試檢查之前已修正好的缺陷是否受到影響。由于此時(shí)產(chǎn)品已處于開發(fā)周期的后期階段,缺陷的基數(shù)通常會比較大,回歸測試的測試用例將變得非常龐大。更重要的是,如果有多個(gè)缺陷需要修正,那么以上兩個(gè)方面的測試還將重復(fù)執(zhí)行多次,測試工作將成倍增長。
針對以上問題,本文以Python為基礎(chǔ),結(jié)合對Twain Driver測試工具的具體需求,提出了一個(gè)基于Pywinauto實(shí)現(xiàn)自動化測試的解決方案[2]。Pywinauto通過模擬測試人員在用戶界面上的鼠標(biāo)、鍵盤操作,來減少測試人員的手工操作。應(yīng)用結(jié)果表明,該方案能夠極大地提高測試效率,在減少了測試時(shí)間的同時(shí),也確保了產(chǎn)品質(zhì)量。
Pywinauto是基于Python開發(fā)的,用于自動化測試的腳本模塊的第三方擴(kuò)展包,它通過向Windows對話框和控件發(fā)送鼠標(biāo)、鍵盤動作來實(shí)現(xiàn)Windows圖形界面的自動化測試[3]。
Pywinauto在使用前首先需要將應(yīng)用程序?qū)嵗B接到一個(gè)進(jìn)程,有兩種標(biāo)識方法分別對應(yīng)兩種情況:
(1)應(yīng)用程序未啟動即應(yīng)用程序?qū)嵗淮嬖冢捍藭r(shí)可以調(diào)用 start_ (self,cmd_line,timeout=app_start_timeout)來啟動應(yīng)用程序。示例如下:
(2)應(yīng)用程序已啟動:此時(shí)只需調(diào)用 connect_(self,**kwargs)連接到已運(yùn)行的應(yīng)用程序。示例如下:
在取得應(yīng)用程序?qū)嵗?,就可使用該?shí)例標(biāo)識應(yīng)用程序窗口,主要有3種標(biāo)識方式:
(1)使用窗口標(biāo)題。示例如下:
或者將窗口標(biāo)題直接當(dāng)成一個(gè)變量形式使用,但這樣標(biāo)識,非英文語系時(shí)窗口會出現(xiàn)問題,所以這種方法并不推薦。示例如下:
(2)窗口標(biāo)題結(jié)合正則表達(dá)式,特別是當(dāng)窗口標(biāo)題不確定或經(jīng)常變化時(shí)尤為有用。示例如下:
(3)直接取最上層窗口。此時(shí)需要確保被標(biāo)識的應(yīng)用程序窗口為頂層窗口。示例如下:
Pywinauto的測試原理主要模擬控件上的手工操作,所以Pywinauto自動化測試中重要的一環(huán)就是標(biāo)識應(yīng)用程序窗口上的控件。假設(shè)應(yīng)用程序窗口有一內(nèi)容為OK的Button控件,主要有兩種方式標(biāo)識這個(gè)控件:
(1)使用窗口控件標(biāo)題。示例如下:
或者將控件標(biāo)題直接當(dāng)成一個(gè)變量形式使用。與標(biāo)識窗口類似,這種方法也不推薦。示例如下:
(2)使用Friendly class,特別是當(dāng)控件標(biāo)題內(nèi)容為空時(shí)尤為有用。示例如下:
需要說明的是:Button、Button0及 Button1都是代表第一個(gè)Button,Button2代表第二個(gè)Button。標(biāo)準(zhǔn)控件通過Friendlyclass很容易標(biāo)識出來,但是非標(biāo)準(zhǔn)控件其Friendly class并不明顯,這時(shí)可通過Visual Studio自帶的Spy++來查看,如圖1所示。
在取得Windows對話框和控件后,就可以向?qū)υ捒蚧蛘呖丶l(fā)送鼠標(biāo)、鍵盤操作來實(shí)現(xiàn)自動化測試。
鼠標(biāo)的操作:(1)點(diǎn)擊操作:模擬鼠標(biāo)的點(diǎn)擊操作可以結(jié)合具體的控件,Pywinauto對于不同的控件提供了不同的函數(shù)。例如,模擬Next Button的點(diǎn)擊事件可以表示為 Dialog.["Next"].Click();模擬 ComboBox 控件的選擇操作可以使用如下方式:Dialog.ComboBox1.Select(1)。(2)拖動操作:主要使用 PressMouse()、MoveMouse()和ReleaseMouse()實(shí)現(xiàn)鼠標(biāo)的按下、移動以及釋放操作。示例如下:
按鍵的操作:Pywinauto使用SendKeys來進(jìn)行按鍵處理[4]。一些程序并不會將菜單項(xiàng)指定給主 UI(如 Word),這樣就不能直接使用菜單方法,而是使用快捷鍵的方式,這就需要使用SendKeys發(fā)送快捷鍵。如要表示按下Alt+F 組合鍵,可以寫成 MainWin.TypeKeys("%F")。 需要說明的是:TypeKey還可表示按照一定時(shí)間間隔接受多個(gè)組合按鍵。例如,在Word2003打開從掃描儀導(dǎo)入圖片的窗口,需要先按 Alt+I,然后按 Alt+P,最后按 Alt+S。用SendKeys可以表示為:
Pywinauto在對中文應(yīng)用的菜單進(jìn)行操作時(shí),通常會由于編碼問題而使中文應(yīng)用的對話框和控件無法進(jìn)行標(biāo)識??梢允褂靡韵聝煞N方法解決:
(1)使用"u"或者"ur"將字符串轉(zhuǎn)換成 UTF格式的字符串。例如:
(2)使用decode函數(shù)強(qiáng)行轉(zhuǎn)換字符串編碼。例如:
由于Twain協(xié)議使用的廣泛性,目前已經(jīng)有很多應(yīng)用程序支持該協(xié)議。Windows下常見的應(yīng)用程序主要有Twack_32、Microsoft Word、PageManager 以及 Adobe Photoshop等,這些應(yīng)用程序均可作為Twain Driver的測試工具。其中Twack_32是TWAIN官方所提供的一個(gè)工具,其兼容性最好,而且它不僅提供了TWAIN應(yīng)用的例程,還可以在計(jì)算機(jī)系統(tǒng)上安裝一個(gè)虛擬的圖像輸入設(shè)備(TWAIN_32SampleSource), 所 以 測 試 人 員 通 常 使 用Twack_32對Twain Driver進(jìn)行測試。本文也以Twack_32為例實(shí)現(xiàn)Twain Driver的自動化測試。
下載并安裝完后,打開Twack_32界面,然后依次選擇 File->Select Source,彈出一個(gè)對話框,如圖2所示。
實(shí)現(xiàn)時(shí),首先通過調(diào)用start函數(shù)啟動應(yīng)用程序獲取應(yīng)用程序?qū)嵗?,然后利用該?yīng)用程序?qū)嵗徒缑娴臉?biāo)題(TWAIN_32Twacker)取得應(yīng)用程序窗口實(shí)例,最后根據(jù)應(yīng)用程序窗口實(shí)例取得控件標(biāo)識,之后就可以操縱該控件了。中文菜單可使用"u"轉(zhuǎn)換字符串。實(shí)現(xiàn)代碼如下:
Twack_32成功啟動后,如果安裝了需要測試的驅(qū)動,將會出現(xiàn)被測 TwainDriver的 界面,圖3為某一驅(qū)動的界面,以下實(shí)現(xiàn)也以此驅(qū)動為例。
該驅(qū)動支持三種掃描模式,分別是:Full Color、Gray 和 Black and White。假設(shè)需要測試該驅(qū)動的掃描模式是否實(shí)現(xiàn)正確,首先需要將mode改為 Full Color,其他參數(shù)不變,掃描并觀察圖片是否正確;然后依次將mode改為Gray和 Black and White并重復(fù)以上操作。使用Pywinauto實(shí)現(xiàn)對掃描模式的自動化測試。實(shí)現(xiàn)時(shí)盡量將每一個(gè)測試案例用一個(gè)相應(yīng)的函數(shù)實(shí)現(xiàn),有利于測試腳本的后期維護(hù)。示例代碼如下:
本文以Twain Driver為例介紹了Pywinauto在圖形界面自動化測試中的應(yīng)用與實(shí)現(xiàn)。Pywinauto通過模擬測試人員在用戶界面上的鼠標(biāo)、鍵盤操作來減少測試人員的手工操作。實(shí)現(xiàn)時(shí),將各個(gè)測試用例對應(yīng)一個(gè)函數(shù),然后根據(jù)測試需求調(diào)用相應(yīng)的函數(shù)。由于基本功能測試時(shí)測試用例相對穩(wěn)定,所以腳本一旦寫好,以后每次發(fā)布版本前只需運(yùn)行一次腳本即可完成基本功能測試。而在回歸測試階段,每增加一個(gè)測試用例,便增加一個(gè)相應(yīng)的實(shí)現(xiàn)函數(shù),從而避免遺漏對之前版本缺陷的測試。此外,本文的方案只需稍作修改,便可應(yīng)用于其他Windows圖形應(yīng)用程序的測試,特別是程序界面手動操作比較復(fù)雜時(shí),該方案的效果更加明顯。
[1]TWAIN—standard for image acquisition devices[DB/OL].http://twain.org.2001.
[2]辛敏杰,高建華.一種改進(jìn)的 GUI測試框架 DART[J].計(jì)算機(jī)工程,2009,35(7):55-58.
[3]Contents-pywinauto v0.4.1 documentation[DB/OL].http://pywinauto.googlecode.com/hg/pywinauto/docs/contents.html,2010.
[4]SendKeys|Rutherfurd.net[DB/OL].http://www.rutherfurd.net/python/sendkeys,2008.