vue组件单元测试

一开始我是打算把数据库的测试也准备写一篇,但是发现需要创建表格之间的关系,增删查改的过程比较繁杂又多,先把前端vue的测试给写了也给自己的知识点做个备份,学而不思则、思而不学现在就开始do it。

Karma

karma测试库是一个测试管理工具,可以帮你启动一个HTTP服务器运行你的代码文件,也可以通过其插件可以快速集成到各种环境中。例如:本地环境、持续集成环境。

  • karma安装
npm install karma-cli -g
npm install karma --save-dev
npm install karma-mocha --save-dev
npm install karma-chai --save-dev
  • 配置文件
    新建一个karma.conf.js文件粘贴以下内容,frameworks里面还包含sinon-chai是用来辅助测试的后面会讲到。
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是一个断言库, 有多种的断言风格,目前有shouldexpectassert
想熟悉语言的话推荐API中文文档里面有很多chai的用例
当然断言风格主要还是看个人的使用习惯,下面简单介绍一下expect它的断言使用语法

安装
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 是一个单元测试框架,就是一个用来写测试用例的运行测试工具

先导出一个加法模块 add.js

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

接下来写测试加法脚本 add.test.js,建议测试脚本和要执行的文件模块同名,
每一个 describe 描述模块相当于一个大厂房,而 it 里面信息比如成一个小机房,每个机房都有你将要执行的东西在里面。

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

describe('一个加法测试', function() {
  it('1 加 1 应该等于 2', function() {
    expect(add(1, 1)).to.be.equal(2);
  });
}); 


文件测试

  • 按钮组件 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>
  • 测试文件 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语法期待组件的存在
  })

  it('点击 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记录一个调用
    vm.$on('click', callback) // 监听回调
    vm.$el.click() // click执行
    expect(callback).to.have.been.called // 期待这个事件被调用
  })
})
  • npm run dev 最后执行结果, 这里错误的示范就不做记录了,看到的朋友自己花时间跑一次就知道坑在哪了~
...
√  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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容

  • 原文来自:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutor...
    神秘者007阅读 10,099评论 0 7
  • 前言 单元测试,简单来说就是技术人员的白盒测试(程序测试)。为了减少产品的开发周期时间以及后期的修复代价,逐渐要求...
    lincimy阅读 6,445评论 1 15
  • 最近做了一次关于vue组件自动化测试的分享,现在将vue组件单元测试环境搭建过程整理一下。这次搭建的测试环境和开发...
    MarxJiao阅读 23,671评论 30 50
  • 前言 本篇文章是我在学习前端自动化单元测试时的一些思路整理,之前也从未接触过单元测试相关工具,如有错漏,请读者斧正...
    Awey阅读 12,623评论 8 38
  • 最近朋友圈都在晒出国学习,比赛的,心里非常羡慕别人,可是总是不付出。总是呆在自己的领地,坐井观天。每天都在幻想,我...
    湉淼淼的restroom阅读 129评论 0 0