vue組件單元測(cè)試

一開始我是打算把數(shù)據(jù)庫(kù)的測(cè)試也準(zhǔn)備寫一篇剧劝,但是發(fā)現(xiàn)需要?jiǎng)?chuàng)建表格之間的關(guān)系雁芙,增刪查改的過(guò)程比較繁雜又多,先把前端vue的測(cè)試給寫了也給自己的知識(shí)點(diǎn)做個(gè)備份熬荆,學(xué)而不思則舟山、思而不學(xué)現(xiàn)在就開始do it。

Karma

karma測(cè)試庫(kù)是一個(gè)測(cè)試管理工具,可以幫你啟動(dòng)一個(gè)HTTP服務(wù)器運(yùn)行你的代碼文件捏顺,也可以通過(guò)其插件可以快速集成到各種環(huán)境中六孵。例如:本地環(huán)境、持續(xù)集成環(huán)境幅骄。

  • karma安裝
npm install karma-cli -g
npm install karma --save-dev
npm install karma-mocha --save-dev
npm install karma-chai --save-dev
  • 配置文件
    新建一個(gè)karma.conf.js文件粘貼以下內(nèi)容,frameworks里面還包含sinon-chai是用來(lái)輔助測(cè)試的后面會(huì)講到本今。
module.exports = function(config) {
  config.set({
    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: '',
    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['mocha', 'sinon-chai'],
    client: {
      chai: {
        includeStack: true
      }
    },

    // list of files / patterns to load in the browser
    files: ['dist/**/*.test.js', 'dist/**/*.test.css'],

    // list of files / patterns to exclude
    exclude: [],

    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: {},

    // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ['progress'],

    // web server port
    port: 9876,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_INFO,

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    browsers: ['ChromeHeadless'],

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false,

    // Concurrency level
    // how many browser should be started simultaneous
    concurrency: Infinity
  });
};
  • 命令
    package.json文件中添加需要的腳本
"scripts": {
    "dev-test": "parcel watch test/* --no-cache & karma start",
    "test": "parcel build test/* --no-cache --no-minify && karma start --single-run"
}


Chai

chai是一個(gè)斷言庫(kù)拆座, 有多種的斷言風(fēng)格,目前有should冠息、expectassert
想熟悉語(yǔ)言的話推薦API中文文檔里面有很多chai的用例
當(dāng)然斷言風(fēng)格主要還是看個(gè)人的使用習(xí)慣挪凑,下面簡(jiǎn)單介紹一下expect它的斷言使用語(yǔ)法

安裝
npm i -D chai
用例
// 相等或不相等
expect(1 + 2).to.be.equal(3);
expect(1 + 2).to.be.not.equal(4);
expect(foo).to.be.deep.equal({ bar: 'baz' });

// 布爾值為true
expect('everthing').to.be.ok;
expect(false).to.not.be.ok;

// typeof
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(foo).to.be.an.instanceof(Foo);

// include
expect([1,2,3]).to.include(2);
expect('foobar').to.contain('foo');
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');

// empty
expect([]).to.be.empty;
expect('').to.be.empty;
expect({}).to.be.empty;

// match
expect('foobar').to.match(/^foo/);


Mocha

Mocha 是一個(gè)單元測(cè)試框架,就是一個(gè)用來(lái)寫測(cè)試用例的運(yùn)行測(cè)試工具

先導(dǎo)出一個(gè)加法模塊 add.js

function add(x, y) {
   return x + y;
}
 
module.exports = add;

接下來(lái)寫測(cè)試加法腳本 add.test.js逛艰,建議測(cè)試腳本和要執(zhí)行的文件模塊同名躏碳,
每一個(gè) describe 描述模塊相當(dāng)于一個(gè)大廠房,而 it 里面信息比如成一個(gè)小機(jī)房散怖,每個(gè)機(jī)房都有你將要執(zhí)行的東西在里面菇绵。

var add = require('./add.js');
var expect = require('chai').expect;

describe('一個(gè)加法測(cè)試', function() {
  it('1 加 1 應(yīng)該等于 2', function() {
    expect(add(1, 1)).to.be.equal(2);
  });
}); 


文件測(cè)試

  • 按鈕組件 src/button.vue
<template>
  <button class="default" :class="color" @click="$emit('click');">
    <slot></slot>
  </button>
</template>

<script>
export default {
  props: {
    color: {
      type: String
    }
  }
};
</script>

<style scoped>
.default {
  cursor: pointer;
  width: 200px;
  height: 40px;
  line-height: 40px;
  border-width: 0px;
  border-radius: 4px;
  outline: none;
  font-family: Microsoft YaHei;
  color: black;
  font-size: 15px;
  background: #f8f8f8;
}
.blue {
  background: #1e90ff;
}
</style>
  • 添加組件 src/App.vue
<template>
  <div id="app">
    <test-button color="blue" @click="counter += 1;">Click me</test-button>
  </div>
</template>

<script>
import TestButton from "./button";

export default {
  name: "App",
  components: {
    TestButton
  }
};
</script>

<style></style>
  • 測(cè)試文件 test/button.test.js
const expect = chai.expect;
import Vue from 'vue'
import Button from '../src/button'

Vue.config.productionTip = false
Vue.config.devtools = false

describe('Button', () => {
  it('存在 button', () => {
    expect(Button).to.exist  // expect語(yǔ)法期待組件的存在
  })

  it('點(diǎn)擊 button', () => {
    const div = document.createElement('div')
    document.body.appendChild(div)
    const Constructor = Vue.extend(Button) // 使用button
    const vm = new Constructor({
      propsData: {
        color: 'blue',
      }
    }).$mount(div)
    const callback = sinon.fake(); // sinon記錄一個(gè)調(diào)用
    vm.$on('click', callback) // 監(jiān)聽(tīng)回調(diào)
    vm.$el.click() // click執(zhí)行
    expect(callback).to.have.been.called // 期待這個(gè)事件被調(diào)用
  })
})
  • npm run dev 最后執(zhí)行結(jié)果, 這里錯(cuò)誤的示范就不做記錄了,看到的朋友自己花時(shí)間跑一次就知道坑在哪了~
...
√  Built in 193ms.

dist\button.test.js         270.2  B    120ms
dist\button.test.map            0 KB     65ms
...
HeadlessChrome 0.0.0 (Windows 10 0.0.0): Executed 1 of 1  SUCCESS (0.016 secs / 0.008 secs)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镇眷,一起剝皮案震驚了整個(gè)濱河市咬最,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欠动,老刑警劉巖永乌,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異具伍,居然都是意外死亡翅雏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門人芽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)望几,“玉大人,你說(shuō)我怎么就攤上這事啼肩¢献保” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵祈坠,是天一觀的道長(zhǎng)害碾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)赦拘,這世上最難降的妖魔是什么慌随? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上阁猜,老公的妹妹穿的比我還像新娘丸逸。我一直安慰自己,他們只是感情好剃袍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布黄刚。 她就那樣靜靜地躺著,像睡著了一般民效。 火紅的嫁衣襯著肌膚如雪憔维。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天畏邢,我揣著相機(jī)與錄音业扒,去河邊找鬼。 笑死舒萎,一個(gè)胖子當(dāng)著我的面吹牛程储,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臂寝,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼章鲤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了交煞?” 一聲冷哼從身側(cè)響起咏窿,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎素征,沒(méi)想到半個(gè)月后集嵌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡御毅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年根欧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片端蛆。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凤粗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出今豆,到底是詐尸還是另有隱情嫌拣,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布呆躲,位于F島的核電站异逐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏插掂。R本人自食惡果不足惜灰瞻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一腥例、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酝润,春花似錦燎竖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至疏咐,卻和暖如春捐凭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凳鬓。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留患民,地道東北人缩举。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匹颤,于是被迫代替她去往敵國(guó)和親仅孩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 原文來(lái)自:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutor...
    神秘者007閱讀 10,099評(píng)論 0 7
  • 前言 單元測(cè)試印蓖,簡(jiǎn)單來(lái)說(shuō)就是技術(shù)人員的白盒測(cè)試(程序測(cè)試)辽慕。為了減少產(chǎn)品的開發(fā)周期時(shí)間以及后期的修復(fù)代價(jià),逐漸要求...
    lincimy閱讀 6,445評(píng)論 1 15
  • 最近做了一次關(guān)于vue組件自動(dòng)化測(cè)試的分享赦肃,現(xiàn)在將vue組件單元測(cè)試環(huán)境搭建過(guò)程整理一下溅蛉。這次搭建的測(cè)試環(huán)境和開發(fā)...
    MarxJiao閱讀 23,671評(píng)論 30 50
  • 前言 本篇文章是我在學(xué)習(xí)前端自動(dòng)化單元測(cè)試時(shí)的一些思路整理,之前也從未接觸過(guò)單元測(cè)試相關(guān)工具他宛,如有錯(cuò)漏船侧,請(qǐng)讀者斧正...
    Awey閱讀 12,621評(píng)論 8 38
  • 最近朋友圈都在曬出國(guó)學(xué)習(xí),比賽的厅各,心里非常羨慕別人镜撩,可是總是不付出《犹粒總是呆在自己的領(lǐng)地袁梗,坐井觀天。每天都在幻想憔古,我...
    湉淼淼的restroom閱讀 129評(píng)論 0 0