用Selnium和Python構建自動化Web測試框架
譯文【51CTO.com快譯】如今,在不犧牲產品質量的情況下,頻繁地部署大型軟件的新版本,已經成為了主流趨勢。通常,在每次引入新的功能、觸發新的部署時,各種針對缺陷的修復都需要進行深入的、端到端的測試,以確保部署的成功率。雖然對于小型產品或項目而言,我們可以通過手動測試來保證覆蓋率;但是對于那些功能數量龐大的產品或應用來說,我們肯定需要通過自動化測試,在最短的時間內提供最大的測試覆蓋率。此時,我們往往需要通過將Selenium與某種編程語言結合使用,來實現該目的。在本文中,我將和您探討如何使用Selenium與Python,來構建自動化的Web測試框架。
Selenium WebDriver架構速覽
通常,Selenium Web自動化測試框架可結合使用諸如:Java、Python、JavaScript、Ruby、C#等不同的編程語言。其中,根據GitHub的一項調查(https://pypl.github.io/PYPL.html)顯示,Python是開發人員最常用的編程語言。它具有流暢的學習曲線、簡單的語法、以及簡潔的代碼。因此,Selenium可以輕松地與Python相集成,以自動化Web測試的過程。
而作為一種Web框架,Selenium WebDriver能夠在各種受支持的瀏覽器(如:Chrome、Firefox、Safari等)上,自動化各種基于Web的應用程序。因此,Selenium自動化測試框架能夠讓用戶自定義與Web應用的逐步交互,并通過添加斷言,來發現各種錯誤。
Selenium WebDriver并非一個獨立的測試工具,它通過各種組件來滿足Web自動化測試的需要。簡單而言,Selenium WebDriver的后端組件包括:
- Selenium WebDriver客戶端庫/語言綁定:如上所述,由于Selenium可以與任何語言集成,因此其下載頁面提供了Selenium客戶端與WebDriver語言的綁定。用戶可以在任何首選語言中創建能與Selenium服務器交互的語言腳本。
- JSON Wire協議:作為Selenium的核心,JSON Wire協議通過提供能與REST API進行數據傳輸的媒介,以促進客戶端代碼和瀏覽器之間的通信。也就是說,它能夠在瀏覽器的二進制文件和客戶端庫之間建立連接。
- 瀏覽器驅動程序:每個瀏覽器都會通過本瀏覽器的驅動程序,來實現數據傳輸。這些驅動可以從已編寫的、基于Selenium的腳本處接收命令,在相應的瀏覽器上執行之,并以HTTP響應的形式返回結果。當然,這些都需要在JSON Wire協議的幫助下方可實現。
- 瀏覽器:確保每個自動化測試都能夠被安裝在本地或遠程機器上,并能夠在其支持的瀏覽器中(如:Firefox、Chrome、Microsoft Edge、Safari等)被執行。
四大Python自動化測試框架
隨著需求的增加,目前市場上出現了各種受歡迎程度不同的Python自動化測試框架。這些框架在管理腳本的執行順序、存儲結果、呈現日志、以及添加斷言等方面,都發揮著各自的作用。下面,我們將重點討論四個比較流行的自動化測試框架:
Robot Framework
作為一個開源的自動化測試框架,Robot Framework主要被用于機器人過程自動化(robotic process automation,RPA)和驗收測試驅動開發(acceptance test-driven development,ATDD)等方面。它支持Python 2.7.14及其更高版本。
優點:
- 它適用于所有類型的應用程序,包括:Web應用程序、移動應用程序、以及桌面應用程序等。
- 通過采用關鍵字驅動方法 (Keyword Driven Approach,KDA),它允許開發者在無需編程經驗的情況下,以人類可讀的關鍵字創建測試用例。
- 它支持源自RF v4.0的原生IF/ELSE語法。
- 它提供了專門的社區支持和多種資源。
缺點:
- 報告的定制過程較為復雜。
- 雖然該框架的并行測試范圍比較有限,但是可以通過Pabot(一種機器人框架的并行執行器,https://pabot.org/)來實現。
Pytest
作為最常用的Python自動化測試框架之一,Pytest主要被用于單元、功能、以及API等方面的測試。它支持Python 3.5及其更高版本。
優點:
- 通過提供fixtures,來覆蓋所有的參數組合,而無需重新編寫代碼。
- 支持包括:pytest-randomly、pytest-cov、pytest-django、以及pytest-bdd在內的多種插件。
- 支持pytest html插件。開發人員只需一個命令,即可針對自動化測試套件生成html類型的報告。
- 支持使用pytest-xdist插件并行執行各種測試用例。
缺點:
- 由于pytest擁有一個單獨編寫測試用例的例程,因此它與其他測試框架的兼容性較差。
PyUnit
作為由Python附帶的默認測試框架,PyUnit受到了許多開發人員的青睞。同時,作為一個單元測試的框架,它主要借鑒了流行的Java測試框架--JUnit。
優點:
- 由于屬于默認的Python包,因此PyUnit無需額外的安裝與設置。
- 能夠快速地生成XML和unittest-sml-reporting兩種測試報告。
缺點:
- 有時會涉及到大量的樣板代碼(boilerplate code)。
- 由于它是基于JUnit的,因此使用了camelCase命名方式,而非Python snake_case的命名約定。
Behave
作為最流行的Python行為驅動開發(behavior-driven development,BDD)自動化測試框架之一,Behave在功能上與Cucumber框架非常相似。
優點:
- 它既可以完全支持Gherkin語言,又能夠以可讀性的語言去編寫測試用例,以便于非技術團隊的參與。
- 它具有針對Django和Flask的集成。
缺點:
- 它僅適用于黑盒測試。
- 它不支持并行測試。
使用Selenium和Pytest框架來設置Python
有了前面Selenium WebDriver架構和四大Python測試框架的基礎,下面讓我們開始在Windows上安裝,并運行基于Selenium的自動化測試。
第 1 步: 下載并安裝適用于Windows的Python。當然,如果您的計算機上已安裝了Python,則完全可以跳過此步。
第 2 步: 為了在Python中安裝和管理代碼包,您必須使用Python在本地主機上提前安裝PIP(可以從Python官網處,下載包管理系統)。在完成下載后,您可以使用如下命令進行安裝:
- python get-pip.py
并使用如下命令,來確認PIP是否已被正確安裝:
- pip –version
第 3 步: 為了構建自動化測試套件,我們需要通過執行如下命令,來安裝Pytest庫Pytest:
- pip install -U pytest
并使用如下命令,來確認Pytest是否已被正確安裝:
- pytest –version
第 4 步: 使用PIP的如下命令,來安裝Selenium框架:
- pip install -U selenium
并使用如下命令,來確認被安裝的selenium的版本:
- python -c “import selenium; print(selenium.__version__)”
第 5 步: 為了保持瀏覽器的獨立性,我們無需專門下載針對某種瀏覽器的驅動程序。相反,我們會使用如下命令來安裝開源庫:WebDriver-Manager,以自動管理不同的瀏覽器驅動:
- pip install webdriver-manager
并使用如下命令,來確認Selenium和Webdriver-manager是否已被正確安裝:
- pip list
至此,我們已經滿足了使用Python去運行基于Selenium的自動化測試的先決條件。下面,讓我們通過編寫腳本,快速地創建如下簡單的測試場景:
1. 直接訪問pCloudy主頁
2. 點擊登錄
3. 獲取頁面標題
4. 斷言登錄頁面的標題
在此,我們使用pytest框架的selenium-python腳本:
- import pytest
- from selenium
- import webdriver
- from webdriver_manager.chrome
- import ChromeDriverManager
- import sys
- from selenium.webdriver.chrome.options
- import Options
- from selenium.webdriver.common.keys
- import Keys
- from time
- import sleep
- def pcloudy_sample_test(): driver = webdriver.Chrome(ChromeDriverManager().install())
- driver.get('https://www.pcloudy.com/') driver.maximize_window()
- driver.find_element(By.XPATH, '//*[text()="Login"]').click() sleep(2)
- title = "" Remote Mobile Web & Application Testing on Real Android Devices - pCloudy ""
- assert title == driver.title
- driver.close()
正如上述代碼所示,我們最初導入了那些自動化測試所需的代碼庫。為了創建函數,我們首先使用WebDriverManager來調用Chrome瀏覽器。WebDriverManager會去檢查最新版本的WebDriver的二進制文件,如果不在目標系統上,則需額外下載。接著,我們會導出Selenium所需的WebDriver環境變量。在啟動瀏覽器后,我們將pCloudy主頁的URL傳遞給瀏覽器,并將瀏覽器最大化,以獲得更好的分辨率。
在使用XPATH定位器加載了pCloudy主頁之后,我們會通過登錄按鈕,定向到登錄頁面上。最后,我們使用主頁的預期檢索標題,去斷言實際的標題。如果斷言通過,那么測試用例會被標記為已通過,否則會被標記為失敗。最終,在執行完畢時,程序會關閉正在運行的會話。
在pCloudy Browser Cloud上運行Pytest框架的跨瀏覽器測試
作為一種可持續測試的云服務,pCloudy提供了跨瀏覽器測試(無論是Windows平臺還是Mac平臺)的功能。其中,Browser Cloud平臺允許用戶訪問那些被托管在云端的遠程主機,并且能夠在Selenium自動化框架中,使用RemoteWebDriver。因此,我們可以在云端,模擬不同的環境(例如:不同的瀏覽器、某個瀏覽器的多個版本、以及不同操作系統),并開展各種自動化測試。
同時,Browser Cloud自動化測試平臺,可以在各種云托管的主機上,對Web應用程序開展手動測試。如果您的自動化測試在某個特定環境中出現了失敗,那么您只需從UI中選擇相同的環境,就可以在pCloudy的相同環境中,手動運行該測試。
下面是基于Pytest框架的Selenium腳本。它將在pCloudy的Browser Cloud上執行跨瀏覽器的測試:
- import pytest
- from os
- import environ
- from selenium
- import webdriver
- from selenium.common.exceptions
- import WebDriverException
- from selenium.webdriver.remote.remote_connection
- import RemoteConnection
- @pytest.fixture(scope = 'function')
- def driver():
- desired_caps = {}
- browser = { "pCloudy_Username": "ramit.dhamija@gmail.com", "apiKey": "5TfF4UcNRbN3JhucQ", "clientName": "ramit.dhamija@gmail.com", "email": "ramit.dhamija@gmail.com", "os": "Mac", "osVersion": "Catalina", "browserName": "safari", "browserVersions": "14", "pCloudy_EnableVideo": "true", "pCloudy_EnablePerformanceData": "true", "pCloudy_EnableDeviceLogs": "true"
- }
- desired_caps.update(browser)
- selenium_endpoint = "https://prod-browsercloud-in.pcloudy.com/seleniumcloud/wd/hub"
- executor = RemoteConnection(selenium_endpoint, resolve_ip = False) browser = webdriver.Remote( command_executor = executor, desired_capabilities = desired_caps )
- yield browser
sample_login_test.py的代碼內容為:
- import pytest
- import sys
- @pytest.mark.usefixtures('driver')
- class TestLink: def test_title(self, driver): ""
- " Verify click and title of login page: return :None "" "
- driver.get('https://www.pcloudy.com/') driver.maximize_window()
- driver.find_element(By.XPATH, '//*[text()="Login"]').click() sleep(2)
- title = ""
- Remote Mobile Web & Application Testing on Real Android Devices - pCloudy ""
- assert title == driver.title driver.quit()
您可以執行如下pytest測試腳本的命令:
- pytest -n=2 tests\sample_login_test.py
其中,-n用于指定并行測試執行的次數。
正如上述代碼所示,在我們的第一個腳本中,我們用到了pytest的fixtures。它們會在每個對應的測試函數之前,事先被運行。在fixtures中定義的范圍——'function'是fixture的默認值,它表示fixture將在每個測試會話中執行一次。
為了能夠在pCloudy瀏覽器的云中運行測試,我們定義了“用戶名+API密鑰”方式的pCloudy身份驗證等函數。此外,在必需的功能中,我們定義了各種運行所需的環境,其中包括Mac操作系統的Catalina版本和Safari-14瀏覽器。
當然,在pCloudy中,被用來捕獲測試視頻記錄、性能數據、以及日志的內置功能,其實并不多。為了能夠在pCloudy Selenium網格上運行測試,我們將Selenium網格的URL定義為selenium_endpoint。被連接的節點主機將會根據所用到的測試環境,進行自動分配。此外,在第一個腳本的末尾,我們會生成一個瀏覽器,用于存儲和更新自動化測試所需的各項功能。
而在下一個腳本中,我們用到了與之前在pCloudy登錄頁面處斷言標題是否相同的Selenium腳本。該自動化測試會在pCloudy Browser Cloud中模擬Mac-Catalina、Safari-14等環境運行。
pCloudy的輸出:
- 若要查看測試的當前運行狀態,請重定向到pCloudy設備頁面,依次點擊“報告”->“我的活動會話”。
- 若要查看目前已執行的所有測試,請直接跳轉到pCloudy設備頁面,依次單擊“報告”->“所有報告”。
- 若要查看特定測試的日志和快照,請直接跳轉到pCloudy設備頁面,依次單擊“報告”->“所有報告”,并對需要日志和截屏的特定會話名稱執行相關的操作。
原文標題:Setting up Modern Web Test Automation Framework with Selenium and Python,作者:Ramit Dhamija
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】