基於Grunt&Mocha 搭建Nodejs自動化單元測試框架(含代碼覆蓋率統計)

Introduction

Grunt 是一個基於任務的JavaScript 世界的構建工具javascript

Mocha 是具備豐富特性的 JavaScript 測試框架,能夠運行在 Node.js 和瀏覽器中,使得異步測試更簡單更有趣。Mocha 能夠持續運行測試,支持靈活又準確的報告,當映射到未捕獲異常時轉到正確的測試示例。html

 

Prerequisite

nodejs項目文件目錄結構以下java

├── config
├── controllers
├── models
├── lib
├── node_modules
├── test
├── tasks
│   ├── mochacli.js
│   ├── sonarRunner.js
│   └── mocha_istanbul.js    
│── package.json
└── Gruntfile.js
        

test 文件夾存放全部的單元測試*.js 文件node

tasks 文件夾放的是一些給grunt 執行的task 文件mysql

package.json 裏用到的依賴以下sql

"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 npm

 

Grunt task

Gruntfile.js 配置以下json

'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' 以下promise

'use strict';

module.exports = function mochacli(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 = function clean(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 = function clean(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

Grunt: http://gruntjs.com/

Mocha: http://mochajs.org/

grunt-mocha-cli

grunt-mocha-istanbul

grunt-sonar-runner

 

感謝閱讀,若是您以爲本文的內容對您的學習有所幫助,您能夠點擊右下方的推薦按鈕,您的鼓勵是我創做的動力。

##轉載註明出處:http://www.cnblogs.com/wade-xu/p/4710968.html 

相關文章
相關標籤/搜索