亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

1.前端自動(dòng)化測試 之 視覺測試

張春雷 / 3442人閱讀

摘要:視覺感知測試視覺回歸測試為了解決上面提到的各種問題,視覺感知測試孕育而生。第三種方式,無法進(jìn)行視覺感知測試結(jié)果只能進(jìn)行視覺回歸測試和上一版的繼續(xù)比較差異。

前端自動(dòng)化測試 之 視覺測試

前端測試分類

前端測試主要分五大方向測試,而這五大方向也分很多小方向測試,首先簡單的介紹每個(gè)方向的概念

界面樣式測試

固定界面樣式測試:主要針對文字內(nèi)容不變的區(qū)域,例如頁面的頁頭,頁腳這類結(jié)構(gòu)、內(nèi)容不變的區(qū)域,而測試一般通過截圖對比解決。

結(jié)構(gòu)不變界面樣式測試:主要針對結(jié)構(gòu)不變的區(qū)域,例如新聞區(qū)域這類結(jié)構(gòu)不變,內(nèi)容變化的區(qū)域,這類測試一般通過DOM元素對比解決。

計(jì)算樣式測試:主要針對計(jì)算樣式不變的區(qū)域,這類測試一般通過比較計(jì)算樣式解決,但是這種測試不推薦,因?yàn)闇y試成本比較大。

功能測試

服務(wù)器數(shù)據(jù)預(yù)期測試:主要針對用戶在前端界面進(jìn)行某種操作后,提交數(shù)據(jù)給后臺(tái)后,測試后臺(tái)能否返回預(yù)期的數(shù)據(jù)

界面功能測試:主要針對用戶在前端界面進(jìn)行某種交互性操作后,測試能否獲取預(yù)期的功能、界面交互

多瀏覽器測試

多瀏覽器測試:基于界面樣式測試、功能測試的基礎(chǔ)上來進(jìn)行不同瀏覽器的的測試,俗稱兼容性測試。

性能測試

白屏?xí)r間:用戶瀏覽器輸入網(wǎng)址后至瀏覽器出現(xiàn)至少1px畫面為止。

首屏?xí)r間:用戶瀏覽器首屏內(nèi)所有的元素呈現(xiàn)所花費(fèi)時(shí)間。

頁面回歸時(shí)間:用戶瀏覽器非第一次加載所有的元素呈現(xiàn)所花費(fèi)時(shí)間。

用戶可操作時(shí)間(dom ready) :網(wǎng)站某些功能可以使用的時(shí)間。

頁面總下載時(shí)間(onload):網(wǎng)站中所有資源加載完成并且可用時(shí)間。

質(zhì)量測試

雅虎網(wǎng)站優(yōu)化規(guī)則

什么樣的項(xiàng)目適合自動(dòng)化測試呢?

如上圖所示,真正工作中無法全部滿足以上條件,所以需要作出權(quán)衡,一般來說,只需要滿足以下幾點(diǎn),就可以對項(xiàng)目開展自動(dòng)化測試(1.需求穩(wěn)定
不會(huì)頻繁變更。2.多平臺(tái)運(yùn)行,組合遍歷型,大量的重復(fù)任務(wù)。3.軟件維護(hù)周期長,有生命力。4.被測系統(tǒng)開發(fā)較為規(guī)范,可測試性強(qiáng)。):

需求穩(wěn)定,不會(huì)頻繁變更

自動(dòng)化測試最大的挑戰(zhàn)就是需求的變化,而自動(dòng)化腳本本身就需要修改、擴(kuò)展、debug,去適應(yīng)新的功能,如果投入產(chǎn)出比太低,那么自動(dòng)化測試也失去了其價(jià)值和意義;

折中的做法是選擇相對穩(wěn)定的模塊和功能進(jìn)行自動(dòng)化測試,變動(dòng)較大、需求變更較頻繁的部分用手工測試;

多平臺(tái)運(yùn)行,組合遍歷型、大量的重復(fù)任務(wù)

測試數(shù)據(jù)、測試用例、自動(dòng)化腳本的重用性和移植性較強(qiáng),降低成本,提高效率和價(jià)值;

軟件維護(hù)周期長,有生命力

自動(dòng)化測試的需求穩(wěn)定性要求、自動(dòng)化框架的設(shè)計(jì)、腳本開發(fā)與調(diào)試均需要時(shí)間,這其實(shí)也是一個(gè)軟件開發(fā)過程,如果項(xiàng)目周期較短,沒有足夠的時(shí)間去支持這一過程,那自動(dòng)化測試也就不需要了;

被測系統(tǒng)開發(fā)較為規(guī)范,可測試性強(qiáng)

主要出于這幾點(diǎn)考慮:被測試系統(tǒng)的架構(gòu)差異、測試技術(shù)和工具的適應(yīng)性、測試人員的能力能否設(shè)計(jì)開發(fā)出適應(yīng)差異的自動(dòng)化測試框架;

什么是UI測試

對于界面布局,傳統(tǒng)的測試都是由人工對比設(shè)計(jì)圖和產(chǎn)品界面。當(dāng)界面有修改之后,再由人通過肉眼去檢查修改(包括正確的和錯(cuò)誤的修改),這樣即費(fèi)時(shí)而且測試結(jié)果又不穩(wěn)定,因?yàn)槿斯Ρ葴y試存在兩個(gè)巨坑:1.效率低;2.人的不確定性。對于擁有大量復(fù)雜界面的Web應(yīng)用,界面布局的測試的數(shù)量巨大,再加上這兩個(gè)問題,導(dǎo)致這類應(yīng)用的界面布局測試/回歸測試時(shí)間很長,成本很高,所以很多基于Agile(敏捷開發(fā))項(xiàng)目基本不可能在迭代周期內(nèi)高質(zhì)量的完成其視覺測試。對于每天做一次,那更是不可能完成的任務(wù)。

視覺感知測試/視覺回歸測試

為了解決上面提到的各種問題,視覺感知測試孕育而生。它使用傳統(tǒng)的對圖片進(jìn)行二進(jìn)制比較的辦法,結(jié)合敏捷迭代開發(fā)的理念,產(chǎn)生的一種針對界面布局的自動(dòng)化測試方法。

視覺感知測試

視覺感知測試就是對第一個(gè)版本的所有界面進(jìn)行第一次測試。

視覺感知測試包含以下幾個(gè)主要的測試步驟:

需要注意的是!

配對URL(忽略hostname)

通過配對URL,對所有的截圖按照相同的URL進(jìn)行分組。當(dāng)然有時(shí)候會(huì)出現(xiàn)新的界面,有時(shí)候老的界面會(huì)被刪除。對于新的界面就需要人工進(jìn)行首次驗(yàn)證測試 。

像素級別的圖形比較

對于分組之后的截圖進(jìn)行像素級別的比較并生產(chǎn)差別圖。有時(shí)候?yàn)榱私翟耄梢灾粚植筷P(guān)心的組件進(jìn)行比較。

人工查看所有不同

最后通過人工審查差別圖報(bào)告完成測試。

視覺感知測試結(jié)果:

預(yù)期(expected) 實(shí)際(actual) 比較結(jié)果(diff)
視覺回歸測試

我們認(rèn)為如果一個(gè)界面通過第一次的人工驗(yàn)證并發(fā)布之后,它就是一個(gè)正確的標(biāo)準(zhǔn)界面,并且是包含了人工測試價(jià)值的資產(chǎn)。當(dāng)下一次測試的時(shí)候,這部分價(jià)值就應(yīng)該被保留并重用起來,用于減少新的一次測試的時(shí)間,從而實(shí)現(xiàn)界面的快速回歸測試。

視覺回歸測試包含以下幾個(gè)主要的測試步驟:

回歸和感知測試流程差不多只是差異值要更小一點(diǎn),并且只有效果圖需要替換內(nèi)容。

視覺自動(dòng)測試怎么做?

要進(jìn)行視覺自動(dòng)測試,有三種方式。

第一種是截屏比對(局部、整頁)。

第二種通過JavaScript調(diào)用window.getComputedStyle()獲取計(jì)算后的樣式并進(jìn)行斷言。

第三種dom結(jié)構(gòu)對比加css樣式對比。

這三種各有明顯的優(yōu)勢和不足。 第二種方式強(qiáng)綁定了實(shí)現(xiàn),從而變得可能比較脆弱。 第一種方式離設(shè)計(jì)太近了,當(dāng)頁面中有可變內(nèi)容時(shí)就會(huì)有問題。
第三種方式,無法進(jìn)行視覺感知測試結(jié)果只能進(jìn)行視覺回歸測試和上一版的dom繼續(xù)比較差異。

我更傾向與第一種截圖對比;它的測試基于用戶所見而不是用戶所見的抽象。當(dāng)然第三種也是非常好的 page-monitor 有興趣的朋友可以自行了解。為什么第三種那么好為什么不使用呢?因?yàn)樯厦孢@個(gè)庫是基于phantomjs并且它的實(shí)現(xiàn)方式過于復(fù)雜不適合新手玩玩。

像素對比工具,有哪些?
名稱 地址
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...

好了介紹了那么多,怎么選一個(gè)合適的Headless Browser呢?

Headless Browser???我是視覺測試要無界面瀏覽器干嘛?

因?yàn)橛辛讼袼貙Ρ裙ぞ呶覀冞€需要一個(gè)瀏覽器進(jìn)行截圖和設(shè)計(jì)圖進(jìn)行像素比較。

比較常見出名的幾個(gè)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í)行過程會(huì)有頁面展示。

我們這里呢就只講Webkit內(nèi)核的,其他的我就不講了。

PhantomJS簡介:

PhantomJS 是一個(gè)基于webkit的JavaScript API。它使用QtWebKit作為它核心瀏覽器的功能,使用webkit來編譯解釋執(zhí)行JavaScript代碼。任何你可以在基于webkit瀏覽器做的事情,它都能做到。它不僅是個(gè)隱形的瀏覽器,提供了諸如CSS選擇器、支持Web標(biāo)準(zhǔn)、DOM操作、JSON、HTML5、Canvas、SVG等,同時(shí)也提供了處理文件I/O的操作,從而使你可以向操作系統(tǒng)讀寫文件等。PhantomJS的用處可謂非常廣泛,諸如網(wǎng)絡(luò)監(jiān)測、網(wǎng)頁截屏、無需瀏覽器的 Web 測試、頁面訪問自動(dòng)化等。

但是 PhantomJS 因?yàn)楫吘共皇钦鎸?shí)的用戶瀏覽器環(huán)境,使用起來還是有不少的詬病。之前一直在使用 PhantomJS ,功能雖然夠用,不過和在真實(shí)的瀏覽器里面訪問的界面來對比差別還是比較大的。

Puppeteer簡介:

Puppeteer是Chrome團(tuán)隊(duì)開發(fā)的一個(gè)Node庫。它提供了一個(gè)高級API來控制無頭或完整的Chrome。它通過使用Chrome無界面模式 (Headless Chrome )和DevTools協(xié)議的組合來實(shí)現(xiàn)這一點(diǎn)。它使用一個(gè)更上層的API來封裝其功能,讓用戶界面測試自動(dòng)化變得輕而易舉。
人們基于Chrome DevTools協(xié)議開發(fā)了一系列Google Chrome工具。你在瀏覽器中點(diǎn)擊更多工具 ->開發(fā)工具,打開的就是DevTools。DevTools協(xié)議是DevTools的動(dòng)力基礎(chǔ),我們現(xiàn)在可以使用Chrome中的DevTools來做更多的事情。

好了簡介講完了,我們來對比一下這兩個(gè)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)可以分別出來勝負(fù)了。

使用puppeteer進(jìn)行視覺感知測試

我們來做一個(gè)簡單的dome

我們這里拿掘金來做一個(gè)視覺感知測試的例子。

1.首先創(chuàng)建項(xiàng)目名字就叫“PerceptionTest”把。

2.安裝依賴

安裝Puppeteer

npm install puppeteer --save

像素對比工具我就選我最常用的blink-dif了

npm install blink-diff --save

3.依賴安完了我們來創(chuàng)建一個(gè)js文件“app.js”

4.加載依賴

const puppeteer = require("puppeteer"),//無頭瀏覽器
    BlinkDiff = require("blink-diff"),//像素對比
    imgUrl = __dirname + "/blink-diff_img/";//圖片目錄

5.使用puppeteer進(jìn)行截圖

(async () => {
    //創(chuàng)建puppeteer
    const browser = await puppeteer.launch({ headless: true });
    //new 一個(gè)新的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)容呢,因?yàn)槲覀僓I測試指的是測試界面樣式而不是去匹配里面的內(nèi)容,如果不替換里面的內(nèi)容那像素對比工具比較出來的相似度肯定很低。所以我們要替換掉內(nèi)容,要讓內(nèi)容完整統(tǒng)一,我們才好更加精確的去比較差異。

好了我們來分析一下要替換的內(nèi)容。

要替換的內(nèi)容如下:

標(biāo)題

標(biāo)簽

作者

發(fā)布時(shí)間

閱讀數(shù)

列表圖片

7.替換內(nèi)容

puppeteer提供了非常豐富的api,其中有個(gè)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 = "測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試";

            //替換標(biāo)簽
            element.querySelector("ul > li.item.category > span").innerHTML = "測試";

            //替換作者
            element.querySelector("ul > li.item.username.clickable > div > a").innerHTML = "測試";

            //替換發(fā)布時(shí)間
            element.querySelector("div.info-row.meta-row > ul > li:nth-child(3)").innerHTML = "9999天前";

            //替換發(fā)布時(shí)間
            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進(jìn)行像素對比較

const diff = new BlinkDiff({
        imageAPath: imgUrl + "example.png", // 設(shè)計(jì)圖
        imageBPath: imgUrl + "Screenshots.png",//頁面截圖
        //低于其中差異的像素?cái)?shù)/ p(默認(rèn)值: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 = "測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試";

            //替換標(biāo)簽
            element.querySelector("ul > li.item.category > span").innerHTML = "測試";

            //替換作者
            element.querySelector("ul > li.item.username.clickable > div > a").innerHTML = "測試";

            //替換發(fā)布時(shí)間
            element.querySelector("div.info-row.meta-row > ul > li:nth-child(3)").innerHTML = "9999天前";

            //替換發(fā)布時(shí)間
            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è)計(jì)圖
        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完整代碼

git完整代碼:https://github.com/my07ke/Per...

好了,欲知后事如何,請聽下回分解。

點(diǎn)擊鏈接加入群聊【前端|WEB|CSS|Javascript|HTML】:https://jq.qq.com/?_wv=1027&k...

參考:

淺談UI自動(dòng)化測試

視覺感知測試

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/52288.html

相關(guān)文章

  • 1.前端動(dòng)化測試 視覺測試

    摘要:視覺感知測試視覺回歸測試為了解決上面提到的各種問題,視覺感知測試孕育而生。第三種方式,無法進(jìn)行視覺感知測試結(jié)果只能進(jìn)行視覺回歸測試和上一版的繼續(xù)比較差異。 前端自動(dòng)化測試 之 視覺測試 showImg(https://segmentfault.com/img/remote/1460000014720180); 前端測試分類 showImg(https://segmentfault.co...

    VioletJack 評論0 收藏0
  • 前端開發(fā)者手冊2019

    摘要:年,和前端開發(fā)者與應(yīng)用程序前端開發(fā)者之間產(chǎn)生了巨大的分歧。開發(fā)最常見的解決方案有手機(jī)和平板的原生應(yīng)用程序桌面應(yīng)用程序桌面應(yīng)用程序原生技術(shù)最后,前端開發(fā)者可以從瀏覽器開發(fā)中學(xué)習(xí)到,編寫代碼不需要考慮瀏覽器引擎的限制。 前端開發(fā)者手冊2019 Cody Lindley 編著 原文地址 本手冊由Frontend Masters贊助,通過深入現(xiàn)代化的前端工程課程來提高你的技能。 下載:PDF ...

    church 評論0 收藏0
  • 前端開發(fā)者手冊2019

    摘要:年,和前端開發(fā)者與應(yīng)用程序前端開發(fā)者之間產(chǎn)生了巨大的分歧。開發(fā)最常見的解決方案有手機(jī)和平板的原生應(yīng)用程序桌面應(yīng)用程序桌面應(yīng)用程序原生技術(shù)最后,前端開發(fā)者可以從瀏覽器開發(fā)中學(xué)習(xí)到,編寫代碼不需要考慮瀏覽器引擎的限制。 前端開發(fā)者手冊2019 Cody Lindley 編著 原文地址 本手冊由Frontend Masters贊助,通過深入現(xiàn)代化的前端工程課程來提高你的技能。 下載:PDF ...

    xiao7cn 評論0 收藏0
  • 前端開發(fā)者手冊2019

    摘要:年,和前端開發(fā)者與應(yīng)用程序前端開發(fā)者之間產(chǎn)生了巨大的分歧。開發(fā)最常見的解決方案有手機(jī)和平板的原生應(yīng)用程序桌面應(yīng)用程序桌面應(yīng)用程序原生技術(shù)最后,前端開發(fā)者可以從瀏覽器開發(fā)中學(xué)習(xí)到,編寫代碼不需要考慮瀏覽器引擎的限制。 前端開發(fā)者手冊2019 Cody Lindley 編著 原文地址 本手冊由Frontend Masters贊助,通過深入現(xiàn)代化的前端工程課程來提高你的技能。 下載:PDF ...

    鄒立鵬 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<