久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

微軟UI自動(dòng)化測(cè)試的技術(shù)演變(上)

 ovonel 2013-06-21

微軟UI自動(dòng)化測(cè)試的技術(shù)演變(上)

    Windows平臺(tái)的桌面開(kāi)發(fā)技術(shù), 從最原始的Win32 SDK,,發(fā)展到.NET WinForm,,一直到今天的WPF和Silverlight, 發(fā)生了翻天覆地的變化,,相對(duì)應(yīng)的UI自動(dòng)化測(cè)試技術(shù),,也隨之演變。

    微軟UI自動(dòng)化技術(shù)揭秘將分兩個(gè)部分介紹Windows平臺(tái)桌面程序的自動(dòng)化技術(shù),。上篇將介紹從Win32 SDK至今的UI自動(dòng)化技術(shù)演變,,下篇將著重介紹最新的UI Automation(UIA)的內(nèi)部實(shí)現(xiàn)和使用技巧。

    

    自動(dòng)測(cè)試是指用一個(gè)程序自動(dòng)地控制另外一個(gè)程序,,模擬用戶(hù)的操作進(jìn)行測(cè)試,。通常自動(dòng)化測(cè)試涉及到下面三個(gè)步驟:

測(cè)試源偵測(cè)

    測(cè)試源偵測(cè)是定位測(cè)試目標(biāo)元素的過(guò)程。比如要測(cè)試Windows附件中的計(jì)算器,,首先要把計(jì)算器窗口和其他程序比如寫(xiě)字板區(qū)分開(kāi),。進(jìn)一步測(cè)試計(jì)算器窗口菜單的時(shí)候,需要首先定位菜單條的位置,,獲取第二層子菜單等等,。簡(jiǎn)單地說(shuō),自動(dòng)化測(cè)試首先要能夠獲取從桌面開(kāi)始的整個(gè)UI樹(shù)結(jié)構(gòu),,定位到特定測(cè)試目標(biāo),。

用戶(hù)行為模擬

    用戶(hù)行為模擬指模擬用戶(hù)的輸入,,比如鼠標(biāo)、鍵盤(pán)和觸摸筆的操作,,中間可能會(huì)涉及IME輸入法,、組合鍵、特定用戶(hù)習(xí)慣,,比如輸入速度的模擬等,。

測(cè)試目標(biāo)檢查

    指獲取測(cè)試元素的屬性,比如讀取窗口標(biāo)題,, Listbox的子元素,, Checkbox的狀態(tài)等等,以便進(jìn)行測(cè)試檢查,。

Win32 SDK和Windows Message

    在.NET問(wèn)世以前,,Windows平臺(tái)上的UI程序無(wú)外乎兩種技術(shù):Win32 Windows SDK 或者DirectX。由于DirectX多用于專(zhuān)業(yè)領(lǐng)域如游戲和CAD,,本文并不討論,。

    無(wú)論是MFC,VCL還是VB6,,Win32 SDK都是其根本,,最終打交道的其實(shí)都是HWND和Windows Message。實(shí)現(xiàn)上述自動(dòng)化的三個(gè)步驟 無(wú)外乎三件法寶,,Win32 API,,Windows Message和Windows Hook。

    測(cè)試程序首先通過(guò) FindWindowEx和EnumWindow遍歷窗口和子窗口,, 找到測(cè)試元素比如某個(gè)按鈕,,然后可以通過(guò)Windows Message或者API檢查測(cè)試目標(biāo)。比如通過(guò)WM_GETTEXT或者GetWindowText讀取窗口標(biāo)題,,通過(guò)GetWindowRect讀取按鈕坐標(biāo)位置等等,。對(duì)于用戶(hù)行為模擬,可以直接通過(guò)SendKey API來(lái)完成,,當(dāng)然也可以發(fā)送WM_CHAR或者WM_KEYDOWN通知等等,。

    除此以外,Windows Hook更加豐富了技術(shù)的選取,。通過(guò)Windows Hook,,測(cè)試人員還可以直接監(jiān)控、 截取,、模擬目標(biāo)程序的Windows消息,,實(shí)現(xiàn)更靈活的模擬,檢查甚至錄制的功能,。

    Windows Spy++(圖一)雖然不是測(cè)試工具,,也算是使用這套技術(shù)的典型例子,。通過(guò)Windows Spy++可以定位任意窗口, 讀取窗口屬性,,監(jiān)視窗口消息等等,。

spyxx

圖一: Microsoft Spy++

    采用Win32 SDK和Windows Message的優(yōu)點(diǎn)是直接靈活,。由于直接使用Win32 API,,沒(méi)有額外的學(xué)習(xí)曲線(xiàn),遇上問(wèn)題可以直接參考Win32 SDK解決,。使用Message Hook使得測(cè)試程序可以靈活實(shí)現(xiàn),,直接對(duì)Window Message的操作不僅可以把很多情況化繁為簡(jiǎn),還方便test hook的實(shí)現(xiàn),。(所謂test hook,,是指產(chǎn)品中為了方便測(cè)試而專(zhuān)門(mén)設(shè)計(jì)的隱藏功能,該功能對(duì)普通用戶(hù)不可見(jiàn),,只是為了方便測(cè)試,。)

    缺點(diǎn)包括以下三個(gè)方面:

    使用復(fù)雜,實(shí)現(xiàn)成本高,。Win32 AP的使用上有很多需要特別注意的細(xì)節(jié),, 比如有的Win32 API不能跨進(jìn)程工作,有的Windows Message只能發(fā)給當(dāng)前線(xiàn)程所創(chuàng)建的窗口,,稍有不慎,,就導(dǎo)致測(cè)試程序不穩(wěn)定。

    過(guò)于底層,,不便使用,。為了方便測(cè)試用例調(diào)用,,需要對(duì)API進(jìn)行封裝,,增加了實(shí)現(xiàn)成本。同時(shí) Win32 API的也使得很多VB程序員不便調(diào)用,。再者,, 不同的開(kāi)發(fā)工具,比如MFC,, VCL,,以及后來(lái)的.NET Framework,在內(nèi)部實(shí)現(xiàn)上對(duì)Win32 API有很多細(xì)節(jié)的處理,, 要實(shí)現(xiàn)出針對(duì)各種情況都通用的測(cè)試框架,,并非易事。比如,, .NET 中的WinForm Control對(duì)Win32 HWND的維護(hù)是動(dòng)態(tài)的,,同一個(gè)WinForm Control的HWND在程序的生命周期內(nèi)是可能發(fā)生改變的,,這一點(diǎn)對(duì)于依賴(lài)HWND作為唯一標(biāo)識(shí)的Win32 API就是一個(gè)致命傷。

    無(wú)法操作自繪窗口,。比如打開(kāi)Excel的工作表,會(huì)發(fā)現(xiàn)表格中的每一個(gè)Cell并沒(méi)有對(duì)應(yīng)到HWND上。Excel的cell都是通過(guò)代碼繪制,,而不是依賴(lài)于現(xiàn)成的Win32 Control,。這就使得Win32 API對(duì)于自繪窗口沒(méi)有用武之地。

MSAA

    MSAA的全稱(chēng)是Microsoft Active Accessibility,。這是類(lèi)似DCOM技術(shù),。技術(shù)模型是這樣的,UI程序可以暴露出一個(gè)Interface,,方便另一個(gè)程序?qū)ζ溥M(jìn)行控制,。MSAA技術(shù)的初衷是為了方便殘疾人使用Windows 程序。比如盲人看不到窗口,,但是盲人可以通過(guò)一個(gè)USB讀屏器連接到電腦上,, 讀屏器通過(guò)UI程序暴露出來(lái)的這個(gè)Interface,就可以獲取程序信息,,通過(guò)盲文或者其它形式傳遞給盲人,。

    MSAA提供了如此方便的功能, UI自動(dòng)化測(cè)試自然可以借用這項(xiàng)技術(shù),。MSAA暴露出來(lái)的Interface叫做IAccessible,。測(cè)試程序和目標(biāo)UI程序互操作流程如下:

    1. 測(cè)試程序調(diào)用Windows API: AccessibleObjectFromWindow,傳入目標(biāo)UI程序HWND,。

    2. AccessibleObjectFromWindow函數(shù)向UI程序發(fā)送WM_GETOBJECT消息,。

    3. UI程序創(chuàng)建實(shí)現(xiàn)了IAccessible的內(nèi)部類(lèi),然后通過(guò)LresultFromObject API把IAccessible 接口返回給測(cè)試程序,。

    4. 測(cè)試程序拿到IAccessible接口,,開(kāi)始調(diào)用IAccessible接口函數(shù)操作測(cè)試目標(biāo)。

    IAccessible接口里面的幾個(gè)關(guān)鍵函數(shù)是:

  • IAccessible::get_accChild/ IAccessible::get_accParent通過(guò)這兩個(gè)函數(shù),,調(diào)用者可以瀏覽目標(biāo)程序的窗口關(guān)系樹(shù),,定位到UI元素。
  • IAccessible::accLocation/I Accessible::accHitTest讀取和分辨目標(biāo)元素的屏幕位置,。
  • IAccessible::accName/ I Accessible:: accSelect讀取元素的名字,,對(duì)UI元素進(jìn)行指定的操作,比如選取Listbox里面的某一項(xiàng)等等,。
  • IAccessible::accValue 開(kāi)發(fā)人員可以自定義value屬性的實(shí)現(xiàn),。比如針對(duì)折線(xiàn)圖控件,開(kāi)發(fā)人員可以在accValue中返回折線(xiàn)的坐標(biāo)數(shù)列,。

    MSAA的理念類(lèi)似于test hook,。 通過(guò)主動(dòng)讓UI程序暴露一個(gè)接口來(lái)讓調(diào)用者控制,。在具體使用中,測(cè)試人員往往是結(jié)合MSAA和Win32 API操作,,取長(zhǎng)補(bǔ)短,。一方面對(duì)于UI元素豐富的屬性,比如style,,鉤選狀態(tài),,是否最大化和模擬用戶(hù)輸入等,繼續(xù)采用Win32 API,。另一方面用MSAA的優(yōu)勢(shì)來(lái)彌補(bǔ)Win32 API的一些不足,,比如:

    由于MSAA有自己的get_accChild方法,使其控件樹(shù)關(guān)系并不一定要和Win32 HWNDd關(guān)系對(duì)應(yīng)一致,。對(duì)于自繪窗口,,雖然說(shuō)只有一個(gè)HWND,但是開(kāi)發(fā)人員可以通過(guò)實(shí)現(xiàn)IAccessible接口來(lái)實(shí)現(xiàn)邏輯上的層次關(guān)系,。比如Excel中就可以通過(guò)IAccessible把多個(gè)cell的子IAccessible接口暴露給調(diào)用者,。

    IAccessible的實(shí)現(xiàn)是由開(kāi)發(fā)者提供,開(kāi)發(fā)者可以靈活地根據(jù)實(shí)際情況決定方法的實(shí)現(xiàn),。比如前面提到了折線(xiàn)圖控件可以返回坐標(biāo)數(shù)列,。對(duì)于.NET WinForm, 微軟在Framework中就提供了IAccessible的默認(rèn)實(shí)現(xiàn),,這樣在具體實(shí)現(xiàn)中,,就可以處理.NET動(dòng)態(tài)維護(hù)HWND的細(xì)節(jié)等等。

    針對(duì)MSAA的工具也有很多,,比如AccExplorer(圖二)可以像Spy++一樣對(duì)指定程序進(jìn)行控件的樹(shù)形瀏覽,,檢查MSAA屬性等。

AccExp

圖二: AccExplorer

    如果您是開(kāi)發(fā)人員,, 對(duì)于unmanaged UI程序的MSAA實(shí)現(xiàn),,參考MSDN中關(guān)于WM_GETOBJECT的說(shuō)明返回IAccessible interface就可以了。對(duì)于managed程序,, 實(shí)現(xiàn)方法更簡(jiǎn)單,, 現(xiàn)成的例子可以參考:

    對(duì)于測(cè)試程序如何直接獲取并使用IAccessible接口,,并非本系列重點(diǎn),,所以并不提供更多介紹。在后面的文章中,, 會(huì)介紹如何隱含使用IAccessible和MSAA,。

    MSAA也有自身的缺點(diǎn):

    1. 雖然說(shuō)MSAA基于COM技術(shù), 但I(xiàn)Accessible并不是一個(gè)COM標(biāo)準(zhǔn)接口,。 比如使用者不需要調(diào)用CoInitialize即可使用,,也無(wú)法通過(guò)QueryInterface進(jìn)一步獲取更多的自定義接口,。這局限了MSAA所能提供的功能。

    2. IAccessible接口的定義有缺陷,。里面不少方法是可有可無(wú)的,,但是又缺少一些支持UI自動(dòng)化的關(guān)鍵方法。 比如它提供了accSelect支持控件的選取,,但是卻沒(méi)有類(lèi)似accExpand這樣的方法支持樹(shù)狀控件的展開(kāi)等,。

    關(guān)于MSAA和UI自動(dòng)化的更多淵源,MSAA設(shè)計(jì)理念,,現(xiàn)狀和缺陷,,可以參考微軟早期的一篇名為What is UI Automation的文章。(未完待續(xù))

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多