PO模式在selenium自動(dòng)化測(cè)試框架的優(yōu)勢(shì)_第1頁(yè)
PO模式在selenium自動(dòng)化測(cè)試框架的優(yōu)勢(shì)_第2頁(yè)
PO模式在selenium自動(dòng)化測(cè)試框架的優(yōu)勢(shì)_第3頁(yè)
PO模式在selenium自動(dòng)化測(cè)試框架的優(yōu)勢(shì)_第4頁(yè)
PO模式在selenium自動(dòng)化測(cè)試框架的優(yōu)勢(shì)_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第PO模式在selenium自動(dòng)化測(cè)試框架的優(yōu)勢(shì)PO模型是:PageObjectModel的簡(jiǎn)寫(xiě)頁(yè)面對(duì)象模型

作用:就是把測(cè)試頁(yè)面和測(cè)試腳本進(jìn)行分離,即把頁(yè)面封裝成類,供測(cè)試腳本進(jìn)行調(diào)用;

分層機(jī)制,讓不同層去做不同類型的事情,讓代碼結(jié)構(gòu)清晰,增加復(fù)用性。

PO設(shè)計(jì)模式是Selenium自動(dòng)化測(cè)試中最佳的設(shè)計(jì)模式之一,主要體現(xiàn)在對(duì)界面交互細(xì)節(jié)的封裝

2.不使用PO設(shè)計(jì)會(huì)出現(xiàn)以下幾種情況:

復(fù)用性不太好,擴(kuò)展性不好,易讀性差,不好維護(hù),UI界面頻繁的項(xiàng)目維護(hù)起來(lái)比較麻煩。

3.PO模式的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

提高代碼的可讀性減少了代碼的重復(fù)提高代碼的可維護(hù)性,特別是針對(duì)UI界面頻繁的項(xiàng)目

缺點(diǎn):

造成項(xiàng)目結(jié)構(gòu)比較復(fù)雜,因?yàn)槭歉鶕?jù)流程進(jìn)行了模塊化處理

下面重點(diǎn)看下PO模式在selenium自動(dòng)化測(cè)試框架的優(yōu)勢(shì)。

PO模式是在UI自動(dòng)化測(cè)試過(guò)程當(dāng)中使用非常頻繁的一種設(shè)計(jì)模式,使用這種模式后,可以有效的提升代碼的復(fù)用能力,并且讓自動(dòng)化測(cè)試代碼維護(hù)起來(lái)更加方便。

PO模式的全稱叫pageobjectmodel(POM),有時(shí)候叫做pageobjectpattern。最開(kāi)始由馬丁福勒提出,這個(gè)模式受到selenium自動(dòng)化測(cè)試框架大力推廣,因而成為一種非常主流的自動(dòng)化測(cè)試設(shè)計(jì)模式。

在PO模式當(dāng)中,每一個(gè)UI頁(yè)面使用編程語(yǔ)言當(dāng)中的類來(lái)表示。在這個(gè)類當(dāng)中,通過(guò)函數(shù)形式定義頁(yè)面的行為和操作。這讓調(diào)用方不需要關(guān)注具體執(zhí)行的操作到底是點(diǎn)擊還是拖動(dòng),而是關(guān)注具體的業(yè)務(wù),比如登錄、購(gòu)物等等,甚至如果程序員直接把代碼給產(chǎn)品經(jīng)理看,他也是能看懂的。

沒(méi)有使用PO模式時(shí)

在測(cè)試用例中直接編寫(xiě)瀏覽器操作API,對(duì)于代碼編寫(xiě)者并沒(méi)有多高的難度,因?yàn)樗约阂呀?jīng)對(duì)這些API非常熟悉,但是這些瀏覽器操作并不能體現(xiàn)業(yè)務(wù),至少?zèng)]有產(chǎn)品經(jīng)理那么熟悉,因此他很難和產(chǎn)品經(jīng)理進(jìn)行溝通,也難和開(kāi)發(fā)溝通,甚至在半個(gè)月之后,他已經(jīng)忘記了自己到底寫(xiě)了什么東西。

deftest_login_mail(self):

driver=self.driver

driver.get("")

driver.find_element_by_id("idInput").clear()

driver.find_element_by_id("xxxxxxx").send_keys("xxxxx")

driver.find_element_by_id("xxxxxxx").clear()

driver.find_element_by_id("xxxxxxx").send_keys("xxxxxx")

driver.find_element_by_id("loginBtn").click()

使用PO模式

使用PO模式有利于梳理業(yè)務(wù),也有利于和其他人進(jìn)行溝通。當(dāng)你把下面這段代碼拿給產(chǎn)品經(jīng)理看的時(shí)候,他也大概能知道你測(cè)的是什么業(yè)務(wù),能幫你糾正你的測(cè)試流程是否正確,或者提出一些更有建設(shè)性的意見(jiàn),這對(duì)于大型項(xiàng)目需要頻繁溝通和梳理業(yè)務(wù)時(shí)非常有用。

deftest_login_mail(self):

LoginPage(driver).login()

而瀏覽器本身的操作,就會(huì)被分離到一個(gè)更底層的模塊,這些代碼你可以不對(duì)調(diào)用方暴露,產(chǎn)品經(jīng)理并不關(guān)心你這個(gè)頁(yè)面中什么元素定位,他也不懂。

classLoginPage:

username_loc=(By.ID,"idInput")

password_loc=(By.ID,"pwdInput")

submit_loc=(By.ID,"loginBtn")

span_loc=(By.CSS_SELECTOR,"div.error-ttp")

dynpw_loc=(By.ID,"lbDynPw")

userid_loc=(By.ID,"spnUid")

def__init__(self,driver):

self.driver=driver

deflogin(self):

self.driver.find_element(*self.username_loc).clear()

self.driver.find_element(*self.username_loc).send_keys("xxxxx")

self.driver.find_element(*self.password_loc).clear()

self.driver.find_element(*self.password_loc).send_keys("xxxxxx")

self.driver.find_element(*self.submit_loc).click()

這種方式把元素定位方式也分離了。但是這種元素定位的表達(dá)式可讀性也不是很強(qiáng),可以換用property方式來(lái)表示元素,所有的元素統(tǒng)一放在一起,修改起來(lái)也比較方便。

classLoginPage:

def__init__(self,driver)

self.driver=driver

@property

defusername_element(self):

returnself.driver.find_element('id','idInput')

defpassword_element(self):

returnself.driver.find_element('id','pwdInput')

defsubmit_element(self):

returnself.driver.find_element('id','loginBtn')

deflogin(self,name,password):

self.username_element.send_keys(name)

self.password_element.send_keys(password)

self.submit_element.click()

第三種方式可以充分利用Python的描述符特性,你會(huì)發(fā)現(xiàn)很多序列化庫(kù)或者ORM框架都有類似的用法。

classLoginPage:

def__init__(self,driver)

self.driver=driver

username=Element(css='#idInput',desc='用戶名輸入框')

password=Element(css='#pwdInput',desc='密碼輸入框')

confirm=Element(css='#loginBtn',desc='登錄確認(rèn)按鈕')

deflogin(self,name,password):

self.username.send_keys(name)

self.password.send_keys(password)

self.confirm.click()

而Element類可以通過(guò)Python描述符實(shí)現(xiàn),這里為了方便,只定義了xpath的元素定位方法:

classElement:

def__init__(self,xpath=None,desc=''):

self.xpath=xpath

self.desc=desc

def__get__(self,instance,owner):

driver=instance.browser

el=driver.find_element('xpath',self.xpath)

returnel

PO模式和DDD

PO模式是DDD(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))的一個(gè)簡(jiǎn)單實(shí)現(xiàn),但是還不夠徹底。如果要在自動(dòng)化測(cè)試中貫徹DDD,我覺(jué)得還有一些可以優(yōu)化的空間。

首先某一個(gè)業(yè)務(wù)不一定只是單個(gè)頁(yè)面的操作,比如登錄不一定只涉及到LoginPage這個(gè)頁(yè)面,因此直接在LoginPage中編寫(xiě)login函數(shù)就不是很合理。對(duì)于調(diào)用方來(lái)說(shuō),應(yīng)該明確說(shuō)明的是誰(shuí)在登錄,而不是指某個(gè)頁(yè)面。像這樣:

user.login()

login(user)

我們編寫(xiě)的代碼就像是自然語(yǔ)言,任何懂英語(yǔ)的人都知道代碼在做什么,在DDD中,叫做領(lǐng)域特定語(yǔ)言(DSL),要實(shí)現(xiàn)這種邏輯,在Page類和調(diào)用中間應(yīng)該還會(huì)有一個(gè)層級(jí)來(lái)封裝user。

其次,Page頁(yè)面會(huì)依賴更底層的資源,比如組件,元素類型。因此在Page類的下方應(yīng)該會(huì)使用InputElement,ButtonElement、SelectElement這樣的元素類和HeaderComponent、FooterComponent這樣的組件類。

classLoginPage:

username_filed=InputElement('xxx')

password_filed=PasswordElement('xxx')

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)對(duì)于大型項(xiàng)目梳理業(yè)務(wù)、同步業(yè)務(wù)、溝通業(yè)務(wù)是非常有幫助的,是一種以業(yè)務(wù)為中心的設(shè)計(jì)范式。PO模式對(duì)于DDD的小范圍應(yīng)用,以及具體了足夠多的好處:

便于維護(hù)。每一個(gè)頁(yè)面的操作都被單獨(dú)的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論