• 基于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 

  • 相关阅读:
    事务笔记
    MyBatis执行流程(面试题)
    mapper映射文件中 #{}与${}区别(面试题)
    前端内存泄露浅谈
    vue中使用element来创建目录列表
    vue中组件之间的传值
    nodejs+vue实现登录界面功能(二)
    nodejs+vue实现登录界面功能(一)
    threejs(一):初步认识与使用
    官网编辑遇到的各种问题记录(一)
  • 原文地址:https://www.cnblogs.com/wade-xu/p/4710968.html
Copyright © 2020-2023  润新知