最近软件测试课上需要我们介绍一个测试工具,因为我沉迷node,所以只好拿出这一套幸福感爆棚的测试框架了,Mocha & Chai。
Mocha
简介
Mocha是一个能够运行在Node和浏览器中的多功能的JavaScript测试框架。作为一个测试框架,最主要的工作是提供了丰富的测试报告模块帮助问题的分析定位,并且对断言模块进行了更方便的分类封装。所以Mocha是能够很轻松的调用selenium webdriver之类的测试工具的。
开始
describe('example 1', function () {
it('1加1等于2', function () {
expect(add(1, 1)).to.be.equal(3);
})
});
这里是一个很简单的小例子,是对加法进行单元测试。
describe
是测试套件,表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称,第二个参数是一个实际执行的函数。主要是用 describe
来对代码进行分块。在保留字中有它的同功能关键字 context
。
it
是测试用例,表示一个单独的测试,是测试的最小单元。在一个 describe
中可以包含多个 it
。并且如果 it
中包含多个断言,第一个断言出现错误时,后面的将不会执行。在保留字中有它的同功能关键字 specify
。
这里主要记录一些我觉得比较有意思的部分,对于Mocha的系统讲解就不赘述,有兴趣的可以看看Mocha.js官方文档翻译 —— 简单、灵活、有趣 和 测试框架 Mocha 实例教程。
测试状态
测试结果主要分为3种状态,成功、失败、挂起。这里主要说一下挂起,挂起有可能是因为没有传入回调函数的测试用例,即 it
中没有传入回调函数。还有一种可能是没有设置超时检查的超时函数,所以我们需要考虑超时测试。
超时测试可以在套件级设置,也可以在用例级设置和钩子级设置。
// 在套件级设置,只要用例级没有覆盖则整个套件有效
describe('example 1', function () {
this.timeout(500);
it('不超过500ms', function(done) {
setTimeOut(done, 300);
})
});
// 在用例级设置
describe('example 2', function () {
it('不超过500ms', function(done) {
this.timeout(500);
setTimeOut(done, 300);
})
})
// 在钩子级设置
describe('example 3', function () {
beforeEach(function(done) {
this.timeout(3000);
setTimeout(done, 2500)
})
})
异步测试
因为是基于nodejs的框架,所以异步是在所难免的。但是同样可以promise来优雅的将异步处理为同步了。
const assert = require('assert')
it('应该结束这个测试用例', function (done) {
return new Promise(function (resolve) {
assert.ok(true)
resolve()
})
})
定制测试方案
在测试程序当中,可能会因为测试方案的改变,需要对某一些测试套件进行测试,而有一些套件不需要测试。这时候Mocha就提供了定制的功能。
- 独占模式(describe.only / it.only):设置后仅会运行独占的测试套件或者用例。
- 跳过测试(describe.skip / it.skip):设置后会跳过相应的测试套件或用例。
- 重试测试(this.retries(4)):可以通过这种方法把失败的测试重新运行几次,设置方法与超时测试类似,可以在套件或者用例中设置。但是这个特性被设计用于资源(数据)不容易被仿造的端到端测试,不推荐单元测试。
测试报告
测试报告是测试过程当中非常重要的产物。Mocha提供了很多有趣的测试报告,设置测试报告的方法是:
$ mocha test.js --reporter landing
--reporter
后面填写测试报告模板的名字,这里推荐一下landing和默认的SPEC,当然接下来要介绍的就是效果更好的网页测试报告。
首先需要安装 mochawesome
,然后使用就行。
$ npm install --save mochawesome
$ mocha test.js --reporter mochawesome
会在该文档中新建mochawesome-reports文档,里面就是报告。
配置文件
通过配置文件,可以简化我们的命令。比如我们在mocha.opts中添加:
--reporter tap
--recursive
--growl
然后在运行 $ mocha
,就相当于我们运行:
$ mocha --recursive --reporter tap --growl
如果测试用例不是在当前目录,可以在配置文件前写文档名。
file
--reporter tap
--recursive
--growl
Chai
Mocha作为测试框架可以使用多种断言库,这里我选用了Chai。chai.js支持BDD风格的expect/should API以及TDD风格的Assert API。但是should断言是不支持IE的并且稳定性也没有expect好,所以更推荐使用expect断言。
对于API的解释可以查看Chai.js断言库API中文文档