客戶端自動化測試之Proxy框架介紹

發表于:2012-10-30來源:百度質量部作者:不詳點擊數: 標簽:客戶端自動化測試之
背景 Windows客戶端產品基于UI的自動化測試自古以來都比較難做,基于非標準控件的UI自動化更是難上加難。進程間基于UI的自動化測試會對產品UI布局有很大依賴,產品布局的每一次改動都可能會使相關自動化測試用例失效。

  背景

  Windows客戶端產品基于UI的自動化測試自古以來都比較難做,基于非標準控件的UI自動化更是難上加難。進程間基于UI的自動化測試會對產品UI布局有很大依賴,產品布局的每一次改動都可能會使相關自動化測試用例失效。

  于是我們需要一種可以動態跟隨UI變化的機制,可以在運行時確定UI的布局,進而實施相應UI自動化測試。除了獲取UI布局外,像UI的一些狀態信息(位置、文字等),對自動化測試也是非常必要。為此,我們采用代理的方式,以“假注入”的形式實現了對主程序運行時狀態的獲取。

  概述

  被測產品的Proxy是由運行于產品進程當內的命令處理模塊(ProxyAgent)和運行于進程外的適配器模塊(ProxyAdapter)組成的。 ProxyAgent模塊運行于產品進程內可以帶來很多便利,一是上面提到的可以動態獲取產品的狀態信息,二是增加了測試人員的主動權,因為測試代碼與產品代碼同源,許多操作不需要再請求開發人員來實現,測試人員自己可以安排人員去實現。ProxyAdapter從名字可以看出為適配器層,它屏蔽了C++ 的復雜接口,為上層調用者提供了標準的Python接口。

  Proxy結構

  被測產品在代碼層面進行了支持,通過加載動態鏈接庫的方式實現。整個Proxy由兩部分組成:產品內代理層和產品外協議適配器層。

  ※ 產品內代理層(ProxyAgent)。產品進程內DLL,它接收命令、查詢并返回產品UI的狀態信息。

  ※產品外協議適配器層(ProxyAdapter)。轉發用戶命令、接收進程內ProxyAgent返回信息并提供Python接口,方便上層自動化庫調用。

  圖1 Proxy在自動化庫中的結構

  實現機制

  Proxy為產品進程內動態鏈接器,與產品工程同源,可以方便地引用產品當中的各種庫和頭文件,相當于產品的測試后門,理論上講ProxyAgent可以協助測試發起任何產品支持的動作。ProxyAdapter為獨立的適配器層,可獨立編譯,它向上為python提供接口,中間將命令信息進行轉化,下層與進程外的Proxy打交道,進行信息交換。ProxyAgent與ProxyAdaper的出現使測試代碼可以直接獲取運行中產品的信息,大大提高了系統級測試的效率。增加Proxy前后示意圖如圖2所示

  圖2 無代理VS有代理

  ProxyAgent實現機制

  ProxyAgent實質上是一個進程內DLL,此DLL提供初始化接口和反初始化接口,開發人員判斷指定的DLL是否存在,若存在則調用此DLL的初始化接口,產品退出時調用反初始化接口。產品當中,初始化時ProxyAgent建立隱藏窗體,用來接收運行中發過來的消息;反初始時銷毀隱藏窗體。流程如圖3

  圖3 ProxyAgent生命周期

  ProxyAdapter實現機制

  本模塊通過Windows消息和共享內存來傳遞命令,與產品當中的ProxyAgent實現交互。產品狀態信息通過共享內存實現。在本層進行了封裝,將調用接口封裝成python接口,方便上層python關鍵字庫調用,可以降低用例編寫成本。

  模塊設計及實現

  ProxyAdapter需要接收上層的請求,并將請求轉發至ProxyAgent層。因此需要定義相應的協議來進行通信。產品狀態信息有多種,相應的對象也有多種,不同的方式導致無法提供唯一接口,現階段存在兩種接口。通過這些定義好的協議和接口,可以實現一個完整的通信過程。通信過程如圖四所示。

  圖4 Proxy調用過程

  通信協議

  Proxy接收用戶命令,需要獲取產品上某個控件的狀態信息。通常情況下需要兩個標識才能實現。具體表現為<對象標識,控件標識>。由于產品設計原因,現存在兩種協議。我們采用Windows消息和共享內存實現命令的傳輸,所以下面協議的表達形式按SendMessage參數來進行。兩種協議對不同的UI控件實現支持。

  圖5 協議一

  圖6 協議二

  通信接口

  存在兩種協議,所以模塊提供了兩種類型的接口。接口1形式為GetXXXXInfoByIdx,每個接口對應一個真實存在的產品窗體對象;接口2形式更為通用,它只有一個接口,通過參數來標識要獲取信息的對象,形如GetUIInfoByName(int nObjectID,CString szName,CString szType);

  ProxyAgent代碼結構

  ProxyAgent在接收到命令之后會根據其目標對象將命令轉發至相應的處理類(函數),通過調用統一的接口,獲取控件最基本的狀態信息。當有新窗口加入時,只需要實現相應的子類即可。表1展示了獲取某個功能窗口相應控件信息的過程??梢钥闯?,在代碼中添加新功能較為簡單。

  表1 增加某些新功能的支持

  ProxyAdapter代碼結構

  ProxyAdapter結構較為簡單,實現簡單的數據轉化、轉發功能。一是把上層數據轉化為Windows消息和共享內存數據發送到ProxyAgent,二是從共享內存接收ProxyAgent返回的數據。表2展示了一個典型的數據轉發過程。

  Proxy的優勢

  Google在輸入法測試和產品測試當中均使用了代理模式,它為自動化測試提供了非常強大的支持。系統測試多是在產品進程外部的操作,受限于進程隔離和 Windows界面,很多操作非常難實現,所以才有了諸多前輩們在Windows上的自動化嘗試。常見的Windows自動化操作在這里就不一一列舉,感覺興趣的同學可以百度之??傮w上我們可以看,每個方法都在努力與被測產品建立聯系。通過添加進程內代理,可以使艱難的進程間操作變得簡單。具體優勢如下:

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97