mocha 测试模块学习备忘

点击在我的博客 xuxusheng.com 中查看,有更好的排版哦~

2016-08-13 16:28 周六


上周学习了一下 jasmine 的用法,感觉理解和使用的不是非常好。

webpack 的 loader 模块写测试的时候,因为依赖了webpack的上下文和参数,写测试的时候不知道怎么样去mock,看了一下 css-loader 的测试模块,采用 mocha 写的,不太看得懂,于是决定再学习一下 mocha 的使用。

参考:

阮一峰大神的教程:
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html


初学测试模块,将一些觉得理解的不太好,或者容易忘记的部分记录下来,以便查阅。


一、

$ mocha

Mocha 默认运行 test 子目录里面的测试脚本。所以一般都会把测试脚本放在 test 目录里面,然后执行 mocha 就可以了。

Mocha 默认只会执行 test 子目录下面第一层的测试用例,不会执行更下层的用例,如果想要遍历所有的子文件夹,需要加上 --recursive 参数。


二、参数

  1. --reporter

--reporter 参数用来指定测试报告的格式,默认是 spec

  1. mochawesome

使用 mochawesome 模块,可以生成漂亮的 HTML 格式的模块。

$ npm install mochawesome -D
$ ../node_modules/.bin/mocha --reporter mochawesome

上面代码中,mocha命令使用了项目内安装的版本,也就是../node_modules/.bin/mocha这一段,而不是全局安装的版本,因为 mochawesome 模块是安装在项目内的。

这个 mochawesome 模块我用的时候生成的文件中css文件总是空的,页面没有样式,看这个模块依赖的是 mocha~2 的版本,但是我安装2也还是这样,坑爹。

  1. --watch , -w

--watch 用来监视指定的测试脚本

  1. --bail , -b

--bail 参数指定只要有一个测试用例没有通过,就停止执行后面的测试用例,这对持续集成很有用。

  1. --grep , -g

--grep 参数用户搜索测试用例的名称(即 it 块的第一个参数,然后只执行匹配的测试用例。

$ mocha --grep "1 加 1"
  1. --invert , -i

--invert 参数表示只运行不符合条件的测试脚本,必须与 --grep 参数配合使用,与上相反。

$ mocha --grep "1 加 1" --invert

三、

Mocha 允许在 test 目录下面,放置配置文件 mocha.opts ,把命令行参数写在里面。

$ mocha --recursive --reporter tap --growl

可以将此三个参数写入配置文件中

--reporter tap
--recursive
--growl

然后执行 mocha 即可

如果测试用例不是存放在test目录中,可以在配置文件中写入:

server-tests
--recursive

上面的代码指定运行 server-tests 目录及其子目录之中的测试脚本。


四、使用 es6 语法

这个是重点,要记住。

ES6转码,需要安装 Babel

$ npm install babel-core babel-preset-es2015 --save-dev

然后在项目目录下建一个 .babelrc 配置文件

{
  "presets": ["es2015"]
}

最后使用 --compilers 参数指定测试脚本的转码器。

$ ../node_modules/.bin/mocha --compilers js:babel-core/register

重点:

上面代码中,--compilers参数后面紧跟一个用冒号分隔的字符串,冒号左边是文件的后缀名,右边是用来处理这一类文件的模块名。

上面代码表示,在运行测试之之前,先用 babel-core/register 模块,处理一下 .js 文件。

由于这里的转码器安装在项目内,所有要使用项目内安装的 Mocha,也就是 ../node_modules/.bin/mocha,如果转码器安装在全局,就可以使用全局的Mocha。

注意:

注意,Babel默认不会对 Iterator、Generator、Promise、Map、Set 等全局对象,以及一些全局对象的方法(比如 Object.assign)转码。如果你想对这些对象转码,就要安装 babel-polyfill

$ npm install babel-polyfill --save

然后在脚本头部加上一行

import 'babel-polyfill'

五、异步测试

这个是个重点!!

Mocha 默认每个测试用例最多执行 2000 毫秒,如果没有得到结果,就报错。对于涉及异步操作的测试用例,这个时间往往是不够的,需要用 -t--timeout 参数指定超时门槛。

it('测试应该5000毫秒后结束', function(done) {
  var x = true;
  var f = function() {
    x = false;
    expect(x).to.be.not.ok;
    done(); // 通知Mocha测试结束
  };
  setTimeout(f, 4000);
});

上面的测试用例,需要 4000 毫秒之后,才会有运行结果,所以,需要用 -t--timeout 参数,改变默认的超时设置。

$ mocha -t 5000 timeout.test.js

上面的命令将测试的超时时限指定为 5000 毫秒。

另外,上面的测试用例里面,有一个 done 函数。it 块执行的时候,传入了一个 done 参数,当测试结束的时候,必须显示调用这个函数,告诉 Mocha 测试结束了。否则,Mocha 就无法知道,测试是否结束,会一直等到超时报错。

Mocha 默认会高亮显示超过 75 毫秒的测试用例,可以用 -s--slow 调整这个参数。

$ mocha -t 5000 -s 1000 timeout.test.js

上面命令指定高亮显示耗时超过 1000 毫秒的测试用例。

另一个例子:async.test.js

it('异步请求应该返回一个对象', function(done){
  request
    .get('https://api.github.com')
    .end(function(err, res){
      expect(res).to.be.an('object');
      done();
    });
});

这个需要安装 superagent 模块。

另外,Mocha 内置对 promise 的支持,允许直接返回 promise,等到它的状态改变,再执行断言,而不用显示的调用done方法

it('异步请求应该返回一个对象', function() {
  return fetch('https://api.github.com')
    .then(function(res) {
      return res.json();
    }).then(function(json) {
      expect(json).to.be.an('object');
    });
});

这个需要安装 node-fetch 模块


六、测试用例的钩子

Mocha 在 describe 块之中,提供测试用例的四个钩子:before(),after(),beforeEach()afterEach()。他们会在指定时间执行。

describe('hooks', function() {

  before(function() {
    // 在本区块的所有测试用例之前执行
  });

  after(function() {
    // 在本区块的所有测试用例之后执行
  });

  beforeEach(function() {
    // 在本区块的每个测试用例之前执行
  });

  afterEach(function() {
    // 在本区块的每个测试用例之后执行
  });

  // test cases
});

后面的都很重要,直接看原版教程吧。。。。

http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值