摘 要: 以Python為基礎(chǔ),結(jié)合對(duì)Twain Driver測(cè)試工具的具體需求,,將Pywinauto引入到Twain Driver的自動(dòng)化測(cè)試中,。介紹了Pywinauto的基本概念,通過(guò)測(cè)試用例說(shuō)明Pywinauto在自動(dòng)化測(cè)試中的具體實(shí)現(xiàn),。應(yīng)用結(jié)果表明,,該方法大大提高了測(cè)試的自動(dòng)化程度,極大地減少了Twain Driver測(cè)試的工作量,,同時(shí)也確保了測(cè)試質(zhì)量,。
關(guān)鍵詞: Python;Pywinauto,;Twain Driver,;自動(dòng)化測(cè)試
Windows下掃描儀驅(qū)動(dòng)程序主要使用Twain協(xié)議[1]。由于Twain協(xié)議的復(fù)雜性,,Twain Driver一般會(huì)以圖形界面方式提供眾多掃描選項(xiàng)以供用戶使用,。掃描選項(xiàng)數(shù)量眾多以及選項(xiàng)之間的依賴(lài)性,決定了Twain Driver的測(cè)試是一項(xiàng)非常艱巨的任務(wù),。Twain Driver的測(cè)試主要包括基本功能測(cè)試以及回歸測(cè)試,。一般一個(gè)Twain Driver包含近百個(gè)基本功能測(cè)試用例以及隨著缺陷數(shù)量增長(zhǎng)而不斷增加的回歸測(cè)試用例。特別是臨近產(chǎn)品正式發(fā)布日期時(shí),,每修正一個(gè)缺陷,,都會(huì)帶來(lái)極大的工作量:一方面,,要做基本功能測(cè)試檢查是否有新的缺陷;另一方面,,要做回歸測(cè)試檢查之前已修正好的缺陷是否受到影響,。由于此時(shí)產(chǎn)品已處于開(kāi)發(fā)周期的后期階段,缺陷的基數(shù)通常會(huì)比較大,,回歸測(cè)試的測(cè)試用例將變得非常龐大,。更重要的是,如果有多個(gè)缺陷需要修正,,那么以上兩個(gè)方面的測(cè)試還將重復(fù)執(zhí)行多次,,測(cè)試工作將成倍增長(zhǎng)。
針對(duì)以上問(wèn)題,,本文以Python為基礎(chǔ),,結(jié)合對(duì)Twain Driver測(cè)試工具的具體需求,提出了一個(gè)基于Pywinauto實(shí)現(xiàn)自動(dòng)化測(cè)試的解決方案[2],。Pywinauto通過(guò)模擬測(cè)試人員在用戶界面上的鼠標(biāo),、鍵盤(pán)操作,來(lái)減少測(cè)試人員的手工操作,。應(yīng)用結(jié)果表明,,該方案能夠極大地提高測(cè)試效率,在減少了測(cè)試時(shí)間的同時(shí),,也確保了產(chǎn)品質(zhì)量,。
1 Pywinauto的基本概念
Pywinauto是基于Python開(kāi)發(fā)的,用于自動(dòng)化測(cè)試的腳本模塊的第三方擴(kuò)展包,,它通過(guò)向Windows對(duì)話框和控件發(fā)送鼠標(biāo),、鍵盤(pán)動(dòng)作來(lái)實(shí)現(xiàn)Windows圖形界面的自動(dòng)化測(cè)試[3]。
1.1 標(biāo)識(shí)應(yīng)用程序?qū)嵗?/strong>
Pywinauto在使用前首先需要將應(yīng)用程序?qū)嵗B接到一個(gè)進(jìn)程,,有兩種標(biāo)識(shí)方法分別對(duì)應(yīng)兩種情況:
?。?)應(yīng)用程序未啟動(dòng)即應(yīng)用程序?qū)嵗淮嬖冢捍藭r(shí)可以調(diào)用start_(self,cmd_line,,timeout=app_start_timeout)來(lái)啟動(dòng)應(yīng)用程序,。示例如下:
gAppName=ur"C:\\Program Files\\TWAIN Working Group\\ TWAIN Toolkit\\Twack_32.exe"
app=application.Application().start_(gAppName)
(2)應(yīng)用程序已啟動(dòng):此時(shí)只需調(diào)用connect_(self,, **kwargs)連接到已運(yùn)行的應(yīng)用程序,。示例如下:
AppName=ur"TWAIN_32 Twakcer"
app=application.Application().connect_(title_re= AppName)
1.2 標(biāo)識(shí)應(yīng)用程序窗口
在取得應(yīng)用程序?qū)嵗螅涂墒褂迷搶?shí)例標(biāo)識(shí)應(yīng)用程序窗口,,主要有3種標(biāo)識(shí)方式:
?。?)使用窗口標(biāo)題。示例如下:
gWizardName="Select"
MainDlg=app[gWizardName]
或者將窗口標(biāo)題直接當(dāng)成一個(gè)變量形式使用,但這樣標(biāo)識(shí),,非英文語(yǔ)系時(shí)窗口會(huì)出現(xiàn)問(wèn)題,,所以這種方法并不推薦。示例如下:
MainDlg=app.Select
?。?)窗口標(biāo)題結(jié)合正則表達(dá)式,,特別是當(dāng)窗口標(biāo)題不確定或經(jīng)常變化時(shí)尤為有用。示例如下:
dlg=app.window_(title_re=".*doc",,class_name="#33888")
?。?)直接取最上層窗口。此時(shí)需要確保被標(biāo)識(shí)的應(yīng)用程序窗口為頂層窗口,。示例如下:
MainDlg=app.top_window_()
1.3 標(biāo)識(shí)應(yīng)用程序窗口控件
Pywinauto的測(cè)試原理主要模擬控件上的手工操作,,所以Pywinauto自動(dòng)化測(cè)試中重要的一環(huán)就是標(biāo)識(shí)應(yīng)用程序窗口上的控件。假設(shè)應(yīng)用程序窗口有一內(nèi)容為OK的Button控件,,主要有兩種方式標(biāo)識(shí)這個(gè)控件:
?。?)使用窗口控件標(biāo)題。示例如下:
app["dlg"]["OK"]
或者將控件標(biāo)題直接當(dāng)成一個(gè)變量形式使用,。與標(biāo)識(shí)窗口類(lèi)似,,這種方法也不推薦。示例如下:
app.dlg.OK
?。?)使用Friendly class,,特別是當(dāng)控件標(biāo)題內(nèi)容為空時(shí)尤為有用,。示例如下:
Dialog.Button1
需要說(shuō)明的是:Button,、Button0及Button1都是代表第一個(gè)Button,Button2代表第二個(gè)Button,。標(biāo)準(zhǔn)控件通過(guò)Friendly class很容易標(biāo)識(shí)出來(lái),,但是非標(biāo)準(zhǔn)控件其Friendly class并不明顯,這時(shí)可通過(guò)Visual Studio自帶的Spy++來(lái)查看,,如圖1所示,。
1.4 如何操控鼠標(biāo)與鍵盤(pán)
在取得Windows對(duì)話框和控件后,就可以向?qū)υ捒蚧蛘呖丶l(fā)送鼠標(biāo),、鍵盤(pán)操作來(lái)實(shí)現(xiàn)自動(dòng)化測(cè)試,。
鼠標(biāo)的操作:(1)點(diǎn)擊操作:模擬鼠標(biāo)的點(diǎn)擊操作可以結(jié)合具體的控件,Pywinauto對(duì)于不同的控件提供了不同的函數(shù),。例如,,模擬Next Button的點(diǎn)擊事件可以表示為Dialog.["Next"].Click();模擬ComboBox 控件的選擇操作可以使用如下方式:Dialog.ComboBox1.Select(1),。(2)拖動(dòng)操作:主要使用PressMouse(),、MoveMouse()和ReleaseMouse()實(shí)現(xiàn)鼠標(biāo)的按下、移動(dòng)以及釋放操作。示例如下:
def AdjustSize (WizardDlg,,ShiftX,,ShiftY):
Offset=10
OrgRect=WizardDlg.WiaControl1.Rectangle()
WizardDlg.WiaControl1.PressMouse(coords=(Offset,Offset))
WizardDlg.WiaControl1.MoveMouse(coords=(Offset+ShiftX,,Offset+ShiftY))
WizardDlg.WiaControl1.ReleaseMouse()
按鍵的操作:Pywinauto使用SendKeys來(lái)進(jìn)行按鍵處理[4],。一些程序并不會(huì)將菜單項(xiàng)指定給主UI(如Word),這樣就不能直接使用菜單方法,,而是使用快捷鍵的方式,,這就需要使用SendKeys發(fā)送快捷鍵。如要表示按下Alt+F組合鍵,,可以寫(xiě)成MainWin.TypeKeys("%F"),。需要說(shuō)明的是:TypeKey還可表示按照一定時(shí)間間隔接受多個(gè)組合按鍵。例如,,在Word2003打開(kāi)從掃描儀導(dǎo)入圖片的窗口,,需要先按Alt+I,然后按Alt+P,,最后按Alt+S,。用SendKeys可以表示為:
MainWin.TypeKeys("%IPS",pause=0.5)
1.5 中文支持
Pywinauto在對(duì)中文應(yīng)用的菜單進(jìn)行操作時(shí),,通常會(huì)由于編碼問(wèn)題而使中文應(yīng)用的對(duì)話框和控件無(wú)法進(jìn)行標(biāo)識(shí),。可以使用以下兩種方法解決:
?。?)使用"u"或者"ur"將字符串轉(zhuǎn)換成UTF格式的字符串,。例如:
gDialogName=u"選擇來(lái)源"
gButtonName=u"選定"
app[gDialogName][gButtonName]
(2)使用decode函數(shù)強(qiáng)行轉(zhuǎn)換字符串編碼,。例如:
CP="cp936"
gDialogName="選擇來(lái)源".decode(CP)
gButtonName="選定".decode(CP)
app[gDialogName][gButtonName]
2 Twain Driver自動(dòng)化測(cè)試實(shí)現(xiàn)
由于Twain協(xié)議使用的廣泛性,,目前已經(jīng)有很多應(yīng)用程序支持該協(xié)議。Windows下常見(jiàn)的應(yīng)用程序主要有Twack_32,、Microsoft Word,、PageManager 以及Adobe Photoshop等,這些應(yīng)用程序均可作為T(mén)wain Driver的測(cè)試工具,。其中Twack_32是TWAIN官方所提供的一個(gè)工具,,其兼容性最好,而且它不僅提供了TWAIN應(yīng)用的例程,,還可以在計(jì)算機(jī)系統(tǒng)上安裝一個(gè)虛擬的圖像輸入設(shè)備(TWAIN_32SampleSource),,所以測(cè)試人員通常使用Twack_32對(duì)Twain Driver進(jìn)行測(cè)試。本文也以Twack_32為例實(shí)現(xiàn)Twain Driver的自動(dòng)化測(cè)試,。
2.1 Twack_32啟動(dòng)的實(shí)現(xiàn)
下載并安裝完后,,打開(kāi)Twack_32界面,,然后依次選擇File->Select Source,彈出一個(gè)對(duì)話框,,如圖2所示,。
實(shí)現(xiàn)時(shí),首先通過(guò)調(diào)用start函數(shù)啟動(dòng)應(yīng)用程序獲取應(yīng)用程序?qū)嵗?,然后利用該?yīng)用程序?qū)嵗徒缑娴臉?biāo)題(TWAIN_32 Twacker)取得應(yīng)用程序窗口實(shí)例,,最后根據(jù)應(yīng)用程序窗口實(shí)例取得控件標(biāo)識(shí),之后就可以操縱該控件了,。中文菜單可使用"u"轉(zhuǎn)換字符串,。實(shí)現(xiàn)代碼如下:
AppName=′TWAIN_32 Twacker′
TWAINDS_NAME=′SP C240SF/C242SF LAN 0.59 (32-32)′
def RunTwack():
app=application.Application()
app.start_(ur"C:\\Program Files\\TWAIN Working Group\\TWAIN Toolkit\\Twack_32.exe")
app[AppName].Wait(′ready′)
app[AppName].MenuSelect("File->Select Source...")
app[u′選擇來(lái)源′].Listbox1.Select(TWAINDS_NAME)
app[u′選擇來(lái)源′][u′選定′].Click()
return app
2.2 自動(dòng)化測(cè)試實(shí)現(xiàn)
Twack_32成功啟動(dòng)后,如果安裝了需要測(cè)試的驅(qū)動(dòng),,將會(huì)出現(xiàn)被測(cè)Twain Driver的界面,,圖3為某一驅(qū)動(dòng)的界面,以下實(shí)現(xiàn)也以此驅(qū)動(dòng)為例,。
該驅(qū)動(dòng)支持三種掃描模式,,分別是:Full Color、Gray和Black and White,。假設(shè)需要測(cè)試該驅(qū)動(dòng)的掃描模式是否實(shí)現(xiàn)正確,,首先需要將mode改為Full Color,其他參數(shù)不變,,掃描并觀察圖片是否正確,;然后依次將mode改為Gray 和 Black and White并重復(fù)以上操作。使用Pywinauto實(shí)現(xiàn)對(duì)掃描模式的自動(dòng)化測(cè)試,。實(shí)現(xiàn)時(shí)盡量將每一個(gè)測(cè)試案例用一個(gè)相應(yīng)的函數(shù)實(shí)現(xiàn),,有利于測(cè)試腳本的后期維護(hù)。示例代碼如下:
DriverName=′SP C240SF/C242SF LAN′
def SetScanParameter(ScanApp,,nPaperSource,,nColorModelItem, nDPIItem,,nSizeIndex):
WaitForWindowIsReady(ScanApp[DriverName])
ScanApp[DriverName].ComboBox.Select(nPaperSource)
WaitForWindowIsReady(ScanApp[DriverName])
ScanApp[DriverName].ComboBox2.Select(nColorModelItem)
ScanApp[DriverName].ComboBox3.Select(nDPIItem)
ScanApp[DriverName].ComboBox4.Select(nSizeIndex)
ScanApp[DriverName].Scan.Click()
time.sleep(0.5)
def ScanImageWithTwackChangeMode(ScanApp, nColorModelItem)
SetScanParameter(ScanApp,,1,, nColorModelItem,1,,2)def TestColorMode(ScanApp)
ScanImageWithTwackChangeMode(ScanApp,,1)
ScanImageWithTwackChangeMode(ScanApp,2)
ScanImageWithTwackChangeMode(ScanApp,,3)
本文以Twain Driver為例介紹了Pywinauto在圖形界面自動(dòng)化測(cè)試中的應(yīng)用與實(shí)現(xiàn),。Pywinauto通過(guò)模擬測(cè)試人員在用戶界面上的鼠標(biāo)、鍵盤(pán)操作來(lái)減少測(cè)試人員的手工操作。實(shí)現(xiàn)時(shí),,將各個(gè)測(cè)試用例對(duì)應(yīng)一個(gè)函數(shù),,然后根據(jù)測(cè)試需求調(diào)用相應(yīng)的函數(shù)。由于基本功能測(cè)試時(shí)測(cè)試用例相對(duì)穩(wěn)定,,所以腳本一旦寫(xiě)好,,以后每次發(fā)布版本前只需運(yùn)行一次腳本即可完成基本功能測(cè)試。而在回歸測(cè)試階段,,每增加一個(gè)測(cè)試用例,,便增加一個(gè)相應(yīng)的實(shí)現(xiàn)函數(shù),從而避免遺漏對(duì)之前版本缺陷的測(cè)試,。此外,,本文的方案只需稍作修改,便可應(yīng)用于其他Windows圖形應(yīng)用程序的測(cè)試,,特別是程序界面手動(dòng)操作比較復(fù)雜時(shí),,該方案的效果更加明顯。
參考文獻(xiàn)
[1] TWAIN—standard for image acquisition devices[DB/OL].http://twain.org.2001.
[2] 辛敏杰,,高建華.一種改進(jìn)的GUI測(cè)試框架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.