四、与测试框架的结合

实际开发时,istanbul 总是与测试框架结合使用,下面以常用的 Mocha 框架为例。

sqrt.js 是一个计算平方根的脚本。


 var My = {
   sqrt: function(x) {
     if (x < 0) throw new Error("负值没有平方根");
       return Math.exp(Math.log(x)/2);
     }
 };
 
 module.exports = My;

它的测试脚本 test.sqrt.js 放在 test 子目录。


 var chai = require("chai");
 var expect = chai.expect;
 var My = require("../sqrt.js");
 
 describe("sqrt", function() {
 
   it("4的平方根应该等于2", function() {
     expect(My.sqrt(4)).to.equal(2);
   });
 
   it("参数为负值时应该报错", function() {
     expect(function(){ My.sqrt(-1); }).to.throw("负值没有平方根");
   });
 
 });

然后,执行下面的命令得到代码覆盖率。

 $ istanbul cover _mocha
 // or
 $ istanbul cover _mocha test/test.sqrt.js
 
   sqrt
     ✓ 4的平方根应该等于2 
     ✓ 参数为负值时应该报错 
 
   2 passing (7ms)
 
 ===== Coverage summary =====
 Statements   : 100% ( 5/5 )
 Branches     : 100% ( 2/2 )
 Functions    : 100% ( 1/1 )
 Lines        : 100% ( 4/4 )
 =============================

上面命令中,istanbul cover 命令后面跟的是 _mocha 命令,前面的下划线是不能省略的。

因为,mocha 和 _mocha 是两个不同的命令,前者会新建一个进程执行测试,而后者是在当前进程(即 istanbul 所在的进程)执行测试,只有这样, istanbul 才会捕捉到覆盖率数据。其他测试框架也是如此,必须在同一个进程执行测试。

如果要向 mocha 传入参数,可以写成下面的样子。


 $ istanbul cover _mocha -- tests/test.sqrt.js -R spec


上面命令中,两根连词线后面的部分,都会被当作参数传入 Mocha 。如果不加那两根连词线,它们就会被当作 istanbul 的参数(参考链接12)。

如果想在浏览器运行 Istanbul ,可以参考这篇文章

文章导航