测试笔记 (五) 测试覆盖率 (Istanbul)

阅读4894评论2

一,简介

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文件夹

_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%.

本文测试样例: 下载地址

2条评论添加新评论
JackJack2016.3.11 2:51

Hello China

Long Time *Long Time *2016.8.1 3:14

test