GUI自動(dòng)化測(cè)試原理剖析
序言:接觸過(guò)自動(dòng)化測(cè)試工具的測(cè)試人員,例如,Rational fuction teste,QTP等,一定對(duì)“錄制—回放”這種機(jī)制不陌生吧,但是又有多少人能夠了解其內(nèi)部大概的運(yùn)行機(jī)制呢?更又有多少人能從代碼級(jí)別及其框架去分析其運(yùn)作原理呢?
我一直覺(jué)得,你不理解它,你就無(wú)法用好它,更別說(shuō)去拓展它成一個(gè)框架或者平臺(tái)了。
它,在錄制時(shí),是怎么獲取對(duì)象的?可以不通過(guò)錄制的方式獲得對(duì)象嗎?
它,在回放時(shí),是采用調(diào)用什么方式進(jìn)行回放的?可以通過(guò)API或者自己編寫代碼使其錄制的腳本進(jìn)行回放嗎?
自己如何去編寫一個(gè)簡(jiǎn)單的“錄制—回放”工具呢?
那么,今天就大概根據(jù)自己的簡(jiǎn)單介紹一下這種機(jī)制,希望能夠幫助大家一起真正走入一個(gè)自動(dòng)化測(cè)試的“大門”。
一、工具如何實(shí)現(xiàn)錄制和回放
首先大概介紹一下自動(dòng)化測(cè)試工具實(shí)現(xiàn)錄制和回放的兩種方法,其重點(diǎn)是對(duì)象的識(shí)別。
1、靜態(tài)映射:當(dāng)錄制時(shí),通過(guò)ObjectMap,將需要識(shí)別的JAVA應(yīng)用程序的組件對(duì)象映射進(jìn)對(duì)象庫(kù),然后,回放時(shí),RFT首先根據(jù)正在運(yùn)行的JAVA程序到對(duì)象庫(kù)去查找相應(yīng)的對(duì)象,若匹配到對(duì)應(yīng)屬性閾值適合的對(duì)象,則調(diào)用其腳本中的方法對(duì)對(duì)象執(zhí)行操作。
一般的工具在工具與AUT之間都有一個(gè)代理,這個(gè)代理就是包裹著實(shí)際要測(cè)試的界面的控件,而ObjectMap是腳本層面的東西,它們之間存在一個(gè)映射關(guān)系。RFT通過(guò)代理與AUT進(jìn)行交互。
需要明白的是,由于swing組件的樹形結(jié)構(gòu)關(guān)系,因此,ObjectMap中的映射出來(lái)的對(duì)象也是采用這種形式,雖然RFT中可以通過(guò)自己設(shè)置識(shí)別閾值的方式,但是對(duì)界面更改的適應(yīng)能力還是不高。
2、動(dòng)態(tài)搜索:應(yīng)用動(dòng)態(tài)搜索就可以不需要采用錄制的方式了,而且也不需要對(duì)象庫(kù)的方式,它是直接通過(guò)調(diào)用工作庫(kù)中的API來(lái)定制相應(yīng)的組件屬性進(jìn)行查找即可;回放時(shí),自動(dòng)化測(cè)試工具會(huì)獲取正在運(yùn)行的JAVA程序的各個(gè)組件屬性,然后進(jìn)行屬性匹配,若是能夠匹配到相應(yīng)符合的屬性,則會(huì)進(jìn)行腳本規(guī)定的方法操作;
所以,應(yīng)用動(dòng)態(tài)搜索的方式,雖然在識(shí)別效率上降低了,但是其識(shí)別能力大大提高,界面如何變化,只要屬性值不變,就沒(méi)有太大問(wèn)題,這也是為什么需要開(kāi)發(fā)在開(kāi)發(fā)JAVA程序的時(shí)候,盡量在屬性值里添加一個(gè)唯一的識(shí)別屬性ID了,這樣做的目的可以使自動(dòng)化測(cè)試更好的開(kāi)展,這也可以作為以后各位的一個(gè)DFT需求了。
二、錄制和回放的原理
經(jīng)過(guò)了第一環(huán)節(jié)的介紹,大家對(duì)自動(dòng)化測(cè)試工作實(shí)現(xiàn)錄制和回放的兩種方式大概有所了解,但是深層次是怎么樣的呢?
借用關(guān)于JAVA的事件生命周期的一幅圖片來(lái)說(shuō)明:
測(cè)試人員通過(guò)對(duì)界面的操作會(huì)生成一系列的事件,這些事件在工具的代碼中會(huì)由事件生成后放在系統(tǒng)事件隊(duì)列內(nèi)部。現(xiàn)在事件處于事件分發(fā)線程的控制下。事件在隊(duì)列中等待處理,然后事件從事件隊(duì)列中選出,送到dispatchEvent()方法,dispatchEvent()方法調(diào)用processEvent()方法并將事件的一個(gè)引用傳遞給processEvent()方法。此刻,系統(tǒng)會(huì)查看是否有送出事件的位置,如果沒(méi)有這種事件類型相應(yīng)的已經(jīng)注冊(cè)的監(jiān)聽(tīng)器,或者如果沒(méi)有任何組件受到激活來(lái)接收事件類型,事件就被拋棄。
錄制時(shí),采用了監(jiān)聽(tīng)器模式,和平常swing編程不同的是,這里的監(jiān)聽(tīng)器不是針對(duì)某個(gè)組件的,而是針對(duì)某種事件的。也就是說(shuō),任何組件發(fā)出的同一類型的事件,比如鼠標(biāo)或者鍵盤事件,都會(huì)被其相應(yīng)的監(jiān)聽(tīng)器捕獲到,然后進(jìn)行處理。然后將捕獲到的JAVA事件,可以以某種格式保存在腳本文件中,這里就需要一個(gè)轉(zhuǎn)換機(jī)制了。
回放時(shí),則從腳本文件讀取并還原事件,這里會(huì)用到j(luò)ava.awt.Robot類(JDK1.3之后引入的一個(gè)類,能模擬鼠標(biāo)和鍵盤操作),這個(gè)類通常用來(lái)在自動(dòng)化測(cè)試或程序演示中模擬系統(tǒng)事件,這個(gè)類主要的目的就是為方便的實(shí)現(xiàn)java的GUI自動(dòng)化測(cè)試平臺(tái)。在事件回放時(shí),我們同樣需要該類來(lái)模擬生成系統(tǒng)的事件,完成記錄的操作的回放
三、Gui自動(dòng)化測(cè)試的簡(jiǎn)單框架架構(gòu)
1、類加載器或者應(yīng)用程序加載器,則是去加載相應(yīng)的應(yīng)用程序或者主類,這樣可以指定需要測(cè)試的應(yīng)用程序。
2、事件監(jiān)聽(tīng)器,則是對(duì)應(yīng)用程序所產(chǎn)生的各種事件的一個(gè)監(jiān)聽(tīng)機(jī)制,可以通過(guò)拓展不同的事件監(jiān)聽(tīng)來(lái)獲得不同的事件。
3、腳本解析器,包括腳本記錄器與腳本讀取器兩個(gè)模塊,一個(gè)可以從監(jiān)聽(tīng)器中獲得事件的有效信息并記錄,可以指定記錄到生成相應(yīng)腳本。一個(gè)可以從本地腳本文件或文本域中讀取腳本信息,并解釋成相應(yīng)事件。
4、Robot類再封裝,即是一個(gè)模擬回放器,將從腳本解析器解析過(guò)來(lái)的代碼通過(guò)調(diào)用Rboot類進(jìn)行模擬鼠標(biāo)和鍵盤的一系列操作。
一個(gè)GUI自動(dòng)化測(cè)試框架的基本架構(gòu)大概就是這樣,如果有興趣的朋友可以深入研究,因?yàn)樯虡I(yè)化的自動(dòng)化測(cè)試工作實(shí)現(xiàn)的架構(gòu)比這個(gè)要復(fù)雜一些,但原理基本還是一樣的。
WEB與WIN32等界面自動(dòng)化測(cè)試的原理架構(gòu)大致也是如此,不過(guò)實(shí)現(xiàn)方式還是很不一樣的,關(guān)鍵是調(diào)用的庫(kù)方式不一樣,具體在以后可以一起討論。
四、選擇一種合適的自動(dòng)化測(cè)試方案
所以根據(jù)以上架構(gòu)和原理,在自動(dòng)化測(cè)試項(xiàng)目開(kāi)展過(guò)程中
1、有資源和人力的情況下,可以考慮自己去開(kāi)發(fā)一個(gè)簡(jiǎn)單的自動(dòng)化測(cè)試工具,這樣的好處是靈活,能夠很好的與自身的產(chǎn)品結(jié)合起來(lái),缺點(diǎn)就是耗費(fèi)資源太大,而且開(kāi)發(fā)自動(dòng)化測(cè)試工具不一定能好用。
2、可以結(jié)合相應(yīng)的開(kāi)源自動(dòng)化測(cè)試工具(例如:測(cè)試swing的可以用abbot),這種方式優(yōu)點(diǎn)就是免費(fèi)而且實(shí)現(xiàn)也有一定的基礎(chǔ),缺點(diǎn)就是其功能不一定滿足其需求。
3、采用商業(yè)性的自動(dòng)化測(cè)試工作(例如:RFT),這種方式的優(yōu)點(diǎn)是成熟度高,而且能很快的應(yīng)用到項(xiàng)目中,但是注意的是需要自己去搭建一個(gè)框架,個(gè)人建議,應(yīng)用RFT的話最好直接應(yīng)用其API去拓展一個(gè)自己的庫(kù),通過(guò)自己的庫(kù)去搭建一個(gè)適應(yīng)自己需求的框架,這個(gè)在后期會(huì)介紹。
總之:各種方案的實(shí)行方式還是得具體根據(jù)項(xiàng)目的需求來(lái),需求才是導(dǎo)向,而且個(gè)人根據(jù)經(jīng)驗(yàn):不要為了做自動(dòng)化而自動(dòng)化,不要去為了做自動(dòng)化而迷戀入技術(shù)而不可自拔,一定要在適當(dāng)?shù)臅r(shí)候采用適當(dāng)?shù)姆绞剑讲綖檫M(jìn)。真心希望大家都能做好自動(dòng)化測(cè)試。
版權(quán)聲明:本文出自 散步的SUN 的51Testing軟件測(cè)試博客:http://www.51testing.com/?382641
【編輯推薦】


























