Pytest + Playwright
通過之前的學(xué)習(xí)發(fā)現(xiàn),Playwright 可以幫助生成 Pytest 代碼馍刮。Pytest 目前是 Python 中最流行的測試框架之一信夫,具有簡潔易讀的語法和豐富的插件生態(tài)系統(tǒng),通過組織和運行測試用例進行單元測試卡啰。結(jié)合 Playwright静稻,可以利用 Pytest 的強大功能和易用性編寫自動化測試腳本。
生成對應(yīng)的 Pytest 代碼后匈辱,需要安裝 pytest-playwright 插件:
pip install?pytest-playwright
就可用測試用例的形式運行相應(yīng)的 Pytest 代碼:
如果不能運行振湾,可以檢查下編譯器是否設(shè)置成使用 Pytest 的方式運行,Settings - Tools - Python Integrated Tools里亡脸,設(shè)置成 Pytest:
Playwright + Pytest 的優(yōu)點有很多押搪,包括:
跨平臺性:Playwright 支持多種瀏覽器和操作系統(tǒng),可以輕松地進行跨瀏覽器和跨平臺的測試浅碾。Pytest 也是跨平臺的測試框架大州,因此結(jié)合 Pytest 和 Playwright 可以實現(xiàn)跨平臺的自動化測試。
強大的斷言和報告功能:Pytest 提供了豐富的斷言函數(shù)和靈活的報告功能垂谢,可以輕松地編寫詳細(xì)的測試斷言厦画,并生成易于閱讀的測試報告。結(jié)合 Playwright滥朱,可以對頁面元素進行準(zhǔn)確的斷言根暑,確保頁面的功能和性能符合預(yù)期。
并行測試:Pytest 支持并行測試執(zhí)行徙邻,可以加速測試過程购裙,提高測試效率。結(jié)合 Playwright鹃栽,可以在多個瀏覽器實例中并行執(zhí)行測試用例躏率,進一步提高測試的效率。
靈活性和可擴展性:Pytest 提供了豐富的插件系統(tǒng)和定制選項民鼓,可以根據(jù)項目的需求定制測試流程和報告格式薇芝。結(jié)合 Playwright,可以定制各種測試環(huán)境和配置選項丰嘉,滿足不同項目的需求夯到。
總的來說,結(jié)合 Pytest 和 Playwright 可以實現(xiàn)靈活饮亏、高效和可靠的自動化測試耍贾,幫助開發(fā)團隊快速迭代和交付高質(zhì)量的軟件產(chǎn)品阅爽。
Page Object Model(頁面對象模型)
一個完整的測試項目,需要搭建相應(yīng)的自動化測試框架荐开,框架應(yīng)便于維護和更新付翁。考慮使用Page Object Model(頁面對象模型)晃听,POM是一種在自動化測試中廣泛使用的設(shè)計模式百侧,將頁面或應(yīng)用程序的各個頁面抽象為對象,以便于測試用例的編寫和維護能扒。
POM把元素定位和元素操作分離佣渴,每個頁面都被抽象為一個對象,該對象封裝了該頁面的所有元素和操作初斑。這樣一來辛润,測試用例不再直接與頁面元素交互,而是通過調(diào)用頁面對象的方法來執(zhí)行操作见秤。這種分層的設(shè)計使得測試用例更加清晰砂竖、可維護,并提高了測試代碼的重用性秦叛。
首先根據(jù)自己的測試用例晦溪,可以使用selector定位到頁面上的元素瀑粥。簡單以登錄頁面為例挣跋,將登錄頁面分為page部分放置此頁面對象,并且補齊調(diào)用此類元素的方法狞换,我們將這些元素提取到我們的login_page.py頁面中:
class LoginPage:
def __init__(self, page: Page):
????self.page = page self.usernameInput = page.get_by_placeholder("請輸入用戶名/手機登錄")
????self.passwordInput = page.get_by_placeholder("請輸入登錄密碼")
? ? self.rememberNameCheckbox = page.get_by_text("記住用戶名")
? ? self.loginBtn = page.get_by_role("button", name="登錄")
? ? self.usernameTip = page.locator("div").filter(has_text="系統(tǒng)提示 請輸入要登錄的用戶名").nth(3)
? ? self.passwordTip = page.locator("div").filter(has_text="系統(tǒng)提示 請輸入密碼").nth(3)
? ? self.wrongTip = page.locator("div").filter(has_text="系統(tǒng)提示 登錄失敗避咆,請檢查您輸入的賬號和密碼").nth(3)def navigate(self):
????self.page.goto("https://某登錄頁面")def fill_username(self, username):
????self.usernameInput.fill(username)def fill_password(self, password):
????self.passwordInput.fill(password)def click_remember_user(self):
????self.rememberNameCheckbox.click()def click_login_btn(self):
????self.loginBtn.click()
再通過測試用例中的測試登錄用例來調(diào)取此頁面的方法,并補充相應(yīng)測試用例修噪,例如在test_login.py:
from pages.login_page import LoginPage
from playwright.sync_api import expect
import pytestclass TestLogin:
?# 登錄
@pytest.fixture(autouse=True)
def start_for_each(self, page):
print("for each--start:打開登錄頁面")
self.login = LoginPage(page)
self.login.navigate()
yield
print("for each--end:后置操作")def test_login_1(self):
# 用戶名為空查库,點擊注冊
self.login.fill_username('')
self.login.fill_password('123456')
self.login.click_login_btn()
#斷言
expect(self.login.usernameTip).to_be_visible()def test_login_2(self):
# 用戶名大于30字符/用戶密碼錯誤
self.login.fill_username('usernameusernameusernameusernameusernameusername')
self.login.fill_password('123456')
self.login.click_login_btn()
#斷言
expect(self.login.wrongTip).to_be_visible()def test_login_3(self):
# 密碼為空不允許登錄
self.login.fill_username('123')
self.login.fill_password('')
self.login.click_login_btn()
#斷言
expect(self.login.passwordTip).to_be_visible()def test_login_4(self):
# 用戶名及密碼登錄正確
self.login.fill_username('xxx')
self.login.fill_password('xxxx')
self.login.click_login_btn()
#斷言
expect(self.login.page).to_have_title("首頁")
點擊運行,可運行相應(yīng)的測試用例黄琼。
其中樊销,@pytest.fixture(autouse=True):是一個Fixture裝飾器,它告訴Pytest這個Fixture將會在每個測試用例執(zhí)行前自動運行脏款,而不需要顯式地在測試用例中調(diào)用围苫。
print("for each--start:打開登錄頁面"):這是Fixture函數(shù)的開始部分,它會在每個測試用例執(zhí)行前打印一條消息撤师,表示開始執(zhí)行Fixture操作剂府。
yield:在Fixture函數(shù)中,yield關(guān)鍵字之前的代碼部分被稱為Fixture的設(shè)置部分剃盾,在yield之后的部分被稱為Fixture的后置操作腺占。這里的yield允許測試用例在執(zhí)行前和執(zhí)行后執(zhí)行操作淤袜。
print("for each--end:后置操作"):這是Fixture函數(shù)的后置操作部分,它會在每個測試用例執(zhí)行后打印一條消息衰伯,表示結(jié)束執(zhí)行Fixture操作铡羡。
這段代碼的作用是在每個測試用例執(zhí)行前打開登錄頁面,并在測試用例執(zhí)行后進行必要的清理操作嚎研。Fixture函數(shù)的autouse參數(shù)確保它會自動在每個測試用例執(zhí)行前后執(zhí)行蓖墅。
Allure
為了能更好的可視化我們的測試結(jié)果,可以考慮使用Allure報告對測試結(jié)果進行交互式瀏覽和分析临扮,用戶可以輕松地查看和過濾測試結(jié)果论矾,快速定位問題,提高了測試結(jié)果的可讀性和可操作性杆勇。
首先我們可以根據(jù)自己的電腦系統(tǒng)下載對應(yīng)的Allure贪壳,將 allure 的bin目錄添加到Path中:
export PATH="/usr/local/allure/bin:$PATH"
source 配置文件后檢查allure版本是否已經(jīng)被更新:
allure --version
有對應(yīng)版本號顯示說明安裝成功。
接下來安裝allure-pytest庫蚜退,用來生成 allure 的測試結(jié)果:
pip install allure-pytest
Allure生成測試結(jié)果
通過pytest闰靴,可以通過指定--alluredir參數(shù)來指定測試結(jié)果的輸出目錄。例如:
pytest --alluredir=./results
Allure生成測試報告
當(dāng)測試運行完畢后钻注,可以使用 allure 命令行工具來生成報告蚂且,執(zhí)行以下命令:
allure generate ./results -o ./report
查看報告:可以打開生成的 Allure 報告,查看測試結(jié)果和詳細(xì)的測試報告幅恋。選擇index.html文件杏死,可以使用任何瀏覽器打開報告:
綜上,將pytest 和 Allure 結(jié)合使用捆交,通過在 pytest 測試用例中添加 Allure 的注解和標(biāo)記淑翼,可以生成符合 Allure 格式的測試報告。這樣就可以利用 pytest 運行測試品追,并通過 Allure 生成美觀的測試報告玄括,方便測試結(jié)果的查看和分析。