導讀
易用性、可維護性是衡量一款自動化工具/架構是否好用的主要标準,那麼針對大多數人着手測試自動化時最先接觸到的、基于selenium的UI自動化架構,怎樣才能做到這幾點呢?下面将結合我們團隊在實際項目上的應用和不斷打磨沉澱出來的架構做個簡要介紹。
整體介紹
架構結構圖
如上圖,架構本身是基于Selenium,結合POM設計模式和分層思想,并配套日志、配置等常用子產品的封裝;用例部分基于Pytest單元測試架構,結合yml用例組織實作資料驅動;報告部分基于allure插件。
各部分主要功能:
POM設計模式
将核心代碼分為了四層:元素定位層、頁面對象層、測試資料層、測試用例層。其中頁面對象層中封裝的每個頁面類都會繼承BasePage,BasePage中封裝了頁面元素的常用操作,比如:等待元素、查找元素、點選元素、擷取元素的文本值、滑鼠操作、切換視窗等。
測試用例類
使用pytest,批量執行用例,使用插件allure來生成測試報告、收集日志和報錯截圖。
Configs
是一個配置檔案夾,主要為了區分不同運作環境、存儲測試賬号及其它全局變量。
Utils
是一個存放常用工具類的檔案夾,封裝了一些常用方法,比如:配置檔案的讀取、接口請求、yml檔案解析、檔案上傳、日志收集等。
具體實作
配置檔案
使用配置檔案的好處?
将所有的代碼和配置都變成子產品化可配置化,可以提高代碼的複用性;這樣有資料或代碼變動時,不用每次都去修改代碼内部。
解決業務場景中的實際問題,比如:我們想實作一套自動化代碼在多套測試環境中運作,可以在配置檔案中設定全局開關,控制腳本的運作環境;不同配置檔案可以管理不同的測試賬号、資料庫位址等。
全局開關配置檔案global.cfg:
yml檔案管理用例資料
運作自動化測試用例是關鍵,存放測試用例的方式有很多,比如Excel表格、xml檔案、json檔案、py檔案等。我們這裡用yml檔案來管理用例資料,優點是通過key-value方式維護,可讀性強,減少後續維護成本。架構中主要涉及如下yml相關處理方法:
在編寫yml用例檔案時,建議一個檔案存放一個業務場景的case,正常場景和異常場景分開維護。比如:登入和注冊場景,登入的業務場景會有兩個yml檔案,一個yml檔案維護正常場景,一個yml檔案維護異常場景;注冊場景也同樣處理。
PO設計模式
PO是PageObject的縮寫,PO模式是自動化測試項目開發實踐的最佳設計模式之一。核心思想是通過對界面元素的封裝,減少代碼備援;同時在後期維護中,若元素定位發生變化,則隻需要調整頁面元素封裝的代碼即可。這樣可提高測試用例的可維護性和可讀性。
按照PO設計模式和分層思想,将代碼分為四層:
元素定位層:封裝頁面的元素,注意:不必把頁面全部元素封裝,封裝業務場景使用的即可。
以登入頁面為例:
頁面對象層:封裝頁面的業務邏輯,比如:登入頁面封裝登入功能,注冊功能等。
測試資料層:準備場景的測試資料,yml檔案格式存儲。以簡單的登入場景為例,用例編寫如下:
login_success.yml:
login_fail.yml:
測試用例層:跑業務場景,資料驅動,批量執行,斷言。
用例執行
使用pytest來執行測試用例,pytest是一個非常成熟的python單元測試架構,比unittest更靈活,更容易上手。開發web自動化項目,pytest也比unittest更合适。
pytest中自帶的有兩個檔案,一個是pytest.ini,另一個是conftest.py。
pytest.ini是核心配置檔案,放在項目根目錄下,名稱固定,運作時程式自動解析。配置檔案中可以改變pytest一些預設的運作方式,如:用例收集規則,标簽,指令行參數等等。例如:
conftest.py檔案名稱固定,不能修改,可放到項目根目錄下全局調用,也可放在某個package下,僅在該package内有效。實際測試中,conftest.py檔案需要結合fixture來使用,實作用例的前置和後置。例子如下:
pytest通過指令行運作用例,可以通過給用例打标簽的方式,指定用例來運作;可以設定case失敗後重跑次數;可以設定并發數;可以設定報告的生成方式等。例如:
架構實際使用步驟舉例
架構的實際使用,以實際項目上的一個頁面功能舉例如下:
1. 完成元素定位
pages層按照頁面功能劃分,存放頁面元素定位。
項目中每個頁面下封裝{name}_page_locator.py,覆寫業務場景所需頁面元素
2. 封裝頁面對象類
導入對應頁面的元素定位檔案和base_page.py,頁面對象類需要結合BasePage中封裝的方法完成對頁面元素的操作。項目中每個頁面下有{name}_page.py,封裝頁面功能。
3.Pytest組織測試用例(操作頁面對象類)
testcases層存放各子產品下的測試用例,test_xxx.py檔案操作頁面對象,實作正向和反向業務場景的測試,加上斷言,判斷用例執行結果。
4. Yml組織用例資料
data層存放用例資料,用例編寫格式為yml。正向用例和反向用例分開維護。
5. 用例執行
根目錄下的run.py定義了執行用例的方法,可以指定case标簽運作。
總結
按照這樣的方式封裝,架構使用就變得非常的清晰,易用性大大提高。且日常功能變動,也僅需修改相關POM,不影響其它功能,同樣架構應用于其它項目的話,也隻需完成POM相關的修改,可擴充性也還是不錯的。基于Pytest的用例執行,也便于CI的內建;實際運作中,結合Selenium-Grid,就實作了用例的分布式運作,大大提高執行效率(效率對于UI自動化來說,也還是非常重要的)。
此外,對于項目中非常關鍵的Pytest主要特性及與Unittest的差異做個補充:
來源:微信公衆号:360品質效能
出處:https://mp.weixin.qq.com/s/lylr0yXDNXqKjLTz5Q-Lzw