前端單元測試

前端單元測試是什么?

單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證又官。對于單元測試中單元的含義漫试,一般來說,要根據(jù)實際情況去判定其具體含義驾荣,如 C 語言中單元指一個函數(shù),Java 里單元指一個類审编,圖形化的軟件中可以指一個窗口或一個菜單等∨猷遥總的來說伤溉,單元就是人為規(guī)定的最小的被測功能模塊。單元測試是在軟件開發(fā)過程中要進行的最低級別的測試活動板祝,軟件的獨立單元將在與程序的其他部分相隔離的情況下進行測試走净。——百度百科

認為前端代碼都運行在瀏覽器里伏伯,如何做單元測試?炸枣!對于 Javascript 來講弄唧,當然是可以進行單元測試的,并且也通常是針對函數(shù)侯养、模塊澄干、對象進行測試。前端單元測試狂階也有不少辩稽,比如 QUnit从媚、SinonMocha 等等,單元測試的執(zhí)行環(huán)境可以是我們?nèi)粘J褂玫臑g覽器 ie并级、Chrome 等侮腹,也可以是無界面瀏覽器比如 PhantomJSHeadless Chrome愈涩。
在前端的世界里加矛,至少需要三類工具來進行單元測試:

  • 測試管理工具

測試管理工具是用來組織和運行整個測試的工具,它能夠?qū)y試框架毁腿、斷言庫苛茂、測試瀏覽器、測試代碼和被測試代碼組織起來胯究,并運行被測試代碼進行測試躁绸。我們經(jīng)常使用Karma

  • 測試框架

測是框架是單元測試的核心,它提供了單元測試所需的各種 API净刮,你可以使用它們來對你的代碼進行單元測試庭瑰。我們使用Mocha

  • 斷言庫

斷言庫提供了用于描述你的具體測試的 API抢埋,有了它們你的測試代碼便能簡單直接,也更為語義化揪垄,理想狀態(tài)下你甚至可以讓非開發(fā)人員來撰寫單元測試饥努。我們使用sinon-chai

可選工具包括:

  • 測試瀏覽器

這個比較好理解,就是測試代碼所執(zhí)行的瀏覽器環(huán)境酷愧。我們使用 PhantomJS 或者Headless Chrome

  • 測試覆蓋率統(tǒng)計工具

我們使用和 Karma 配套的Karma-coverage

Vue 工程的單元測試如何做?

下面著重講解 Vue 工程如何進行自動化的單元測試。本文講解的是使用 Vue-cli 或者 bfe-cli 創(chuàng)建的工程如何使用乍迄。測試工具默認使用了上文的推薦工具。
首先在 /test/unit/specs/ 文件夾中增加一個測試案例文件褥伴,命名為 < 模塊名稱 >.spec.js漾狼。框架代碼會自動掃描以.spec.js 結(jié)尾的文件當做測試案例進行執(zhí)行似踱。
假設(shè)我們有一個這樣的組件MyComponent.vue:

<template>
  <span class="message">{{message}}</span>
  <span class="message2">{{message2}}</span>
</template>

<script>
  export default {props: ['message2'],
    data () {
      return {message: 'hello!'}
    },
    created () {this.message = 'bye!'}
  }
</script>

這個組件有輸入?yún)?shù) message2志衣、有方法、有輸出狞洋,麻雀雖小五臟俱全绿店,如何做單元測試呢?

// 導(dǎo)入工具方法
import {createTest, destroyVM} from '../util';
import MyComponent from 'path/to/MyComponent.vue'

describe('MyComponment', () => {
  let vm = null;
  // 每個案例執(zhí)行完成后銷毀組件實例
  afterEach(() => {destroyVM(vm);
  });
  // 第一個案例借嗽,檢查組件是否有 created 方法,has a created 是案例名稱
  it('has a created', () => {expect(typeof MyComponent.created).toBe('function');
  })
  // 檢查 data 設(shè)置是否正確
  it('sets the correct default data' () => {expect(typeof MyComponent.data).toBe('function')
    const defaultData = MyComponent.data()
    expect(defaultData.message).toBe('hello!')
  })
  // 檢查渲染后的組件狀態(tài)
  it('renders the correct message', () => {vm = createTest(MyComponent);
    expect(vm.$el.querySelector('.message').textContent).to.equal('bye!')
  })
  // 檢查傳參是否正確
  it('renders correctly with different props', () => {
    vm = createTest(MyComponent, {message2: 'test1'});
    expect(vm.$el.querySelector('.message2').textContent).to.equal('test1')
  })
})

測試案例寫好了恶导,接下來我們來執(zhí)行一下

$ npm run test

... 省略啟動信息...

  MyComponment.vue
    ? has a created
    ? sets the correct default data
    ? renders the correct message
    ? renders correctly with different props

PhantomJS 2.1.1 (Linux 0.0.0): Executed 4 of 4 SUCCESS (0.193 secs / 0.058 secs)
TOTAL: 4 SUCCESS

從結(jié)果可以看出浸须,一共 4 個案例,成功執(zhí)行 4 個裂垦,測試案例是使用 PhantomJS 無頭瀏覽器執(zhí)行的肌索。同時,在 /test/unit/coverage/lcov-report/ 文件夾下可以找到測試報告晕换,里面有詳細的代碼覆蓋率情況,可以明確的看出哪些代碼沒有被測試到届巩。下圖為 bfe-ui 的測試報告。
[圖片上傳中...(image-504899-1542697571870-0)]

結(jié)合 Gitlab-CI 可以在工程每一次提交代碼時進行一次單元測試腕唧,將所有案例自動執(zhí)行一遍瘾英,并且給出測試報告,并將執(zhí)行結(jié)果可視化的反饋在流水線上但惶。

以上就是關(guān)于 Vue 工程如何做單元測試的全部內(nèi)容湿蛔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阳啥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子察迟,更是在濱河造成了極大的恐慌,老刑警劉巖所踊,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秕岛,死亡現(xiàn)場離奇詭異误证,居然都是意外死亡,警方通過查閱死者的電腦和手機惋增,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門改鲫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稽亏,你說我怎么就攤上這事缕题。” “怎么了瘪松?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵锨阿,是天一觀的道長。 經(jīng)常有香客問我壳嚎,道長末早,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任郑趁,我火速辦了婚禮样屠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悦穿。我一直安慰自己业踢,他們只是感情好,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布瞬沦。 她就那樣靜靜地躺著雇锡,像睡著了一般锰提。 火紅的嫁衣襯著肌膚如雪芳悲。 梳的紋絲不亂的頭發(fā)上边坤,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音肮韧,去河邊找鬼旺订。 笑死,一個胖子當著我的面吹牛桩蓉,可吹牛的內(nèi)容都是我干的劳闹。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼业汰,長吁一口氣:“原來是場噩夢啊……” “哼菩颖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晦闰,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤呻右,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后眉撵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體落塑,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了龙考。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟆肆。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡错蝴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颓芭,到底是詐尸還是另有隱情,我是刑警寧澤柬赐,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布亡问,位于F島的核電站,受9級特大地震影響肛宋,放射性物質(zhì)發(fā)生泄漏州藕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一酝陈、第九天 我趴在偏房一處隱蔽的房頂上張望床玻。 院中可真熱鬧,春花似錦锈死、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喇勋,卻和暖如春缨该,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背川背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工贰拿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熄云。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓膨更,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缴允。 傳聞我的和親對象是個殘疾皇子询一,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

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

  • 利用Karma進行前端單元測試 單元測試在程序開發(fā)過程中,起到很重要的作用癌椿。一般來說健蕊,單元測試的作用有: 使代碼可...
    wavesnow閱讀 3,473評論 0 6
  • 一直很想做單元測試,也在嘗試著開始寫踢俄,但是由于項目采用vue書寫缩功,一是開始寫項目的時候沒有編寫單元測試的意識,導(dǎo)致...
    liajoy閱讀 1,962評論 0 3
  • 簡介 Jasmine是一個behavior-driven development ( 行為驅(qū)動開發(fā) ) 測試框架,...
    菲汐閱讀 4,601評論 0 11
  • 前言 本篇文章是我在學(xué)習(xí)前端自動化單元測試時的一些思路整理都办,之前也從未接觸過單元測試相關(guān)工具嫡锌,如有錯漏虑稼,請讀者斧正...
    Awey閱讀 12,648評論 8 37
  • TL;DR——什么是好的單元測試? 其實我是個標題黨势木,單元測試根本沒有“藝術(shù)”可言蛛倦。 好的測試來自于好的代碼,如果...
    ThoughtWorks閱讀 3,159評論 1 22