成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用 ava 和 jsdom 做前端測試

GHOST_349178 / 2246人閱讀

摘要:前同事留下的測試,是基于瀏覽器的,主要還是功能測試。這里不詳細(xì)說怎么在瀏覽器端使用測試了。而且作者也是建議和支持這樣做的,簡單明了的測試腳本,重要性有時候可能和測試本身一樣重要。經(jīng)測試,在瀏覽器也有這種問題。

2016-09-03 更新

隨著在工作學(xué)習(xí)中更多地接觸、使用測試工具,發(fā)現(xiàn)自己在本文中的一些記錄是不準(zhǔn)確、不正確的。

今天(九月三日)在家看了 NingJs 的直播,其中有一個分享是關(guān)于測試框架的,非常棒,之后有可能的話還是找來視頻再學(xué)習(xí)下。

是的,兩個月前的理解,是很初級很淺陋的。

繼續(xù)學(xué)習(xí),繼續(xù)鉆研吧。

交代前因

前些天接手了一個舊項(xiàng)目。幸好不是在原來的基礎(chǔ)上做些修修改改的工作,可以算是開發(fā)新版的。

把前面同事留下來的代碼 down 下來,看了一下。總體還是挺好的。還有 macha + chai 的測試目錄。

我也是最近一段時間開始接觸測試。很久之前看了阮大神寫的 mocha 教程,不過也就看看,寫寫簡單的 demo。

前同事留下的測試,是基于瀏覽器的,主要還是功能測試。這里不詳細(xì)說怎么在瀏覽器端使用 mocha 測試了。因?yàn)樯婕暗浇换サ姆答仭⒆粉?,所以采用的方式是,先?iframe 加載待測頁面,然后用 contentWindow 的方式拿到 iframe 的環(huán)境,再做一些操作。手動觸發(fā)一些功能,然后再去判斷相應(yīng)的變化有沒有發(fā)生。

本地啟動了一個 server,瀏覽器里跑了幾遍測試。最后發(fā)現(xiàn)的問題是,有一個點(diǎn)擊測試怎么都過不了。于是又開啟了閱讀代碼的過程。

最后發(fā)現(xiàn)了問題所在,頁面使用的是自己封裝的 tap 事件,整個事件系統(tǒng)也是對原生 Element 原型的拓展??墒窃趺从|發(fā) tap 呢?前同事用了 touchend。可是并沒有用啊, tap 事件的觸發(fā)可是結(jié)合了從 touchstart 開啟一系列事件參數(shù)的判斷的。

后來我就想,瀏覽器端功能測試,能不能也拿到命令行上面來呢?

從 mocha 轉(zhuǎn)到 ava

正在此時,我想起了 jsdom 這個大神級作品。

一開始打算用 mocha + jsdom 跑一把。折騰了幾次發(fā)現(xiàn),mocha 這家伙不好適應(yīng)異步的工作,這事情很難搞啊。

可能要交代下我做了什么,嗯,我加載了一個 jquery 腳本,這樣就得外部文件,于是就有異步場景了。試了好多遍,mocha 還是沒能實(shí)現(xiàn)我的期望。(你也可以拿 mocha 試試看,多試幾次,如果單純靠那個 done 你就能成功,那么請私信我喲。)

又想想白天亂逛 github 的時候,在一些個項(xiàng)目中看到了 ava 這個測試工具。搜索一番,據(jù)說正適用于異步場景。

好,那就來試試看唄。前因交代清楚了,下面開始正式進(jìn)入教程階段。

開始講 demo

我將自己的 demo 放到了 github 上,地址是https://github.com/AngusFu/jsdom-ava-demo。你可以直接克隆項(xiàng)目,然后在本地跑起來。

因?yàn)槭?demo,項(xiàng)目內(nèi)容很簡單,兩個 js,一個用于測試 html 文件。

測試場景

先說測試場景:頁面上有一個紅色背景的 div,通過原生的 addEventListener 綁定了 click 事件。點(diǎn)擊之后,將背景色變換為綠色。就醬簡單?對,主要就這個,一方面我是想測試下 jsdom 對事件系統(tǒng)和 css 解析的支持(手動觸發(fā)事件,css 解析和值變化),一方面是想試試這種異步場景下怎么更好地測試。

那些對測試腳本運(yùn)行速度有非常嚴(yán)格要求的同學(xué)請想好了再往后看。因?yàn)楦鶕?jù)我的經(jīng)驗(yàn),jsdom + ava 這倆組合起來,速度確實(shí)慢得不行。我還沒仔細(xì)探究原因,但想來無非以下幾點(diǎn):

測試腳本要經(jīng)過 babel 6 編譯一遍,有耗時;

jsdom 系統(tǒng)比較龐大,解析起來費(fèi)勁;

我使用了 jsdom 的 jQueryify 方法從外部加載了 jQuery 文件(但這方法確實(shí)給力);

ava 本身其他方面的問題;

暫且忍著點(diǎn)。

核心 html 如下:


測試工具安裝

下面來談工具的安裝。

首先安裝 jsdom,這倒是很簡單:

$ npm install --save jsdom

接著安裝 ava,最好先全局安裝一遍:

$ npm install -g ava

$ npm install --save ava

然后為了方便使用 npm test 命令,執(zhí)行下面的命令:

$ ava --init

這一行的目的是將 ava 命令放到你的 package.json 中的 scripts 字段中,方便之后使用 npm test 直接開啟跑測試。當(dāng)然你也可以不管這一步,我就比較喜歡自己敲 ava xx.js 這樣子。

編寫測試

好了,環(huán)境安裝完畢。下面來看腳本。

import fs from "fs";

import { jsdom } from "jsdom";

import test from "ava";

ava 在運(yùn)行時會通過 babel 6 對測試腳本進(jìn)行編譯,因此完全可以自由發(fā)揮,generator、async & await 什么的都盡情地用吧。而且作者也是建議和支持這樣做的,簡單明了的測試腳本,重要性有時候可能和測試本身一樣重要。

引入 fs 是為了讀取我們的 html 文件。

關(guān)于 jsdom 的用法,更多的可以參考 https://github.com/tmpvar/jsdom,看項(xiàng)目的文檔。這里我使用的是簡單易懂的 require("jsdom").jsdom 形式,便于以同步的形式解析生成我們需要的 window 對象,如下:

var window = jsdom(fs.readFileSync("./test.html")).defaultView;

一個挺好用的方法是 jsdom.jQueryify,能向頁面注入 jQuery。不過這是個異步的方法(廢話),所以這里我使用了 Promise,也是為了方便之后使用 async & await 語法。

function jsdomTest() {
    return new Promise(function (resolve, reject) { 
        jsdom.jQueryify(window, "http://apps.bdimg.com/libs/jquery/2.1.4/jquery.js", function () {
            resolve(window.jQuery);
        });
    });
}

ava 的測試用例寫起來也挺簡單,來看代碼:

test("點(diǎn)擊測試", async t => {
    var $ = await jsdomTest();

    var $div = $("#div");

    var colorBeforeClick, colorAfterClick;

    console.log(colorBeforeClick = $div.css("background-color"));

    $div.trigger("click");

    console.log(colorAfterClick = $div.css("background-color"));
    
    t.not(colorBeforeClick, colorAfterClick, "bgColor changed");
});

test 的第一個參數(shù)是測試用例的名稱,第二個參數(shù)是一個函數(shù),該函數(shù)會注入 t 對象。我們所有的斷言都是通過這個注入的 t 進(jìn)行的。

友情提示:ava 的文檔地址,https://github.com/avajs/ava,也有中文版,但是沒更新同步,所以建議還是看英文,否則用了一些過時的 API,以后升級之后追悔莫及。

來說上面的代碼。首先我們使用的是 async & await 語法,整個看起來比回調(diào)函數(shù)嵌套要整潔許多,整個流程看起來也相對清楚。

第一步是先等待 jQuery 注入成功,拿到 $。其實(shí)這一步可有可無,我純粹是為了測試 jsdom API,并且懶得手動寫 dispatch 事件的代碼才這么干的。

接下來就開始 DOM 查詢,然后先獲取 div 當(dāng)前的背景色并打印出來。接著手動觸發(fā) click 事件,然后再次獲取 div 的背景色并打印。最后將觸發(fā)點(diǎn)擊前后的兩個顏色值拿來對比。

依葫蘆畫瓢,差不多就這么搞定了。

打開命令行,進(jìn)入工作目錄,然后開始測試:

$  ava -v parallel.js

相信我,-v 參數(shù)可以讓你的命令行界面顯得比較安靜一些。

如果你想要使用 npm test 這樣的命令來測試,請進(jìn)一步閱讀文檔進(jìn)行相關(guān)配置(將上面的 ava 換成 nom test是沒用的哦)。這里主要還是為了簡便。

友情提示

友情提示第二波:會不會懷疑,觸發(fā)點(diǎn)擊事件之后,顏色立馬就變了?不存在延遲、異步么?答案是 yes,真的不存在。假如你和我一樣在這里猶豫了,那么說明存在這樣兩種可能性:

js 基礎(chǔ)不夠牢,對相關(guān)機(jī)制的了解還不透徹

你被各種異步玩怕了(hybrid / RN 后遺癥 )

當(dāng)時為了應(yīng)對“潛在的異步”(啊我想到了迫害狂想癥),我特意做了幾百毫秒的 setTimeout 延時。結(jié)果呢,斷言的謂詞(not、same、notSame等等)各種正向、反向都試了一遍,測試永遠(yuǎn)通過。什么鬼?說好的良好的異步支持呢?后來再去看文檔,發(fā)現(xiàn)人家寫得清清楚楚:

You must define all tests synchronously. They can"t be defined inside setTimeout, setImmediate, etc.
所有測試必須同步定義。不能放在 setTimeout、setImmediate 等方法里面。

所以,真的,認(rèn)真讀文檔是很有必要的。

真正遇到要延時的,怎么辦?我想,Promise 會解救你的。

并行與串行

ava 聲稱是很高效的。通常情況下,同一個文件里測試都是并行的,并不一定按照順序執(zhí)行。

還以上面的代碼為例。為了測試一下,我選擇了投機(jī)取巧。不是并行嗎?那我就檢測 jQuery 存不存在就不行了嗎?因?yàn)槲覀兊?test 中,是異步加載 jQuery 的。所以如果測試是并行的,那么不一定能夠檢測到 window.$ 的存在。

所以就有了 parallel.js 這個文件。添加的測試用例如下:

test("串行測試", function (t) {
    console.log(window.$)
    t.true(!!window.$, "串行失敗");
});

可是,如果我就要串行呢?

還好作者也想到了這種情況。將所有的 test 改成 test.serial 即可(見 serial.js)。

需要說明的是,所謂的串行執(zhí)行,只是在同一個測試文件中存在,同時測試多個文件的時候,就總體而言仍然是并行的。

結(jié)尾

ava 還有很多的用法和需要注意的地方。最好的辦法還是看文檔,然后自己寫 demo,反復(fù)領(lǐng)會,并應(yīng)用在實(shí)際業(yè)務(wù)中。

上面提到的內(nèi)容,可能有不少錯誤。希望懂行的大神們能夠提出來。

突然想到古人說,“茍日新,又日新,日日新”。

雖然經(jīng)過今人考證,這也許只是類似甲骨文的祭祀記錄的誤讀。但幾千年來,這種“新”的精神始終在。

程序世界里,變化更是無時不在。今天的工具,明天也許就會被淘汰。

其實(shí)說到底,能夠解決需求,能夠方便高效使用的,才是最好的。

向做出這些工具的大神們致敬。

更新 a 標(biāo)簽點(diǎn)擊事件的坑

a 標(biāo)簽的點(diǎn)擊事件用了事件代理,然后通過手動觸發(fā)無效。

經(jīng)測試,在瀏覽器也有這種問題。

解決辦法是直接使用 $("a")[0].click(),原生的 click 方法比較靠譜。

參考: http://stackoverflow.com/questions/773639/how-can-i-simulate-an-anchor-click-via-jquery

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

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

相關(guān)文章

  • 使用 AVA 自動化測試

    摘要:單元測試,測試一個簡單的組件。接口測試,用戶信息接口測試。學(xué)習(xí)借鑒,一些使用做測試的開源項(xiàng)目。這里使用到的內(nèi)置斷言斷言結(jié)果值等于我們想要的預(yù)期值,則測試通過。在里放入一個函數(shù),函數(shù)自動執(zhí)行,里面執(zhí)行的結(jié)果必須拋出錯誤,則測試通過。 目錄 1、為什么選擇 AVA ?2、API 概覽。3、準(zhǔn)備工作。4、單元測試,測試一個簡單的工具函數(shù)。5、使用 Promise、Async/await、Ob...

    Cruise_Chan 評論0 收藏0
  • FCC成都社區(qū)·前端周刊 第 1 期

    摘要:詳情在線是一個簡單的在線詳情一套前端架構(gòu)庫說不上快速,但其集成了自定義元素可觀察對象路由等,是一款輕量級的庫。和等都有使用它。詳情這是一本涵蓋和內(nèi)容的新書,可在線閱讀或付費(fèi)下載電子書。 01. 2018 JavaScript 測試概覽 文章介紹了JavaScript測試的關(guān)鍵術(shù)語、測試類型、工具和方法,并簡要分析了工具jsdom、Istanbul、Karma、Chai、Wallaby等...

    source 評論0 收藏0
  • FCC成都社區(qū)·前端周刊 第 1 期

    摘要:詳情在線是一個簡單的在線詳情一套前端架構(gòu)庫說不上快速,但其集成了自定義元素可觀察對象路由等,是一款輕量級的庫。和等都有使用它。詳情這是一本涵蓋和內(nèi)容的新書,可在線閱讀或付費(fèi)下載電子書。 01. 2018 JavaScript 測試概覽 文章介紹了JavaScript測試的關(guān)鍵術(shù)語、測試類型、工具和方法,并簡要分析了工具jsdom、Istanbul、Karma、Chai、Wallaby等...

    keithyau 評論0 收藏0
  • FCC成都社區(qū)·前端周刊 第 1 期

    摘要:詳情在線是一個簡單的在線詳情一套前端架構(gòu)庫說不上快速,但其集成了自定義元素可觀察對象路由等,是一款輕量級的庫。和等都有使用它。詳情這是一本涵蓋和內(nèi)容的新書,可在線閱讀或付費(fèi)下載電子書。 01. 2018 JavaScript 測試概覽 文章介紹了JavaScript測試的關(guān)鍵術(shù)語、測試類型、工具和方法,并簡要分析了工具jsdom、Istanbul、Karma、Chai、Wallaby等...

    elva 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<