1, 测试覆盖率(Code coverage): 源代码被测试的比例称为代码覆盖率。它有四个测量维度.
行覆盖率(line coverage):是否每一行都执行了?
函数覆盖率(function coverage):是否每个函数都调用了?
分支覆盖率(branch coverage):是否每个if代码块都执行了?
语句覆盖率(statement coverage):是否每个语句都执行了?
2, Istanbul: JavaScript 程序的代码覆盖率工具.
更详细的介绍,请参考阮一峰大侠的文章:链接地址.
npm install -g istanbul //全局安装
我们以上一篇文章样例为基础,继续测试覆盖率.
项目里已经写好了mocha 测试,那运行istanbul命令,看看我们的测试覆盖率.
istanbul cover _mocha test //mocha测试文件在test文件夹
如图的示,共有5个测试用例全部通过,并列出了四个维度的覆盖率情况.
并在项目根目录生成了一个coverage文件夹,在浏览器打开里面的icov-report/index.html,可以查看测试文件哪些没有覆盖到.
使用配置文件:
istanbul可以用.istanbul.yml文件来配置选项,可以通过命令istanbul help config查看默认配置.
我们复制默认配置,在项目根目录下新建.istanbul.yml文件,并粘贴配置内容到文件.
//修改内容
dir: ./coverage
//改为
dir: ./test_coverage
再次运行istanbul cover _mocha test
发现加载了配置文件,并将报告输出到了test_coverage目录下了.
刚刚我们测试中有一项非常低
Branches : 70% ( 7/10 )
并在报告中发现有这样一段用黄色背景提示的代码:
使用istanbul 提供注释语法,忽略某些代码不计入覆盖率. 修改app.js如下:
var ip = ((/127\.0\.0\.1/).test(req.ip) ||/* istanbul ignore next */ req.ip === '::1')?/* istanbul ignore next */'210.75.225.254':req.ip;
再次运行istanbul cover _mocha test
,看看覆盖率变化:
=============================== Coverage summary ===============================
Statements : 93.33% ( 28/30 )
Branches : 90% ( 9/10 ), 2 ignored
Functions : 85.71% ( 6/7 )
Lines : 93.33% ( 28/30 )
================================================================================
Branches 达到了90%,并提示有2个忽略的分支.
接下来,我们完成没有覆盖到的测试,让测试率达到100%.增加测试如下:
//test/index.js
describe('/*', function() {
it('should return html',function (done) {
request.get('/testIndex')
.expect('Content-Type', /html/)
.expect(200)
.end(function (err,res) {
if (err) return done(err);
done();
});
});
});
//test/article.test.js
it('should return article list length three',function (done) {
var mockData = {'id':'10003','title':'中国人加油','content':'油加满了有点晃.'};
var stubdir = sinon.stub(fs, "readdirSync");
stubdir.returns(['10003.json','10004.json','10005.json']);
var stubfile = sinon.stub(fs,"readFileSync");
stubfile.returns(JSON.stringify(mockData));
request.get('/articleList')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200)
.end(function (err,res) {
if (err) return done(err);
stubdir.calledOnce.should.be.true();
stubfile.callCount.should.be.equal(3);
res.body.should.be.Array();
res.body.length.should.be.equal(3);
stubdir.restore();
stubfile.restore();
done();
});
});
再次运行istanbul cover _mocha test 看看结果:
=============================== Coverage summary ===============================
Statements : 100% ( 30/30 )
Branches : 100% ( 10/10 ), 2 ignored
Functions : 100% ( 7/7 )
Lines : 100% ( 30/30 )
================================================================================
perfect! 达到了100%.
本文测试样例: 下载地址
Hello China
test
测试
jj