使用Playwright進(jìn)行視覺回歸測試詳解
什么是視覺回歸測試?
視覺回歸測試(Visual Regression Testing)是一種軟件測試技術(shù),專注于檢測Web應(yīng)用程序或網(wǎng)站的用戶界面中的視覺變化和差異。
它涉及在不同的開發(fā)階段捕獲網(wǎng)頁的屏幕截圖或圖像,并進(jìn)行比較,用來識(shí)別由代碼更改或更新引起的任何意外的視覺回歸。
為什么視覺回歸測試很重要?
視覺回歸測試之所以重要有幾個(gè)原因:
- 增強(qiáng)用戶體驗(yàn):視覺錯(cuò)誤會(huì)對(duì)用戶體驗(yàn)產(chǎn)生負(fù)面影響,導(dǎo)致用戶滿意度下降。通過檢測和修復(fù)視覺回歸,可以確保流暢一致的用戶界面,從而提高用戶參與度。
- 檢測UI是否一致:在大型應(yīng)用程序中,保持各個(gè)頁面之間的視覺一致性可能具有挑戰(zhàn)性。視覺回歸測試有助于識(shí)別用戶界面 (UI) 不一致的地方,并確保遵守設(shè)計(jì)指南和品牌標(biāo)準(zhǔn)。
- 防止未檢測到的錯(cuò)誤:傳統(tǒng)的功能測試可能無法捕獲所有視覺問題,因此視覺回歸測試對(duì)于識(shí)別可能導(dǎo)致未注意到的錯(cuò)誤或設(shè)計(jì)缺陷的細(xì)微視覺變化至關(guān)重要。
- 支持持續(xù)集成 (CI/CD):將視覺回歸測試集成到 CI/CD 中,可以在每次代碼更改時(shí)進(jìn)行自動(dòng)測試,從而可以及早檢測到視覺回歸并防止它們進(jìn)入生產(chǎn)環(huán)境。
- 最大限度地減少時(shí)間和精力:手動(dòng)視覺測試可能非常耗時(shí)且容易出錯(cuò),自動(dòng)化視覺回歸測試減少了手動(dòng)工作量并增加了測試覆蓋率,從而提高了測試效率。
一般來說,視覺回歸測試是如何工作的?
視覺回歸測試流程
- 場景內(nèi),第一次執(zhí)行腳本時(shí),會(huì)截取某個(gè)組件或者整個(gè)頁面的截圖,并保存下來供以后對(duì)比;
- 在下一次執(zhí)行中,將拍攝另一張屏幕截圖,并與之前存在的屏幕截圖進(jìn)行進(jìn)一步比較;
- 如果發(fā)現(xiàn)差異,執(zhí)行將失敗,輸出將是上面顯示的差異圖像;
- 分析差異后,你可以選擇將其假設(shè)為錯(cuò)誤并進(jìn)行相應(yīng)處理,或者將其假設(shè)為預(yù)期和有意的更改,并且可以選擇覆蓋預(yù)先存在的屏幕截圖,以便可能在下次執(zhí)行時(shí)有更新的版本。
實(shí)施這些測試的現(xiàn)有工具是什么?
就市場上的工具而言,可以分為付費(fèi)和免費(fèi)兩類:
- 在付費(fèi)工具中,可以突出顯示Percy、Chromatic 和 Happo等示例。
- 另一方面,免費(fèi)工具有Playwright、Cypress插件、Wraith和 BackstopJS等。
在本文中,我將更詳細(xì)地介紹如何使用Playwright運(yùn)行這些測試。
什么是Playwright?
Playwright是Microsoft開發(fā)的開源自動(dòng)化庫,專為測試和自動(dòng)化 Web 應(yīng)用程序而設(shè)計(jì),特別針對(duì)現(xiàn)代 Web 瀏覽器。
Playwright 提供了功能強(qiáng)大且用戶友好的 API,允許開發(fā)人員和測試人員與網(wǎng)頁交互、模擬用戶操作并驗(yàn)證應(yīng)用程序的行為。
專門針對(duì)視覺測試,Playwright 提供了一個(gè)內(nèi)置功能來執(zhí)行這些測試,使用像素匹配庫作為比較引擎。
此外,Playwright 允許在不同的屏幕尺寸和不同的瀏覽器中執(zhí)行這些測試,能夠覆蓋每個(gè)場景。這個(gè)是在playwright.config(https://playwright.dev/docs/test-configuration)文件中配置的。
像素匹配如何工作?
這個(gè)庫負(fù)責(zé)分析和比較測試期間捕獲的屏幕截圖與基線圖像,用來檢測任何視覺差異或回歸。
它計(jì)算圖像之間的像素級(jí)差異并生成突出顯示變化的差異圖像。
來源:pixelmatch github
此外還有其他庫,例如 Resemble.js(在 BackstopJS 中使用)和 Blink-diff,但不同的是,pixelmatch大約有150行代碼,沒有依賴性,并且適用于圖像數(shù)據(jù)的原始類型數(shù)組,因此它快速且可靠可以在任何環(huán)境下使用。
如何實(shí)施簡單的Playwright視覺測試?
當(dāng)團(tuán)隊(duì)已將Playwright用于其他測試級(jí)別時(shí),在這些測試中使用Playwright非常有用。
但如果這是你第一次使用它,應(yīng)該按照他們的文檔使用TypeScript安裝 Playwright(https://playwright.dev/docs/intro)。
另外,請(qǐng)確保安裝了NodeJS和 IDE,例如Visual Studio Code。
如果使用的是yarn,為了安裝Playwright,請(qǐng)考慮運(yùn)行:
yarn create playwright
之后,創(chuàng)建一個(gè)名為example.spec.ts的 .spec 文件,例如:
import { test, expect } from '@playwright/test'; test('example test', async ({ page }) => { await page.goto('https://playwright.dev'); await expect(page).toHaveScreenshot(); });
為了執(zhí)行該腳本,請(qǐng)運(yùn)行:
npx playwright test
當(dāng)你第一次運(yùn)行此腳本時(shí),將遇到測試運(yùn)行程序的以下輸出:
Error: A snapshot doesn't exist at example.spec.ts-snapshots/example-test-1-chromium-darwin.png, writing actual.
發(fā)生這種情況的原因是,它獲取該頁面的屏幕截圖,然后當(dāng)它嘗試與基本屏幕截圖進(jìn)行比較時(shí),它在本地沒有找到具有該名稱的屏幕截圖。
因此,它保存了屏幕截圖,以便在接下來的測試執(zhí)行中進(jìn)行比較。
將來,如果再次運(yùn)行測試但失敗,則意味著兩個(gè)屏幕截圖之間存在視覺差異,你必須評(píng)估這是否是由于代碼中的錯(cuò)誤或有意更改造成的。
如果這是有意更改,運(yùn)行帶有標(biāo)志— update-snapshots 的執(zhí)行命令:
npx playwright test --update-snapshots
屏幕截圖命名法如何運(yùn)作?
- 使用 .spec 文件的名稱創(chuàng)建文件夾(如果尚不存在);
- 使用名稱保存屏幕截圖,在本例中為 example-test-1 (自動(dòng)生成的快照名稱和測試名稱 - 你可以更改為自定義名稱,將其作為 toHaveScreenshot() 方法的參數(shù)傳遞);
- 除了example-test-1 之外,它還添加了瀏覽器名稱和平臺(tái),在本示例中分別是chromium和darwin(瀏覽器名稱和平臺(tái)無法自定義)。
請(qǐng)記住,必須具有與CI(持續(xù)集成)系統(tǒng)相同的操作系統(tǒng) (OS),否則需要在 Docker 上運(yùn)行這些測試,這是因?yàn)椴僮飨到y(tǒng)和CI中使用的屏幕可能有所不同。
如何定制視覺比較?
在我之前提供的示例中,腳本包括對(duì)整個(gè)頁面進(jìn)行屏幕截圖并將其與已存在的屏幕截圖進(jìn)行比較。
但這只是一個(gè)示例,你也可能只想測試頁面的特定元素。為此,應(yīng)該使用Playwright定位器。
此外,還可以設(shè)置各種可以修改由 Pixelmatch 提供的toHaveScreenshot()行為的選項(xiàng):
- maxDiffPixels:可接受的不同于像素總數(shù)的比例,介于0和1之間(默認(rèn)未設(shè)置);
- 閾值(threshold):比較圖像中相同像素之間YIQ 顏色空間中可接受的感知顏色差異,介于0(嚴(yán)格)和1(寬松)之間。默認(rèn)為0.2 ;
- maxDiffPixelRatio:可接受的像素?cái)?shù)量,可能不同(默認(rèn)情況下未設(shè)置)。
以maxDiffPixels選項(xiàng)為例,語法為:
await expect(page).toHaveScreenshot({ maxDiffPixels: 100 });
如果只想測試特定的UI元素,請(qǐng)?jiān)俅螌xpect()方法內(nèi)的頁面參數(shù)更改為特定的元素定位器。
此外,如果想檢查元素內(nèi)容是否具有參考文本或任意二進(jìn)制數(shù)據(jù),Playwright 測試會(huì)自動(dòng)檢測內(nèi)容類型并使用適當(dāng)?shù)谋容^算法:
expect(await page.textContent('.hero__title')).toMatchSnapshot('heroText.txt');
在此示例中,我們檢查包含類名hero__title的元素的文本內(nèi)容是否與heroText.txt文件中存在的文本內(nèi)容相同。這些快照存儲(chǔ)在測試文件旁邊的單獨(dú)目錄中。
怎么樣報(bào)告可視化?
關(guān)于報(bào)告,Playwright 配備了一些內(nèi)置報(bào)告器以滿足不同的需求,能夠提供自定義報(bào)告器,也可以使用第三方報(bào)告器。
以Allure為例,如果執(zhí)行這些測試并使用 Allure 作為報(bào)告器,將能夠使用選項(xiàng)Show diff或Show Overlay看到有關(guān)失敗測試的屏幕差異,并快速了解問題。
視覺回歸測試有局限性嗎?
這些測試確實(shí)有局限性。由于他們只檢查UI外觀,因此需要進(jìn)行其他測試,例如功能、安全、性能、可訪問性和可用性測試,以確保產(chǎn)品的質(zhì)量有保證。
結(jié)論
視覺回歸測試成為Web 應(yīng)用程序綜合測試策略的關(guān)鍵組成部分,雖然功能測試涵蓋了底層功能的正確性,但視覺回歸測試側(cè)重于用戶界面,確保一致且具有視覺吸引力的用戶體驗(yàn)。
通過捕獲和比較不同開發(fā)階段的屏幕截圖,視覺回歸測試有助于檢測傳統(tǒng)測試方法可能忽略的細(xì)微視覺變化和回歸。此類測試在保障用戶滿意度、檢測 UI 不一致以及防止未檢測到的視覺錯(cuò)誤進(jìn)入生產(chǎn)方面發(fā)揮著至關(guān)重要的作用。
為了實(shí)現(xiàn)有效的視覺回歸測試,Playwright 被證明是一個(gè)強(qiáng)大且多功能的自動(dòng)化庫。憑借對(duì)多種 Web 瀏覽器、無頭和非無頭模式以及跨平臺(tái)兼容性的支持,Playwright使開發(fā)人員和測試人員能夠跨不同環(huán)境無縫地自動(dòng)化視覺測試。通過使用像素匹配庫,它可以提供精確的結(jié)果,使其成為分析最小視覺差異的理想選擇。
通過將 Playwright 納入測試工作流程并利用其可視化測試功能,團(tuán)隊(duì)可以有效地維護(hù)視覺上一致且可靠的用戶界面,從而提高整體應(yīng)用程序質(zhì)量并提高用戶滿意度。
到此這篇關(guān)于使用Playwright進(jìn)行視覺回歸測試詳解的文章就介紹到這了,更多相關(guān)Playwright視覺回歸測試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用Playwright模擬API的項(xiàng)目實(shí)踐
- Python自動(dòng)化神器Playwright的用法詳解
- Python寫UI自動(dòng)化之playwright(點(diǎn)擊操作)詳解
- Python?Playwright進(jìn)行常見的頁面交互操作
- 深入理解Playwright的高級(jí)功能和用法
- Python中playwright啟動(dòng)瀏覽器與常見運(yùn)行方式詳解
- Python中Playwright模塊進(jìn)行自動(dòng)化測試的實(shí)現(xiàn)
- 使用Python中的Playwright制作測試視頻的實(shí)現(xiàn)步驟
- python+playwright 元素操作示例代碼
- python playwright--pytest-playwright、pytest-base-url插件編寫用例
- Playwright 跟蹤查看器的高級(jí)用法
相關(guān)文章
python中的class_static的@classmethod的巧妙用法
python中的class_static的@classmethod的使用 classmethod的使用,主要針對(duì)的是類而不是對(duì)象,在定義類的時(shí)候往往會(huì)定義一些靜態(tài)的私有屬性,今天通過示例代碼看下classmethod的妙用2021-06-06Python Django使用forms來實(shí)現(xiàn)評(píng)論功能
這篇文章主要為大家詳細(xì)介紹了Python Django使用forms來實(shí)現(xiàn)評(píng)論功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08python使用遞歸實(shí)現(xiàn)斐波那契數(shù)列的示例詳解
這篇文章主要給大家介紹了python使用遞歸實(shí)現(xiàn)斐波那契數(shù)列的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起來學(xué)習(xí)吧2024-01-01Python使用Mechanize模塊編寫爬蟲的要點(diǎn)解析
這篇文章主要介紹了Python使用Mechanize模塊編寫爬蟲的要點(diǎn)解析,作者還講解了Mechanize程序占用內(nèi)存過高問題的相關(guān)解決方法,需要的朋友可以參考下2016-03-03