• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 客戶端自動化測試之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.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>