测试驱动开发(Test-Driven Development)是一种软件开发的思维和方法,我的理解是它是一种开发的循环,先写测试代码,再用最小的代码实现这个测试,再继续写测试代码,继续用最小的代码实现。当实现所有的测试用例,代码也就完成了。
最近也在实践Tdd开发,和之前先开发,再自测的方向不同,这次的开发顺序是, 文档--->测试用例--->代码--->测试通过--->下一个测试用例。这样做有以下优缺点:
总体来说,如果对一些基数设施的建设,比如基础组件等,需要长期维护的项目,Tdd的应用,还是利大于弊。
如果想应用Tdd的方法到前端的开发中,主要用到以下几个工具(工具的用法在后面介绍):
mocha 主要提供了describe的语法,用来描述测试用例,并且把执行测试后的结果清楚的返回到终端上。
官网:mochajs.org
github: github.com/mochajs/moc…
chai 主要提供了断言函数assert,用来断言和比较测试的结果和代码执行的结果。
官网:www.chaijs.com/
github: github.com/chaijs/chai
assert库方法文档: www.chaijs.com/api/assert/…
sinon 主要用来mock一些东西,比如可以用sinon mock一个假的函数,sinon也可以返回这个函数执行与否。
官网:sinonjs.org
github: github.com/sinonjs/
先npm init生成一个项目。 再执行以下安装语句:
npm install sinon moncha chai sinon-chai --save-dev
复制代码
建立一个test文件夹,可以把写测试用例的Js放在这个文件夹中, 为了可以方便执行单元测试,可以加一个npm scripts,在package.json的scripts中加入如下语句,表示使用mocha去执行test文件夹下的js测试:
"scripts":{
"test": "mocha test/**/*.js"
}
复制代码
在test中建立一个js文件,在文件的中引入这些工具,为了连接sinon 和 chai,要使用到sinon-chai
const chai = require("chai")
const sinon = require("sinon")
const sinonChai = require("sinon-chai")
chai.use(sinonChai)
const assert = chai.assert // 从chai中引出assert
复制代码
首先我们看一个简单的单元测试代码:
describe('测试navigateTo方法', ()=>{
it("new router后存在navigateTo方法", ()=>{
let newRouter = new VictRouter()
assert.isFunction(newRouter.navigateTo)
})
})
复制代码
直接在describe中加入多个it函数即可:
describe('测试navigateTo方法',()=>{
it(`new router 后存在navigateTo方法`, ()=> {
let newRouter = new VictRouter()
assert.isFunction(newRouter[key])
})
it(`navigateTo的入参类型必须为object`, ()=>{
let newRouter = new VictRouter()
let badFn = function() { throw new newRouter[navigateTo]('1111')}
assert.throws(badFn, 'this.commonDirectFn is not a function')
})
})
复制代码
npm run test之后可以执行所有的测试
在执行的代码中,特别在开始一些对入参的判断的代码,可以使用throw出错误,再用assert捕获这个错误,这样可以比较方便的测试入参是否符合预期。但是使用assert.throws的时候,要用一个函数包装要测试的代码:
it(`navigateTo的入参类型必须为object`, ()=>{
let newRouter = new VictRouter()
let badFn = function() { throw new newRouter[navigateTo]('1111')} // 这里用一个函数包装
assert.throws(badFn, 'this.commonDirectFn is not a function') // 再把包装后的函数传入throws
})
复制代码
如果需要模拟一个函数,可以用sinon去模拟,使用方法:sinon.fake(),并且课已通过这个sinon的called方法判断函数是否被执行。
let fn = sinon.fake() //生成一个模拟函数
assert(fn.called) //断言这个函数是否被执行
复制代码
本文只是对Tdd的一个简单介绍,适用于快速入门。mocha,chai,sinon的一些高级的用法,还需要通过实践去学习。 另,本文只是对但纯js的测试,react,vue和小程序都有他们自己的ui测试的方案。 想通过本文,让大家可以简单了解Tdd,并且学到一种新的思路去写代码。
原文转自:https://juejin.im/post/5d7710bae51d453bb13b66b0