真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PO模式在selenium自動(dòng)化測(cè)試框架有什么好處

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

創(chuàng)新互聯(lián)公司成立與2013年,公司以成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、系統(tǒng)開(kāi)發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計(jì)等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶(hù)超過(guò)千家,涉及國(guó)內(nèi)多個(gè)省份客戶(hù)。擁有多年網(wǎng)站建設(shè)開(kāi)發(fā)經(jīng)驗(yàn)。為企業(yè)提供專(zhuān)業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計(jì)、宣傳推廣等服務(wù)。 通過(guò)專(zhuān)業(yè)的設(shè)計(jì)、獨(dú)特的風(fēng)格,為不同客戶(hù)提供各種風(fēng)格的特色服務(wù)。

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

在PO模式當(dāng)中,每一個(gè)UI頁(yè)面使用編程語(yǔ)言當(dāng)中的類(lèi)來(lái)表示。在這個(gè)類(lèi)當(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ě)了什么東西。

def test_login_mail(self):
    driver = self.driver
    driver.get("http://www.xxx.xxx.com")
    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í)非常有用。

def test_login_mail(self):
    LoginPage(driver).login()

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

class LoginPage:
	username_loc=(By.ID,"idInput")
    password_loc =(By.ID,"pwdInput")
    submit_loc =(By.ID,"loginBtn")
    span_loc=(By.CSS_SELECTOR,"div.error-tt>p")
    dynpw_loc =(By.ID,"lbDynPw")
    userid_loc =(By.ID,"spnUid")
    
    
    def __init__(self, driver):
        self.driver = driver
        
    def login(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)也比較方便。

class LoginPage:
    def __init__(self, driver)
    	self.driver = driver
        
    @property
    def username_element(self):
        return self.driver.find_element('id', 'idInput')
    
    @property
    def password_element(self):
        return self.driver.find_element('id', 'pwdInput')
    
    @property
    def submit_element(self):
        return self.driver.find_element('id', 'loginBtn')
    
    def login(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框架都有類(lèi)似的用法。

class LoginPage:
    def __init__(self, driver)
    	self.driver = driver
        
    username = Element(css='#idInput', desc='用戶(hù)名輸入框')
    password = Element(css='#pwdInput', desc='密碼輸入框')
    confirm = Element(css='#loginBtn', desc='登錄確認(rèn)按鈕')
    
   	def login(self, name, password):
        self.username.send_keys(name)
        self.password.send_keys(password)
        self.confirm.click()
        

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

class Element:

    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)
        return el

PO模式和DDD

PO模式是DDD(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))的一個(gè)簡(jiǎn)單實(shí)現(xiàn),但是還不夠徹底。如果要在自動(dòng)化測(cè)試中貫徹DDD,我覺(jué)得還有一些可以?xún)?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()
# or
login(user)

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

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

class LoginPage:
	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ú)的存放在一個(gè)類(lèi)文件中,當(dāng)前端頁(yè)面被修改之后,只需要找到對(duì)應(yīng)類(lèi)文件進(jìn)行修改,其他的代碼并不需要進(jìn)行修改,這符合單一職責(zé)原則。
  • 便于重復(fù)使用。在進(jìn)行自動(dòng)化測(cè)試的時(shí)候,一個(gè)測(cè)試由多個(gè)測(cè)試步驟組成,這些測(cè)試步驟可能涉及到多個(gè)頁(yè)面的操作。而用例與用例之間的操作可能重合。PO模式可以重復(fù)利用這些測(cè)試步驟,簡(jiǎn)化代碼的編寫(xiě)。
  • 提高了可讀性。頁(yè)面的操作都被以函數(shù)的形式封裝起來(lái)了。函數(shù)名就具備注釋的作用,其他人閱讀代碼時(shí)可以通過(guò)函數(shù)了解業(yè)務(wù)。

當(dāng)前題目:PO模式在selenium自動(dòng)化測(cè)試框架有什么好處
文章來(lái)源:http://weahome.cn/article/dsoghhd.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部