Jest 單元測(cè)試入門(mén)以及在vue 項(xiàng)目中的使用

之前在網(wǎng)上看了很多關(guān)于jest的文章络拌,看的雨里霧里俭驮,看不懂,于是自己搜集了一些文章,結(jié)合了自己的理解混萝,寫(xiě)了這篇文章遗遵,除了能記錄下自己的學(xué)習(xí)過(guò)程,也希望能幫助一些需要的人逸嘀。

首先先從jest單元測(cè)試入門(mén)開(kāi)始說(shuō)起车要。

一、Jest是什么

Jest 是用來(lái)創(chuàng)建崭倘、執(zhí)行和構(gòu)建測(cè)試用例的一個(gè) JavaScript 測(cè)試庫(kù)翼岁。你可以在任何項(xiàng)目中以 npm 包的形式,安裝并使用它司光。Jest 是當(dāng)前最受歡迎的測(cè)試執(zhí)行器琅坡,并且是在創(chuàng)建 React App 時(shí)的默認(rèn)選項(xiàng)。

二残家、測(cè)試流程

一個(gè)典型的測(cè)試流程如下:

1. 引入要測(cè)試的函數(shù)

2. 給函數(shù)一個(gè)輸入

3. 定義預(yù)期輸出

4. 檢查函數(shù)是否返回了預(yù)期的輸出結(jié)果

所以我們要做的就是:輸入 —— 預(yù)期輸出 —— 驗(yàn)證結(jié)果

三袱衷、Jest起步

3.1 安裝

在桌面上新建一個(gè)文件夾

完成上面兩步之后卖氨,生成的文件夾中包含node_modules文件夾正塌,package.json文件道媚,yarn.lock文件。

打開(kāi)?package.json回窘,將執(zhí)行 Jest 的命令命名為“test”:

根目錄下新建?src文件夾诺擅,文件夾下面新建filterByTerm.js文件,里面的內(nèi)容如下:

然后在根目錄下新建?tests文件夾,
接下來(lái)在?tests?文件夾中創(chuàng)建一個(gè)文件?filterByTerm.spec.js啡直。你可能存在疑問(wèn)掀虎,為什么文件名中包含一個(gè)“.spec”?這其實(shí)是從 Ruby 借鑒而來(lái)的一種約定付枫,用于將文件標(biāo)記為特定功能的規(guī)范。

現(xiàn)在可以準(zhǔn)備寫(xiě)測(cè)試了驰怎。記住阐滩,測(cè)試是關(guān)于輸入函數(shù)預(yù)期結(jié)果的事情县忌。

首先掂榔,我們定義一個(gè)簡(jiǎn)單的輸入——一個(gè)包含對(duì)象成員的數(shù)組input = [ { id: 1, url:"https://www.url1.dev"}, { id: 2, url:"https://www.url2.dev"}, { id: 3, url:"https://www.link3.dev"} ];

再來(lái)定義我們的預(yù)期結(jié)果。比如症杏,我們的搜索項(xiàng)是“l(fā)ink”装获,期望的結(jié)果是一個(gè)僅包含一個(gè)對(duì)象成員的數(shù)組:output = [{ id: 3, url: "https://www.link3.dev" }];

現(xiàn)在可以寫(xiě)實(shí)際測(cè)試代碼了。我們要用到 Jest 的?expect?函數(shù)和?匹配器(matcher)?來(lái)檢查我們假想的(當(dāng)前是)函數(shù)調(diào)用時(shí)是否返回預(yù)期結(jié)果厉颤。

在 Jest 測(cè)試中穴豫,我們把測(cè)試函數(shù)包裝在?expect?里面,并且搭配?匹配器?(用來(lái)檢查輸入的 Jest 函數(shù))一起使用,來(lái)完成測(cè)試精肃。下面列出了完整測(cè)試代碼:

現(xiàn)在秤涩,運(yùn)行一波測(cè)試:

看到?jīng)],通過(guò)了司抱!

很棒筐眷。但是完了嗎?還沒(méi)习柠。怎樣讓函數(shù)再次調(diào)用失敗呢匀谣?接下里,我們用大寫(xiě)的搜索項(xiàng)調(diào)用下函數(shù):

執(zhí)行測(cè)試……嗯资溃,失敗了武翎。來(lái)吧,我們?cè)賮?lái)修復(fù)下肉拓。

filterByTerm?應(yīng)該也要把大寫(xiě)搜索項(xiàng)考慮進(jìn)去后频。也就是說(shuō),即使是搜索內(nèi)容是大寫(xiě)的暖途,也要以忽略大小寫(xiě)的形式返回對(duì)應(yīng)的匹配對(duì)象卑惜。

為了通過(guò)測(cè)試,我們需要稍微調(diào)整下?match?方法的正則表達(dá)式驻售,相較于直接使用 searchTerm露久,我們可以構(gòu)建一個(gè)不區(qū)分大小寫(xiě)的正則表達(dá)式。也就是說(shuō)欺栗,一個(gè)與字符串大小寫(xiě)無(wú)關(guān)的表達(dá)式毫痕。下面是完整測(cè)試代碼:

再次運(yùn)行下面的命令:

在此執(zhí)行,會(huì)看到通過(guò)了迟几。

下一節(jié)消请,我們要來(lái)看下另一個(gè)重要的測(cè)試話題:代碼覆蓋率

四类腮、代碼覆蓋率

現(xiàn)在假設(shè)我是你們公司新來(lái)的同事臊泰。我對(duì)測(cè)試一無(wú)所知,在不清楚我們開(kāi)發(fā)環(huán)境的情況下蚜枢,我在這個(gè)函數(shù)里加了一個(gè)?if 語(yǔ)句

我們?cè)?filterByTerm 里加了一行新代碼缸逃,但沒(méi)有被測(cè)試。除非我告訴你“這里有個(gè)新語(yǔ)句需要測(cè)試”厂抽,你是不會(huì)知道要測(cè)試什么的需频。幾乎不可能知道我們的代碼會(huì)走的所有路徑,因此需要一種工具來(lái)幫助我們發(fā)現(xiàn)這些盲點(diǎn)筷凤。

這種工具稱為代碼覆蓋率,它是我們工具箱里的一個(gè)強(qiáng)大工具昭殉。Jest 內(nèi)置了代碼覆蓋率工具,你可以激活它

打開(kāi)?package.json,將執(zhí)行 Jest 的命令命名為“test:coverage”:

執(zhí)行覆蓋率測(cè)試:

得到如下的結(jié)果:

這是對(duì)我們函數(shù)測(cè)試覆蓋率的一個(gè)很好的總結(jié)饲化。我們看見(jiàn)第 2莽鸭、3 行沒(méi)有覆蓋。現(xiàn)在來(lái)測(cè)試我新添加的 if 語(yǔ)句吃靠,來(lái)達(dá)到 100% 的代碼覆蓋率硫眨。

到這里jest入門(mén)就介紹完了,大家最關(guān)心的應(yīng)該是jest如何在vue項(xiàng)目中使用巢块,請(qǐng)往下看:

五礁阁、在vue 項(xiàng)目中的使用

首先為了演示,我會(huì)先創(chuàng)建一個(gè)新的vue項(xiàng)目

打開(kāi)新建的這個(gè)vue項(xiàng)目:

運(yùn)行完上面的命令之后族奢,會(huì)發(fā)現(xiàn)根目錄下面多了tests文件夾和?jest.config.js 文件姥闭,tests文件夾下面有一個(gè)unit文件夾,里面包含了example.spec.js文件

需要先安裝和配置 vue-jest 預(yù)處理器:

然后運(yùn)行下面的命令:

Mac電腦會(huì)報(bào)錯(cuò)vue-cli-service: command not found?

解決辦法是可以在package.json里面添加上依賴:

然后運(yùn)行下面的命令重新安裝依賴:

在生成的項(xiàng)目根目錄下越走,會(huì)有一個(gè)?jest.config.json?文件棚品,cli自動(dòng)生成所用的預(yù)設(shè)是@vue/cli-plugin-unit-jest。我們可以在這里對(duì)?jest?進(jìn)行個(gè)性化的配置廊敌。以下是一個(gè)配置文檔的例子铜跑。

注意看上面的注釋,每一行的作用都已經(jīng)標(biāo)注出來(lái)骡澈。

HelloWorld.vue文件的內(nèi)容如下:

example.spec.js文件的內(nèi)容如下:

然后運(yùn)行下面的命令:

得到如下結(jié)果:

附錄:

package.json文件的內(nèi)容如下:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锅纺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肋殴,更是在濱河造成了極大的恐慌囤锉,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件护锤,死亡現(xiàn)場(chǎng)離奇詭異官地,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)烙懦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)驱入,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人修陡,你說(shuō)我怎么就攤上這事】肾” “怎么了魄鸦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)癣朗。 經(jīng)常有香客問(wèn)我拾因,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任绢记,我火速辦了婚禮扁达,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蠢熄。我一直安慰自己跪解,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布签孔。 她就那樣靜靜地躺著叉讥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饥追。 梳的紋絲不亂的頭發(fā)上图仓,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音但绕,去河邊找鬼救崔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捏顺,可吹牛的內(nèi)容都是我干的六孵。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼草丧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狸臣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起昌执,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烛亦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后懂拾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體煤禽,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年岖赋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了檬果。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唐断,死狀恐怖选脊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脸甘,我是刑警寧澤恳啥,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站丹诀,受9級(jí)特大地震影響钝的,放射性物質(zhì)發(fā)生泄漏翁垂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一硝桩、第九天 我趴在偏房一處隱蔽的房頂上張望沿猜。 院中可真熱鬧,春花似錦碗脊、人聲如沸啼肩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疟游。三九已至,卻和暖如春痕支,著一層夾襖步出監(jiān)牢的瞬間颁虐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工卧须, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留另绩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓花嘶,卻偏偏與公主長(zhǎng)得像笋籽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椭员,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容