zoukankan      html  css  js  c++  java
  • 基于Grunt&Mocha 搭建Nodejs自动化单元测试框架(含代码覆盖率统计)

    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 = 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: '
    ',
              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 

  • 相关阅读:
    Hdu 5396 Expression (区间Dp)
    Lightoj 1174
    codeforces 570 D. Tree Requests (dfs)
    codeforces 570 E. Pig and Palindromes (DP)
    Hdu 5385 The path
    Hdu 5384 Danganronpa (AC自动机模板)
    Hdu 5372 Segment Game (树状数组)
    Hdu 5379 Mahjong tree (dfs + 组合数)
    Hdu 5371 Hotaru's problem (manacher+枚举)
    Face The Right Way---hdu3276(开关问题)
  • 原文地址:https://www.cnblogs.com/wade-xu/p/4710968.html
Copyright © 2011-2022 走看看