搜尋
首頁web前端css教學與劇作家的自動視覺回歸測試

與劇作家的自動視覺回歸測試

自動化視覺測試提供了一種強大的,儘管有時無法預測的軟件質量保證方法。劇作家簡化了網站的過程,儘管可能需要微調。

最近的系統停機時間激發了我解決一個長期存在的問題:由於不斷增加的功能,我維護的網站的CSS變得笨拙。有了更清楚的了解,現在是內部CSS重構來減少技術債務並利用現代CSS功能的時候了(例如嵌套的選擇器以改善結構)。清潔器代碼庫還將促進急需的黑暗模式,從而通過尊重首選配色方案來增強用戶體驗。

但是,猶豫不決地通過重大更改引入錯誤,我需要一個強大的視覺回歸測試解決方案。傳統的快照測試證明太慢和脆弱。

在這種情況下,快照測試涉及捕獲屏幕截圖,以建立與未來結果進行比較的基線。但是,這些屏幕截圖容易受到各種無法控制的因素(例如,時機問題,變化的硬件資源或動態內容)。在測試運行之間管理狀態(保存屏幕截圖)會增加複雜性,並使僅測試代碼很難完全定義期望。

長時間的拖延後,我終於實施了一個解決方案,最初期望快速解決問題。這不會成為主要測試套件的一部分;只是該重構任務的臨時工具。

幸運的是,我回想起了以前的研究,並很快發現了劇作家的內置視覺比較功能。欣賞劇作家的最小外部依賴關係,我繼續實施。

設置環境

雖然npm init playwright@latest提供了一個很好的起點,但我選擇了手動設置來更好地了解組件。考慮到快照測試的使用很少使用,我創建了一個專用的子目錄, test/visual作為我們的工作目錄。 package.json文件聲明依賴項和輔助腳本:

 {
  “腳本”:{
    “測試”:“劇作家測試”,
    “報告”:“劇作家表演報告”,
    “ Update”:“劇作家測試 -  update-snapshots”,
    “ reset”:“ rm -r ./playwright-report ./test-results ./viz.test.js-snapshots || true”
  },,
  “ devDectiencies”:{
    “@playwright/test”:“^1.49.1”
  }
}

為了避免使用這種很少使用的依賴性使主項目混亂,請考慮在需要時在根目錄中直接在根目錄中運行npm install --no-save @playwright/test

安裝必要的軟件包( npm install然後是npx playwright install )後,我們使用playwright.config.js配置測試環境:

從“@playwright/test”中導入{decteConfig,devices};

令瀏覽器= [“桌面firefox”,“桌面chrome”,“桌面Safari”];
令base_url =“ http:// localhost:8000”;
令server =“ cd ../../dist && python3 -m http.server”;

讓IS_CI = !! process.env.ci;

導出默認decteConfig({
  testdir:“ ./”,
  完全比較:是的,
  禁止:is_ci,
  重試:2,
  工人:is_ci? 1:未定義,
  記者:“ html”,
  WebServer:{
    命令:服務器,
    URL:base_url,
    reuseexisterserver:! is_ci
  },,
  使用: {
    baseurl:base_url,
    痕跡:“首先退休”
  },,
  項目:browsers.map(ua =>({{
    名稱:ua.tolowercase()。替換(“”,“  - ”),
    使用:{...設備[ua]}
  })))
});

該配置在dist目錄中假定一個靜態網站,該網站在本地localhost:8000 (使用Python的http.server )。可以調整瀏覽器的數量以進行性能。對於此特定的非CI場景,省略了IS_CI邏輯。

捕獲和比較視覺效果

sample.test.js中的最小測試證明了核心功能:

從“@playwright/test”中導入{test,Expect};

test(“主頁”,async({page})=> {
  等待page.goto(“/”);
  等待期望(page).tohavescreenshot();
});

第一次運行會生成基線快照。隨後的運行與這些相比,如果檢測到視覺差異,則報告失敗。劇作家提供了視覺比較快照和檢查基線圖像的工具。

自動測試生成

為了避免為每個頁面的手動測試創建,我實現了一個簡單的Web爬網,以動態生成測試。

站點地圖創建

playwright.config.js文件已擴展到包含globalSetup和導出相關配置值:

導出讓瀏覽器= [“桌面firefox”,“桌面chrome”,“桌面Safari”];
導出令base_url =“ http:// localhost:8000”;

// ...其餘的配置...

導出默認decteConfig({
  // ...其餘的配置...
  GlobalsEtup:require.sroove(“ ./ setup.js”)
});

setup.js文件使用無頭瀏覽器來爬網站並創建一個站點地圖:

導入{base_url,瀏覽器}來自“ ./playwright.config.js”;
導入{createSiteMap,readSiteMap}從“ ./sitemap.js”;
從“@playwright/test”中導入劇作家;

導出默認異步函數globalsetup(config){
  //僅創建站點地圖,如果它尚不存在
  嘗試 {
    readSiteMap();
    返回;
  } catch(err){}

  //啟動瀏覽器並啟動爬網
  令瀏覽器= playwright.devices [瀏覽器[0]]。 defaultBrowserType;
  瀏覽器=等待劇作家[瀏覽器] .launch();
  令page =等待瀏覽器.newpage();
  等待createSiteMap(base_url,page);
  等待browser.close();
}

sitemap.js文件包含軌道邏輯:

導入{readfilesync,writefilesync}來自“ node:fs”;
從“ node:path”導入{join};

令Entry_point =“/topics”;
讓SiteMap = join(__ dirname,“ ./sitemap.json”);

導出異步函數createSiteMap(baseurl,page){
  等待頁面。
  令URL =等待頁面。
  令data = json.stringify(url,null,4);
  writefilesync(sitemap,data,{engoding:“ utf-8”});
}

導出函數readsitemap(){
  嘗試 {
    var data = readfilesync(sitemap,{engoding:“ utf-8”});
  } catch(err){
    if(err.code ===“ enoent”){
      投擲新錯誤(“缺少站點地圖”);
    }
    投擲錯誤;
  }
  返回JSON.PARSE(數據);
}

函數ExtractLocallinks(baseurl){
  令URLS = new Set();
  let offset = baseurl.length;
  for(令document.links的{href}){
    if(href.startswith(baseurl)){
      令路徑= href.slice(offset);
      urls.add(路徑);
    }
  }
  返回array.from(urls);
}

這使用page.evaluate在瀏覽器上下文中提取鏈接。

動態測試生成

viz.test.js文件基於站點地圖動態生成測試:

從“ ./sitemap.js”導入{readSiteMap};
從“@playwright/test”中導入{test,Expect};
從“ node:path”導入{join};

讓選項= {
  stylepath:join(__ dirname,“ ./viz.tweaks.css”)
};

讓SiteMap = [];
嘗試 {
  siteMap = readSiteMap();
} catch(err){
  測試(“站點地圖”,({page})=> {
    投擲新錯誤(“缺少站點地圖”);
  });
}

for(讓站點地圖的URL){
  test(`page at $ {url}`,async({page})=> {
    等待Page.goto(url);
    等待期望(page).tohavescreenshot(options);
  });
}

由於劇作家當前對測試文件中的頂級await限制,因此需要同步readSiteMapOPTIONS對象允許自定義CSS調整。

處理異常和片狀

視覺測試需要處理異常。 viz.tweaks.css中的自定義CSS可以抑制影響一致性的特定元素:

 / *抑制狀態 */
主a:訪問{
  顏色:var( - 顏色鏈接);
}

/ *抑制隨機性 */
iframe [src $ =“/articles/stignals-reactivity/demo.html”] {
  可見性:隱藏;
}

/ *抑製片狀 */
身體:h1 a [href =“/wip/unicode-symbols/“”] {
  主Tbody> TR:Last-Child> TD:First-Child {
    字體大小:0;
    可見性:隱藏;
  }
}

解決視口限制

最初,測試未能檢測到樣式的變化,因為.toHaveScreenshot僅捕獲視口。要捕獲完整頁面, playwright.config.js已修改:

導出讓寬度= 800;
導出LET Height = width;

// ...其餘的配置...

項目:browsers.map(ua =>({{
  // ...其餘的配置...
  使用: {
    // ...其餘的配置...
    視口:{
      寬度:寬度,
      高度:高度
    }
  }
})))

viz.test.js已更新以確定和設置頁面高度:

從“ ./playwright.config.js”導入{width,height};

// ...其餘的進口...

for(讓站點地圖的URL){
  test(`page at $ {url}`,async({page})=> {
    checksnapshot(url,page);
  });
}

異步函數checksnapshot(url,page){
  等待Page.setViewPortsize({width:width:width,height:height});
  等待Page.goto(url);
  等待頁面。
  讓高度=等待頁面。
  等待Page.setViewPortsize({width:width:width,height:Math.ceil(height)});
  等待頁面。
  等待期望(page).tohavescreenshot(options);
}

函數getfullheight(){
  返回document.documentElement.getBoundingClientRect()。高度;
}

這確保了整個頁面的捕獲,儘管它增加了資源消耗,並且可能會由於佈局變化或超時而引起片狀。

結論

這種視覺回歸測試解決方案(雖然比最初預期的更為複雜,但都可以有效地解決該問題。仍然存在重構和隨後的黑暗模式實現。

以上是與劇作家的自動視覺回歸測試的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
錨定位只是不關心來源訂單錨定位只是不關心來源訂單Apr 29, 2025 am 09:37 AM

錨定定位避開HTML源順序的事實是如此之高,因為它在內容和演示文稿之間的另一個關注點是另一個分離的事實。

保證金是什麼:40px 100px 120px 80px表示?保證金是什麼:40px 100px 120px 80px表示?Apr 28, 2025 pm 05:31 PM

文章討論了CSS保證金屬性,特別是“保證金:40px 100px 120px 80px”,其應用程序以及對網頁佈局的影響。

什麼是不同的CSS邊框特性?什麼是不同的CSS邊框特性?Apr 28, 2025 pm 05:30 PM

本文討論了CSS邊境屬性,重點是自定義,最佳實踐和響應能力。主要論點:邊境 - 拉迪烏斯(Border-Radius)對響應式設計最有效。

什麼是CSS背景,列出屬性?什麼是CSS背景,列出屬性?Apr 28, 2025 pm 05:29 PM

本文討論了CSS背景屬性,它們在增強網站設計方面的用途以及避免的常見錯誤。重點是使用背景大小的響應式設計。

什麼是CSS HSL顏色?什麼是CSS HSL顏色?Apr 28, 2025 pm 05:28 PM

文章討論了CSS HSL顏色,其在網絡設計中的使用以及比RGB的優勢。主要重點是通過直觀的顏色操縱來增強設計和可訪問性。

我們如何在CSS中添加評論?我們如何在CSS中添加評論?Apr 28, 2025 pm 05:27 PM

本文討論了CSS中評論的使用,詳細介紹了單線和多行評論語法。它認為註釋可以增強代碼的可讀性,可維護性和協作,但如果無法正確管理,可能會影響網站性能。

什麼是CSS選擇器?什麼是CSS選擇器?Apr 28, 2025 pm 05:26 PM

本文討論了CSS選擇器,其類型和用於造型HTML元素的用法。它比較ID和類選擇器,並與復雜的選擇器解決性能問題。

哪種類型的CSS持有最高優先級?哪種類型的CSS持有最高優先級?Apr 28, 2025 pm 05:25 PM

本文討論了CSS優先級,重點是具有最高特異性的內聯風格。它解釋了特異性級別,覆蓋方法和用於管理CSS衝突的工具。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器