实际开发时,istanbul 总是与测试框架结合使用,下面以常用的 [Mocha 框架](http://mochajs.github.io/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 是两个不同的命令](https://github.com/gotwarlost/istanbul/issues/44),前者会新建一个进程执行测试,而后者是在当前进程(即 istanbul 所在的进程)执行测试,只有这样, istanbul 才会捕捉到覆盖率数据。其他测试框架也是如此,必须在同一个进程执行测试。 如果要向 mocha 传入参数,可以写成下面的样子。 ~~~ $ istanbul cover _mocha -- tests/test.sqrt.js -R spec ~~~ 上面命令中,两根连词线后面的部分,都会被当作参数传入 Mocha 。如果不加那两根连词线,它们就会被当作 istanbul 的参数(参考链接[1](http://www.clock.co.uk/blog/npm-module-code-coverage-in-2-simple-steps),[2](http://www.vapidspace.com/coding/2014/10/29/code-coverage-metrics-with-mocha-and-istanbul/))。 如果想在浏览器运行 Istanbul ,可以参考[这篇文章](http://ariya.ofilabs.com/2013/12/code-coverage-of-mocha-tests-using-istanbul-and-karma.html)。