摘要:視覺感知測試視覺回歸測試為了解決上面提到的各種問題,視覺感知測試孕育而生。第三種方式,無法進行視覺感知測試結(jié)果只能進行視覺回歸測試和上一版的繼續(xù)比較差異。
前端自動化測試 之 視覺測試 前端測試分類
前端測試主要分五大方向測試,而這五大方向也分很多小方向測試,首先簡單的介紹每個方向的概念
界面樣式測試
固定界面樣式測試:主要針對文字內(nèi)容不變的區(qū)域,例如頁面的頁頭,頁腳這類結(jié)構(gòu)、內(nèi)容不變的區(qū)域,而測試一般通過截圖對比解決。
結(jié)構(gòu)不變界面樣式測試:主要針對結(jié)構(gòu)不變的區(qū)域,例如新聞區(qū)域這類結(jié)構(gòu)不變,內(nèi)容變化的區(qū)域,這類測試一般通過DOM元素對比解決。
計算樣式測試:主要針對計算樣式不變的區(qū)域,這類測試一般通過比較計算樣式解決,但是這種測試不推薦,因為測試成本比較大。
功能測試
服務(wù)器數(shù)據(jù)預(yù)期測試:主要針對用戶在前端界面進行某種操作后,提交數(shù)據(jù)給后臺后,測試后臺能否返回預(yù)期的數(shù)據(jù)
界面功能測試:主要針對用戶在前端界面進行某種交互性操作后,測試能否獲取預(yù)期的功能、界面交互
多瀏覽器測試
多瀏覽器測試:基于界面樣式測試、功能測試的基礎(chǔ)上來進行不同瀏覽器的的測試,俗稱兼容性測試。
性能測試
白屏時間:用戶瀏覽器輸入網(wǎng)址后至瀏覽器出現(xiàn)至少1px畫面為止。
首屏時間:用戶瀏覽器首屏內(nèi)所有的元素呈現(xiàn)所花費時間。
頁面回歸時間:用戶瀏覽器非第一次加載所有的元素呈現(xiàn)所花費時間。
用戶可操作時間(dom ready) :網(wǎng)站某些功能可以使用的時間。
頁面總下載時間(onload):網(wǎng)站中所有資源加載完成并且可用時間。
質(zhì)量測試
雅虎網(wǎng)站優(yōu)化規(guī)則
什么樣的項目適合自動化測試呢?如上圖所示,真正工作中無法全部滿足以上條件,所以需要作出權(quán)衡,一般來說,只需要滿足以下幾點,就可以對項目開展自動化測試(1.需求穩(wěn)定
不會頻繁變更。2.多平臺運行,組合遍歷型,大量的重復任務(wù)。3.軟件維護周期長,有生命力。4.被測系統(tǒng)開發(fā)較為規(guī)范,可測試性強。):
需求穩(wěn)定,不會頻繁變更
自動化測試最大的挑戰(zhàn)就是需求的變化,而自動化腳本本身就需要修改、擴展、debug,去適應(yīng)新的功能,如果投入產(chǎn)出比太低,那么自動化測試也失去了其價值和意義;
折中的做法是選擇相對穩(wěn)定的模塊和功能進行自動化測試,變動較大、需求變更較頻繁的部分用手工測試;
多平臺運行,組合遍歷型、大量的重復任務(wù)
測試數(shù)據(jù)、測試用例、自動化腳本的重用性和移植性較強,降低成本,提高效率和價值;
軟件維護周期長,有生命力
自動化測試的需求穩(wěn)定性要求、自動化框架的設(shè)計、腳本開發(fā)與調(diào)試均需要時間,這其實也是一個軟件開發(fā)過程,如果項目周期較短,沒有足夠的時間去支持這一過程,那自動化測試也就不需要了;
被測系統(tǒng)開發(fā)較為規(guī)范,可測試性強
主要出于這幾點考慮:被測試系統(tǒng)的架構(gòu)差異、測試技術(shù)和工具的適應(yīng)性、測試人員的能力能否設(shè)計開發(fā)出適應(yīng)差異的自動化測試框架;
什么是UI測試對于界面布局,傳統(tǒng)的測試都是由人工對比設(shè)計圖和產(chǎn)品界面。當界面有修改之后,再由人通過肉眼去檢查修改(包括正確的和錯誤的修改),這樣即費時而且測試結(jié)果又不穩(wěn)定,因為人工對比測試存在兩個巨坑:1.效率低;2.人的不確定性。對于擁有大量復雜界面的Web應(yīng)用,界面布局的測試的數(shù)量巨大,再加上這兩個問題,導致這類應(yīng)用的界面布局測試/回歸測試時間很長,成本很高,所以很多基于Agile(敏捷開發(fā))項目基本不可能在迭代周期內(nèi)高質(zhì)量的完成其視覺測試。對于每天做一次,那更是不可能完成的任務(wù)。
視覺感知測試/視覺回歸測試為了解決上面提到的各種問題,視覺感知測試孕育而生。它使用傳統(tǒng)的對圖片進行二進制比較的辦法,結(jié)合敏捷迭代開發(fā)的理念,產(chǎn)生的一種針對界面布局的自動化測試方法。
視覺感知測試視覺感知測試就是對第一個版本的所有界面進行第一次測試。
視覺感知測試包含以下幾個主要的測試步驟:
需要注意的是!
配對URL(忽略hostname)
通過配對URL,對所有的截圖按照相同的URL進行分組。當然有時候會出現(xiàn)新的界面,有時候老的界面會被刪除。對于新的界面就需要人工進行首次驗證測試 。
像素級別的圖形比較
對于分組之后的截圖進行像素級別的比較并生產(chǎn)差別圖。有時候為了降噪,可以只對局部關(guān)心的組件進行比較。
人工查看所有不同
最后通過人工審查差別圖報告完成測試。
視覺感知測試結(jié)果:
預(yù)期(expected) | 實際(actual) | 比較結(jié)果(diff) |
---|---|---|
我們認為如果一個界面通過第一次的人工驗證并發(fā)布之后,它就是一個正確的標準界面,并且是包含了人工測試價值的資產(chǎn)。當下一次測試的時候,這部分價值就應(yīng)該被保留并重用起來,用于減少新的一次測試的時間,從而實現(xiàn)界面的快速回歸測試。
視覺回歸測試包含以下幾個主要的測試步驟:
回歸和感知測試流程差不多只是差異值要更小一點,并且只有效果圖需要替換內(nèi)容。
視覺自動測試怎么做?要進行視覺自動測試,有三種方式。
第一種是截屏比對(局部、整頁)。
第二種通過JavaScript調(diào)用window.getComputedStyle()獲取計算后的樣式并進行斷言。
第三種dom結(jié)構(gòu)對比加css樣式對比。
這三種各有明顯的優(yōu)勢和不足。 第二種方式強綁定了實現(xiàn),從而變得可能比較脆弱。 第一種方式離設(shè)計太近了,當頁面中有可變內(nèi)容時就會有問題。
第三種方式,無法進行視覺感知測試結(jié)果只能進行視覺回歸測試和上一版的dom繼續(xù)比較差異。
我更傾向與第一種截圖對比;它的測試基于用戶所見而不是用戶所見的抽象。當然第三種也是非常好的 page-monitor 有興趣的朋友可以自行了解。為什么第三種那么好為什么不使用呢?因為上面這個庫是基于phantomjs并且它的實現(xiàn)方式過于復雜不適合新手玩玩。
像素對比工具,有哪些?名稱 | 地址 |
---|---|
PhantomCSS | https://github.com/HuddleEng/... |
GhostStory | https://github.com/thingsinja... |
Cactus | https://github.com/winston/ca... |
Needle | https://github.com/python-nee... |
CSSCritic | https://github.com/cburgmer/c... |
sikuli | http://www.sikuli.org/ |
Mogo | http://mogotest.com/ |
pixelmatch | https://github.com/mapbox/pix... |
pixel-diff | https://github.com/koola/pixe... |
好了介紹了那么多,怎么選一個合適的Headless Browser呢?
Headless Browser???我是視覺測試要無界面瀏覽器干嘛?
因為有了像素對比工具我們還需要一個瀏覽器進行截圖和設(shè)計圖進行像素比較。
比較常見出名的幾個Headless Browser,有哪些?名稱 | 內(nèi)核 | 地址 |
---|---|---|
Puppeteer | Webkit | https://github.com/GoogleChro... |
PhantomJS | Webkit | http://phantomjs.org/ |
SlimerJS | Gecko | https://github.com/laurentj/s... |
TrifleJS | IE | https://github.com/sdesalas/t... |
PhantomJS 基于 Webkit 內(nèi)核,不支持 Flash 的播放;SlimerJS 基于火狐的 Gecko 內(nèi)核,支持 Flash播放,并且執(zhí)行過程會有頁面展示。
我們這里呢就只講Webkit內(nèi)核的,其他的我就不講了。
PhantomJS簡介:PhantomJS 是一個基于webkit的JavaScript API。它使用QtWebKit作為它核心瀏覽器的功能,使用webkit來編譯解釋執(zhí)行JavaScript代碼。任何你可以在基于webkit瀏覽器做的事情,它都能做到。它不僅是個隱形的瀏覽器,提供了諸如CSS選擇器、支持Web標準、DOM操作、JSON、HTML5、Canvas、SVG等,同時也提供了處理文件I/O的操作,從而使你可以向操作系統(tǒng)讀寫文件等。PhantomJS的用處可謂非常廣泛,諸如網(wǎng)絡(luò)監(jiān)測、網(wǎng)頁截屏、無需瀏覽器的 Web 測試、頁面訪問自動化等。
但是 PhantomJS 因為畢竟不是真實的用戶瀏覽器環(huán)境,使用起來還是有不少的詬病。之前一直在使用 PhantomJS ,功能雖然夠用,不過和在真實的瀏覽器里面訪問的界面來對比差別還是比較大的。
Puppeteer簡介:Puppeteer是Chrome團隊開發(fā)的一個Node庫。它提供了一個高級API來控制無頭或完整的Chrome。它通過使用Chrome無界面模式 (Headless Chrome )和DevTools協(xié)議的組合來實現(xiàn)這一點。它使用一個更上層的API來封裝其功能,讓用戶界面測試自動化變得輕而易舉。
人們基于Chrome DevTools協(xié)議開發(fā)了一系列Google Chrome工具。你在瀏覽器中點擊更多工具 ->開發(fā)工具,打開的就是DevTools。DevTools協(xié)議是DevTools的動力基礎(chǔ),我們現(xiàn)在可以使用Chrome中的DevTools來做更多的事情。
好了簡介講完了,我們來對比一下這兩個Headless Browser的區(qū)別。
PhantomJS:
var page = require("webpage").create(); page.viewportSize = { width: 400, height: 400 }; page.open("http://localhost:8899/VS", function(status) { if (status === "success") { page.render("a.jpg"); } else { console.log("Page failed to load."); } phantom.exit(0); });
Puppeteer:
const puppeteer = require("puppeteer"); (async() => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto("http://localhost:8899/VS"); await page.setViewport({ width: 400, height: 400 }) //保存圖片 const images = await page.screenshot({ path: "VS.jpg", fullPage: true, omitBackground: true }); //關(guān)閉瀏覽器 await browser.close(); })();
Puppeteer | PhantomJS | Chrome瀏覽器 |
---|---|---|
瀏覽器效果(大圖):
好了看到這里已經(jīng)可以分別出來勝負了。
使用puppeteer進行視覺感知測試我們來做一個簡單的dome
我們這里拿掘金來做一個視覺感知測試的例子。
1.首先創(chuàng)建項目名字就叫“PerceptionTest”把。
2.安裝依賴
安裝Puppeteer
npm install puppeteer --save
像素對比工具我就選我最常用的blink-dif了
npm install blink-diff --save
3.依賴安完了我們來創(chuàng)建一個js文件“app.js”
4.加載依賴
const puppeteer = require("puppeteer"),//無頭瀏覽器 BlinkDiff = require("blink-diff"),//像素對比 imgUrl = __dirname + "/blink-diff_img/";//圖片目錄
5.使用puppeteer進行截圖
(async () => { //創(chuàng)建puppeteer const browser = await puppeteer.launch({ headless: true }); //new 一個新的tab頁面 const page = await browser.newPage(); //設(shè)置瀏覽器的尺寸 await page.setViewport({ width: 1920, height: 945 }); //打開url await page.goto("https://juejin.im/"); //保存截圖 await page.screenshot({ path: imgUrl + "Screenshots.png", fullPage: true }); //關(guān)閉瀏覽器 await browser.close(); })();
6.分析頁面找到要替換的內(nèi)容
為什么要替換內(nèi)容呢,因為我們UI測試指的是測試界面樣式而不是去匹配里面的內(nèi)容,如果不替換里面的內(nèi)容那像素對比工具比較出來的相似度肯定很低。所以我們要替換掉內(nèi)容,要讓內(nèi)容完整統(tǒng)一,我們才好更加精確的去比較差異。
好了我們來分析一下要替換的內(nèi)容。
要替換的內(nèi)容如下:
標題
標簽
作者
發(fā)布時間
閱讀數(shù)
列表圖片
7.替換內(nèi)容
puppeteer提供了非常豐富的api,其中有個api叫page.evaluate可以向頁面插入一段js。
await page.evaluate(async () => { //列表 var Lists = document.querySelectorAll("div.feed.welcome__feed > ul > li > div > a > div"); Lists.forEach(function (element, index, array) { element.querySelector("a.title").innerHTML = "測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試"; //替換標簽 element.querySelector("ul > li.item.category > span").innerHTML = "測試"; //替換作者 element.querySelector("ul > li.item.username.clickable > div > a").innerHTML = "測試"; //替換發(fā)布時間 element.querySelector("div.info-row.meta-row > ul > li:nth-child(3)").innerHTML = "9999天前"; //替換發(fā)布時間 element.querySelector("div.info-row.meta-row > ul > li:nth-child(4)").innerHTML = "99999999999 次閱讀"; //列表圖片 if (element.querySelectorAll("div.lazy.thumb.thumb.loaded").length==1) { element.querySelector("div.lazy.thumb.thumb.loaded").style.background = "#fdedc9"; } else { var loaded=document.createElement("div"); loaded.className=" lazy thumb thumb loaded"; loaded.style.background = "#fdedc9"; loaded.setAttribute("data-v-b2db8566",""); loaded.setAttribute("data-v-009ea7bb",""); loaded.setAttribute("data-v-f2ca14b0",""); element.appendChild(loaded); } }); });
8.使用Blink-Diff進行像素對比較
const diff = new BlinkDiff({ imageAPath: imgUrl + "example.png", // 設(shè)計圖 imageBPath: imgUrl + "Screenshots.png",//頁面截圖 //低于其中差異的像素數(shù)/ p(默認值:500) - 百分比閾值:1 = 100%,0.2 = 20% threshold: 0.02, // 1% threshold imageOutputPath: imgUrl + "Diff.png"http://Diff路徑 }); diff.run(function (error, result) { if (error) { throw error; } else { console.log(diff.hasPassed(result.code) ? "通過" : "失敗"); console.log("總像素:" + result.dimension); console.log("發(fā)現(xiàn):" + result.differences + " 差異."); } });
完整代碼:
const puppeteer = require("puppeteer"), BlinkDiff = require("blink-diff"), imgUrl = __dirname + "/blink-diff_img/"; (async () => { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); await page.setViewport({ width: 1920, height: 945 }); await page.goto("https://juejin.im/"); await page.evaluate(async () => { //列表 var Lists = document.querySelectorAll("div.feed.welcome__feed > ul > li > div > a > div"); Lists.forEach(function (element, index, array) { element.querySelector("a.title").innerHTML = "測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試"; //替換標簽 element.querySelector("ul > li.item.category > span").innerHTML = "測試"; //替換作者 element.querySelector("ul > li.item.username.clickable > div > a").innerHTML = "測試"; //替換發(fā)布時間 element.querySelector("div.info-row.meta-row > ul > li:nth-child(3)").innerHTML = "9999天前"; //替換發(fā)布時間 element.querySelector("div.info-row.meta-row > ul > li:nth-child(4)").innerHTML = "99999999999 次閱讀"; //列表圖片 if (element.querySelectorAll("div.lazy.thumb.thumb.loaded").length==1) { element.querySelector("div.lazy.thumb.thumb.loaded").style.background = "#fdedc9"; } else { var loaded=document.createElement("div"); loaded.className=" lazy thumb thumb loaded"; loaded.style.background = "#fdedc9"; loaded.setAttribute("data-v-b2db8566",""); loaded.setAttribute("data-v-009ea7bb",""); loaded.setAttribute("data-v-f2ca14b0",""); element.appendChild(loaded); } }); }); await page.screenshot({ path: imgUrl + "Screenshots.png", fullPage: true }); const diff = new BlinkDiff({ imageAPath: imgUrl + "example.png", // 設(shè)計圖 imageBPath: imgUrl + "Screenshots.png",//頁面截圖 threshold: 0.02, // 1% threshold imageOutputPath: imgUrl + "Diff.png"http://Diff路徑 }); diff.run(function (error, result) { if (error) { throw error; } else { console.log(diff.hasPassed(result.code) ? "通過" : "失敗"); console.log("總像素:" + result.dimension); console.log("發(fā)現(xiàn):" + result.differences + " 差異."); } }); //關(guān)閉puppeteer await browser.close(); })();
差異圖
有差異 | 無差異 |
---|---|
git完整代碼:https://github.com/my07ke/Per...
好了,欲知后事如何,請聽下回分解。
點擊鏈接加入群聊【前端|WEB|CSS|Javascript|HTML】:https://jq.qq.com/?_wv=1027&k...
參考:淺談UI自動化測試
視覺感知測試
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/107770.html
摘要:視覺感知測試視覺回歸測試為了解決上面提到的各種問題,視覺感知測試孕育而生。第三種方式,無法進行視覺感知測試結(jié)果只能進行視覺回歸測試和上一版的繼續(xù)比較差異。 前端自動化測試 之 視覺測試 showImg(https://segmentfault.com/img/remote/1460000014720180); 前端測試分類 showImg(https://segmentfault.co...
摘要:年,和前端開發(fā)者與應(yīng)用程序前端開發(fā)者之間產(chǎn)生了巨大的分歧。開發(fā)最常見的解決方案有手機和平板的原生應(yīng)用程序桌面應(yīng)用程序桌面應(yīng)用程序原生技術(shù)最后,前端開發(fā)者可以從瀏覽器開發(fā)中學習到,編寫代碼不需要考慮瀏覽器引擎的限制。 前端開發(fā)者手冊2019 Cody Lindley 編著 原文地址 本手冊由Frontend Masters贊助,通過深入現(xiàn)代化的前端工程課程來提高你的技能。 下載:PDF ...
摘要:年,和前端開發(fā)者與應(yīng)用程序前端開發(fā)者之間產(chǎn)生了巨大的分歧。開發(fā)最常見的解決方案有手機和平板的原生應(yīng)用程序桌面應(yīng)用程序桌面應(yīng)用程序原生技術(shù)最后,前端開發(fā)者可以從瀏覽器開發(fā)中學習到,編寫代碼不需要考慮瀏覽器引擎的限制。 前端開發(fā)者手冊2019 Cody Lindley 編著 原文地址 本手冊由Frontend Masters贊助,通過深入現(xiàn)代化的前端工程課程來提高你的技能。 下載:PDF ...
摘要:年,和前端開發(fā)者與應(yīng)用程序前端開發(fā)者之間產(chǎn)生了巨大的分歧。開發(fā)最常見的解決方案有手機和平板的原生應(yīng)用程序桌面應(yīng)用程序桌面應(yīng)用程序原生技術(shù)最后,前端開發(fā)者可以從瀏覽器開發(fā)中學習到,編寫代碼不需要考慮瀏覽器引擎的限制。 前端開發(fā)者手冊2019 Cody Lindley 編著 原文地址 本手冊由Frontend Masters贊助,通過深入現(xiàn)代化的前端工程課程來提高你的技能。 下載:PDF ...
閱讀 2810·2019-08-30 15:55
閱讀 2857·2019-08-30 15:53
閱讀 2294·2019-08-26 13:47
閱讀 2557·2019-08-26 13:43
閱讀 3154·2019-08-26 13:33
閱讀 2802·2019-08-26 11:53
閱讀 1796·2019-08-23 18:35
閱讀 798·2019-08-23 17:16