先介绍一下什么是单元测试:
在计算机编程中,单元测试(英語:Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。 程序单元是应用的最小可测试部件。 在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
需要了解的三个概念:
- BDD(Behavior Driven Development):行为驱动开发,通过自然语言书写非程序员可读的测试用例扩展了测试驱动开发方法。
- TDD(Test Driven Development):测试驱动开发,根据产品经理写的需求,翻译成测试用例的驱动开发方法。
- Assert:断言,目的是为了标示与验证程序开发者预期的结果-当程序运行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止运行,并给出错误消息。
简单的例子,5个测试用例,测试button组件中的icon、loading、icon的左右位置、click点击事件:
//单元测试 chai库
import chai from 'chai'
import spies from 'chai-spies'
chai.use(spies)
const expect = chai.expect
// icon
{
const Constructor = Vue.extend(Button)
const vm = new Constructor({
propsData: {
icon: 'settings'
}
})
vm.$mount()
let useElement = vm.$el.querySelector('use')
//断言href等于#i-settings,一个输入等于一个输出,没有报错则测试通过
let href = useElement.getAttribute('xlink:href')
expect(href).to.equal('#i-settings')
vm.$el.remove()
vm.$destroy()
}
// loading
{
const Constructor = Vue.extend(Button)
const vm = new Constructor({
propsData: {
icon: 'settings',
loading: true
}
})
vm.$mount()
let useElement = vm.$el.querySelector('use')
let href = useElement.getAttribute('xlink:href')
expect(href).to.equal('#i-loading')
vm.$el.remove()
vm.$destroy()
}
// icon的前后顺序
{
const div = document.createElement('div')
document.body.appendChild(div)
const Constructor = Vue.extend(Button)
const vm = new Constructor({
propsData: {
icon: 'settings',
}
})
vm.$mount(div)
let svg = vm.$el.querySelector('svg')
let {order} = window.getComputedStyle(svg)
expect(order).to.equal('1')
vm.$el.remove()
vm.$destroy()
}
{
const div = document.createElement('div')
document.body.appendChild(div)
const Constructor = Vue.extend(Button)
const vm = new Constructor({
propsData: {
icon: 'settings',
iconPosition: 'right'
}
})
vm.$mount(div)
let svg = vm.$el.querySelector('svg')
let {order} = window.getComputedStyle(svg)
expect(order).to.equal('2')
vm.$el.remove()
vm.$destroy()
}
// button 点击事件
{
//mock
const Constructor = Vue.extend(Button)
const vm = new Constructor({
propsData: {
icon: 'settings',
}
})
vm.$mount()
//间谍函数,劫持真正的函数
let spy = chai.spy(() => {
})
vm.$on('click', spy)
// 希望这个函数被执行
let button = vm.$el
button.click()
expect(spy).to.have.been.called()
vm.$el.remove()
vm.$destroy()
}
当这5个测试用例中的断言全部没有报错并通过,即button组件单元测试完成。