Playwright學(xué)習(xí)二

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 代碼:

Pytest + Playwright

如果不能運行振湾,可以檢查下編譯器是否設(shè)置成使用 Pytest 的方式運行,Settings - Tools - Python Integrated Tools里亡脸,設(shè)置成 Pytest:

編譯器使用 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 pytest

class 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文件杏死,可以使用任何瀏覽器打開報告:

選擇瀏覽器打開Allure報告

綜上,將pytest 和 Allure 結(jié)合使用捆交,通過在 pytest 測試用例中添加 Allure 的注解和標(biāo)記淑翼,可以生成符合 Allure 格式的測試報告。這樣就可以利用 pytest 運行測試品追,并通過 Allure 生成美觀的測試報告玄括,方便測試結(jié)果的查看和分析。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肉瓦,一起剝皮案震驚了整個濱河市遭京,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泞莉,老刑警劉巖哪雕,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異戒财,居然都是意外死亡热监,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門饮寞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孝扛,“玉大人列吼,你說我怎么就攤上這事】嗍迹” “怎么了寞钥?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陌选。 經(jīng)常有香客問我理郑,道長,這世上最難降的妖魔是什么咨油? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任您炉,我火速辦了婚禮,結(jié)果婚禮上役电,老公的妹妹穿的比我還像新娘赚爵。我一直安慰自己,他們只是感情好法瑟,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布冀膝。 她就那樣靜靜地躺著,像睡著了一般霎挟。 火紅的嫁衣襯著肌膚如雪窝剖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天酥夭,我揣著相機與錄音赐纱,去河邊找鬼。 笑死采郎,一個胖子當(dāng)著我的面吹牛千所,可吹牛的內(nèi)容都是我干的狂魔。 我是一名探鬼主播蒜埋,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼最楷!你這毒婦竟也來了整份?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤籽孙,失蹤者是張志新(化名)和其女友劉穎烈评,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犯建,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡讲冠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了适瓦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竿开。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡谱仪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出否彩,到底是詐尸還是另有隱情疯攒,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布列荔,位于F島的核電站敬尺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贴浙。R本人自食惡果不足惜砂吞,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崎溃。 院中可真熱鬧呜舒,春花似錦、人聲如沸笨奠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽般婆。三九已至到腥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔚袍,已是汗流浹背乡范。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啤咽,地道東北人晋辆。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像宇整,于是被迫代替她去往敵國和親瓶佳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容