最近报了一个前端进阶班,专注进行前端技能提升,第一课老师就要求预习mocha and should .js
what?一万个懵逼这是啥万一,搜索了一下mocha+should.js就是传说中的BDD测试框架,一直认为前端只要写好前端代码就好了,老师说大厂对前端有会写单元测试代码要求的,好的,老师说啥都对。
首先呢,什么是BDD,什么是TDD呢?
BDD:Behavior Driven Development,行为驱动开发是一种敏捷软件开发的技术,它鼓励软件项目中的开发这,QA和非技术人员之间的协作。
TDD:Test-Driven Development,就是测试驱动开发,它是一种测试先于编写代码的思想用于指导软件开发,测试驱动开发是敏捷开发中的一项核心时间和技术,也是一种设计方法论,TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码
对于测试,我一直认为是用于验证developer的代码是否符合需求,稍微了解TDD,BDD之后才发现,测试不仅仅是对于代码的验证,找出几个bug,更是一种约束一种规范,是与项目需求息息相关的
好了,废话 不多说直接来聊一聊mocha和should.js
啥是mocha呢?
Mocha是在Node.js和浏览器上运行的功能丰富的JavaScript测试框架,使异步测试变得简单而有趣。mocha测试串行运行,允许灵活准确的报告,同时将未捕获的异常映射到正确的测试用例
其实mocha就是一个工具,首先我们需要命令行安装它,先创建一个test包
在test包里进行mocha的安装
npm install mocha
这样我们mocha就安装OK了
第二步就是测试脚本的写法
mocha的作用就是运行测试脚本,首先必须学会写测试脚本,所谓‘测试脚本’,就是用来测试源码的脚本
首先我们可以先写一个数字相加的需求,创建一个add.js
现在呢我们源码就写好了, 接下来要做的就是测试这个相加函数是不是正确,这时候就要写测试脚本,通常,测试脚本与所要测试的源码脚本同名,但是后缀名为 .test.js(表示测试)或者.spec.js(表示规格)
好,我们现在创建测试add函数的脚本,我们命名就叫add.test.js
然后里面打入这些验证代码
上面这代码呢,就是测试脚本吗,它可以独立执行,测试脚本里应该包含一个或多个describe块,每个describe块应该包括一个或多个it块
describe块称为‘测试套件“,表示一组相关的测试,它是一个函数,第一个参数是测试套件的名称(‘加法函数的测试”),第二个参数是一个实际执行的函数
it块称为‘测试用例‘,表示一个单独的测试,是测试的最小单位,也是一个函数,第一个参数是测试用例的名称(“1加1应该等于2”),第二个参数是一个实际执行的函数
运行测试
我们测试脚本写好了如何运行呢?
正常的呢,如果我们对于package.json里配置没有做任何修改呢,就按照官方的回到终端,进行命令运行
这样,对应的log就会答应出来
当然也可以配置,在package.json里进行配置。如图
加这么一句话,就OK了,接下来,我们直接在终端里输入mocha 回车,就可以直接运行测试了
断言测试
大家应该看到代码里有一句话是add(1,1).to.be.equal(2)
所谓断言,就是判断源码的实际执行结果与预期结果是否一直,如果不一致就抛出一个错误
所有的测试用例(it块)都应该含有一句或多句的断言,它是编写测试用例的关键,断言功能由断言库来实现,mocha本身不带断言库,所以我们需要引入断言库,上面用的是chai断言库,并且指定了它的expect断言风格,expect断言的优点是很接近自然语言,因为是看的阮一峰的git学写的,但是现在比较流行的应该是node的assert,是杨文坚老师推荐的,如下,有个对比
配置文件mocha.opts
MOcha允许在test目录下面,放置配置文件mocha.opts,把命令行参数写在里面。具体的可以查看官网,比如一个demo里mocha.opts文件里就一行代码
可以查看官网
就不多说啦
异步测试
mocha默认每个测试用例最多执行2000毫秒,如果到时没有得到结果,就报错,对于涉及异步操作的测试用例,这个时间往往是不够的,需要用-t或--timeout参数指定超时门槛
我们可以看一下阮一峰老师的demo
上面的测试用例,需要4000毫秒之后才有运行结果 ,所以需要-t或--timeout参数,改变默认的超时设置
上面命令将测试的超时时限指定为5000毫秒
另外,上面的测试用例里面,有一个done函数,it块执行的时候,传入一个done参数,当测试结束的时候,必须显式调用这个函数,告知macha测试结束了,否则,mocha就无法知道,测试是否结束,会一直等到超时报错。
而且呢,mocha内置对promise的支持,允许直接返回promise,等到它的状态改变,再执行断言,而不用显示调用done方法
。。。
测试用例也有一些对应的钩子
我上面好多举例的都是阮一峰老师的demo,我把他的git地址给大家
https://github.com/ruanyf/mocha-demos.git
只要把里面demo都跑一遍其实就差不多,当然老师用的是chai断言库和expect断言风格,可以尝试尝试node 的assert和should.js,都差不多
好啦,今天就结束啦!下面是我的git地址,大家可以一起互粉哦
https://github.com/Aimi-Ding