一、什麼是PO設計模式?
PO(PageObject)設計模式將某個頁面的所有元素對象定位和對元素對象的操作封裝成一個 Page 類,即一個py文件,並以頁面為單位來寫測試用例,實現頁面對象和測試用例的分離,若元素發生變化,只需要進入對應的Page類,更新元素定位即可,不用修改用例。
二、在什麼樣的場景下使用PO設計模式?(where)
隨著時間的推移,需要維護的頁面越來越多時,如果使用傳統的設計模式把測不同頁面上的所有步驟寫在同一個模塊裡面,會顯得笨重。如果頁面發生了改變,對應的腳本也要發生改變,難以維護就可以體現出來了,所以使用的PO設計模式會方便很多。
三、PO模式的六大原則
(1)一個 public 方法代表一個公共的服務。就是說一個方法代替頁面上的某個操作(公共方法表示頁面提供的服務)
(2)PageObject 中的方法細節不可暴露在外,通過提供公共服務接口的形式提供給外部(不要暴露頁面的細節)
(3)一般不需要在 PageObject 中斷言(Page設計中不要出現斷言,應該寫在測試用例類中)
(4)當有頁面跳轉的操作時候,執行這個方法時應該在方法結束返回時能夠跳轉到另一個頁面中(方法應該返回其他的Page對象)
(5)我們只需要對頁面中我們需要的重要的內容進行封裝(不要去代表整個page,如果一個頁面中有很多功能,只需要對重點功能封裝方法即可)
(6)頁面中相同的組件,但是不同的操作應該要被拆成不同的方法進行封裝(不同的結果返回不同的方法,不同的模式)
四、PO 模式可以把一個頁面分為二個層級:對象操作層、業務層。
(1)對象操作層:封裝定位元素,封裝對元素的操作。
(2)業務層:將一個或多個操作組合起來完成一個業務功能。
五、什麼是自動化測試框架
說到自動化框架,我相信很多人應該都聽過這個詞,但是不知其到底是個什麼東西,為什麼要用自動化框架。有很多人堆自動化框架都是懵懵懂懂,就跟談戀愛一樣,朦朧美!
一個好的自動化測試框架是可以讓不那麼懂技術的人也可以寫自動化測試腳本的,
一個好的自動化測試框架可以減少自動化測試中腳本管理和維護當中的人力物力和財力。
其實自動化框架的一個最大的意義在於可重用性。因為在框架里,你可以實現很多的通用功能來簡化整個腳本的開發過程。並且生成美觀的測試報告。
六、非PO模式和PO模式優缺點對比
Python自動化測試全套視頻資料免費領取 |
|
非PO模式 |
PO模式 |
面向過程的線性腳本 |
POM把頁面元素定位和業務操作流程分開。實現鬆耦合。 |
復用性差 |
UI元素的改變不需要修改業務邏輯代碼。只需要找到對應的PO頁修改定位即可,數據代碼分離 |
維護性差 |
PO能使我們的測試代碼提高代碼的可讀性,高復用性,可維護性。 |
七、如何從0到1搭建PO模型
非PO模式舉個栗子:有如下百度搜索腳本:
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
class Test(unittest.TestCase):
def test01(self):
# 打開瀏覽器
driver = webdriver.Chrome()
# 加載百度首頁
driver.get('http://www.baidu.com')
# 在百度搜索欄中輸入軟體測試
driver.find_element(By.ID, 'kw').send_keys('軟體測試')
# 點擊百度一下按鈕
driver.find_element(By.ID, 'su').click()
def test02(self):
# 打開瀏覽器
driver = webdriver.Chrome()
# 加載百度首頁
driver.get('http://www.baidu.com')
# 在百度搜索欄中輸入軟體測試
driver.find_element(By.ID, 'kw').send_keys('硬體測試')
# 點擊百度一下按鈕
driver.find_element(By.ID, 'su').click()
如何把上述栗子改成PO模式呢?
1、基礎層BasePage
from selenium import webdriver
class BasePage:
#構造方法
def __init__(self):
# 打開瀏覽器
self.driver = webdriver.Chrome() # Alt+Enter
# 加載百度首頁
self.driver.get('http://www.baidu.com')
#封裝定位元素
def find_ele(self,*args):
ele = self.driver.find_element(*args)
return ele
2、PO層:封裝百度頁面元素定位,元素對象以及頁面操作
from selenium.webdriver.common.by import By
from base.base_page import BasePage
class BaiduPage(BasePage):
#元素定位,
baidu_text_loc = (By.ID, 'kw')
baidu_submit_loc = (By.ID, 'su')
#獲得元素對象,
def get_text_obj(self):
ele = self.find_ele(*BaiduPage.baidu_text_loc)
return ele
def get_submit_obj(self):
ele = self.find_ele(*BaiduPage.baidu_submit_loc)
return ele
#頁面操作
def search(self,search_string):
self.get_text_obj().send_keys(search_string)
self.get_submit_obj().click()
3、測試用例層:業務邏輯和數據驅動
from ddt import ddt, data
from po.baidu_page import BaiduPage
@ddt
class BaiduTest(unittest.TestCase):
@data('軟體測試','硬體測試')
def test01(self,seaString):
BaiduPage().search(seaString)
time.sleep(5)
if __name__ == '__main__':
unittest.main()
從上面的PO案例:讓我們更加了解清晰PO的優點在於:
1.POM把頁面元素定位和業務操作流程分開。實現鬆耦合。
2.UI元素的改變不需要修改業務邏輯代碼。只需要找到對應的PO頁修改定位即可,數據代碼分離
3.PO能使我們的測試代碼提高代碼的可讀性,高復用性,可維護性。
五、自動化測試框架和PO的關係
自動化框架=po+各種封裝(日誌處理封裝,全局配置文件的封裝,資料庫連接的封裝,excel操作封裝,數據驅動封裝等)
其實想要勝任UI自動化測試崗位還需要掌握以下內容:
1.python或java
2.selenium的API
3.unittest/pytest單元測試框架
4.htmltestrunner/allure測試報告
5.數據驅動dtt(excel,yaml,mysql)或pytest中的fixtrue
6.關鍵字驅動:公共類,方法封裝,隨機數,資料庫連接,全局登錄
7.全局配置文件處理
8.日誌處理
9.斷言
10.第三方庫
11.git和github或碼雲集成開發!
12.jenkins持續集成