Js测试框架Mocha使用

2019-06-27  本文已影响0人  醉饮满天星

Mocha发信“摩卡”,是现在最流行的JavaScript测试框架之一。
测试框架:就是一套测试工具、解决方案,有自己的流程和规范。
除了Mocha以外,类似的测试框架还有Jasmine、Karma、Tape等,也很值得学习。

安装

在全局和工程里面安装mocha

npm install --save-dev mocha
npm install mocha -g

有时候mocha运行要依赖于项目node-modules里面的库,这时候使用

npx mocha ...

测试脚本写法

var expect = require('chai').expect;
describe('加法函数的测试', function() {
  it('1 加 1 应该等于 2', function() {
    expect(add(1, 1)).to.be.equal(2);
  });
});

describe块是一个测试套件(test suite),表示一组相关的测试;
it(test case)是一个测试用例。
一般测试文件命名为*.test.js

断言

用来断言结果和预期是否匹配,mocha本身没有断言,可以使用第三方断言库。
断言失败会抛出一个错误,只要不抛出错误,这个测试就通过。
chai的expect风格断言库很接近自然语言风格,例如:

// 相等或不相等
expect(4 + 5).to.be.equal(9);
expect(4 + 5).to.be.not.equal(10);
expect(foo).to.be.deep.equal({ bar: 'baz' });

// 布尔值为true
expect('everthing').to.be.ok;
expect(false).to.not.be.ok;

// typeof
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(foo).to.be.an.instanceof(Foo);

// include
expect([1,2,3]).to.include(2);
expect('foobar').to.contain('foo');
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');

// empty
expect([]).to.be.empty;
expect('').to.be.empty;
expect({}).to.be.empty;

// match
expect('foobar').to.match(/^foo/);

Mocha基本用法

命令

mocha --help
mocha 后面跟文件、路径(默认当前路径的test目录)
--watch 监视测试文件改动,有改动后重新运行测试。(vs可以先把改动写入缓存,保存后flush到工作区)
--grep 管道筛选
--recursive 递归子级目录文件

配置文件mocha.opts

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

server-tests
--recursive

这样每次运行会自动附件里面的参数。

ES6 测试

  1. 用babel编译。npm install babel-core babel-preset-es2015 --save-dev
  2. 运行测试。
//.babelrc
{
    "presents":[ "es2015" ]
}
mpx mocha --compilers js:babel-core/register

--compilers后面紧跟一个冒号分割的字符串,左边是文件后缀名,右边是处理这类文件模块名。
CoffeeScript也很有趣:
mocha --compilers coffee:coffee-script/register

注意,Babel默认不会对Iterator、Generator、Promise、Map、Set等全局对象,以及一些全局对象的方法(比如Object.assign)转码。如果你想要对这些对象转码,就要安装babel-polyfill。
npm install babel-polyfill --save
然后,在你的脚本头部加上一行:
npm install babel-polyfill --save

异步测试

mocha对异步测试通过情况分两种:

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

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

mocha对每个异步测试等待时间默认2000毫秒,如果2000之内done方法或者promise状态没有完成变化,则超时。可设置等待时间:
mocha -t 5000 timeout.test.js

测试用例钩子

describe('hooks', function() {

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

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

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

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

  // test cases
});

测试用例管理

有些测试用例是否运行,不需要注释,describe和it都可以用skip或者only。

it.only('1 加 1 应该等于 2', function() {
  expect(add(1, 1)).to.be.equal(2);
});

it('任何数加0应该等于自身', function() {
  expect(add(1, 0)).to.be.equal(1);
});

只要有it方法被调用,mocha只会执行only标记的方法。
mocha应该it方法是将执行函数入栈,经过筛选执行,而非立即执行。

上一篇 下一篇

猜你喜欢

热点阅读