Introduction
Grunt 是一个基于任务的JavaScript 世界的构建工具
Mocha 是具有丰富特性的 JavaScript 测试框架,可以运行在 Node.js 和浏览器中,使得异步测试更简单更有趣。Mocha 可以持续运行测试,支持灵活又准确的报告,当映射到未捕获异常时转到正确的测试示例。
Prerequisite
nodejs项目文件目录结构如下
├── config
├── controllers
├── models
├── lib
├── node_modules
├── test
├── tasks
│ ├── mochacli.js
│ ├── sonarRunner.js
│ └── mocha_istanbul.js
│── package.json
└── Gruntfile.js
test 文件夹存放所有的单元测试*.js 文件
tasks 文件夹放的是一些给grunt 执行的task 文件
package.json 里用到的依赖如下
"devDependencies": {"chai": "^3.0.0","chai-as-promised": "^5.1.0","grunt": "^0.4.1","grunt-config-dir": "^0.3.2","grunt-mocha-cli": "^1.5.0","grunt-mocha-istanbul": "^2.4.0","grunt-sonar-runner": "^2.4.3","istanbul": "^0.3.14","load-grunt-tasks": "~0.2","mocha": "^1.18.0","sinon": "^1.15.4","supertest": "^0.9.0"}
这些包的安装都是通过命令 npm install xxx --save-dev
Grunt task
Gruntfile.js 配置如下
'use strict';
module.exports= function(grunt) {//Load the project's grunt tasks from a directory
require('grunt-config-dir')(grunt, {
configDir: require('path').resolve('tasks')
});//Register tasks
grunt.registerTask('test', [ 'mochacli']);
grunt.registerTask('coverage', [ 'mocha_istanbul:coverage','sonarRunner:analysis']);
};
Task - 'mochacli' 如下
'use strict';
module.exports= functionmochacli(grunt) {//Load task
grunt.loadNpmTasks('grunt-mocha-cli');//Options
return{
src: ['test/**/*.js'],
options: {
timeout:6000,'check-leaks': true,
ui:'bdd',
reporter:'spec'}
};
};
用这个插件来运行Mocha的测试。
Task - 'mocha_istanbul' 如下
'use strict';
module.exports= functionclean(grunt) {//Load task
grunt.loadNpmTasks('grunt-mocha-istanbul');//Options
return{
coverage: {
src:'test', //a folder works nicely
options: {
coverage:true,
reportFormats: ['lcov','lcovonly'],
root:'.',
recursive:true}
}
};
};
istanbul这个插件是用来计算代码覆盖率的,并且可以生成lcov格式的report, 以便与下一个插件sonarRunner集成,展示报告
Task - 'sonarRunner.js' 如下
'use strict';
module.exports= functionclean(grunt) {//Load task
grunt.loadNpmTasks('grunt-sonar-runner');//Options
return{
analysis: {
options: {
debug:true,
separator:'\n',
sonar: {
host: {
url:'http://10.101.46.20:9000'},
jdbc: {
url:'jdbc:mysql://10.101.46.20:3306/sonar',
username:'sonar',
password:'sonar'},
javascript: {
lcov: {
reportPath:'coverage/lcov.info'}
},
projectKey:'Demo:0.1.0',
projectName:'Demo project',
projectVersion:'0.1.0',
sources: ['controllers','models','lib'].join(','),
language:'js',
sourceEncoding:'UTF-8'}
}
}
};
};
运行grunt test 示例结果如下 (其实有很多用例,这里为了好展示图片,就run了一个)
运行grunt coverage 后
这里面两个task, 运行完第一个mocha_istanbul:coverage后, 根目录下会产生一个coverage目录
└──coverage
├── coverage.json
├── lcov.info
└── lcov-report
├── index.html
├── xxx
└── xxx
lcov.info格式的文件是给Sonnar展示报告用的
打开lcov-report/index.html 如下图
第二个插件是用来与Sonar集成的, 这几个grunt命令我是放在jenkins里daily build后执行的
不知道为何Sonar 解析出来的代码覆盖率数字 与 istanbul插件算出来的 差距很大。。
Reference
感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以点击右下方的推荐按钮,您的鼓励是我创作的动力。