测试工具--Mocha

异步方法的测试更容易,与nodejs结合更自然。

Posted by Azr on December 13, 2018

Mocha是一个在Node.js和浏览器上运行的功能丰富的JavaScript测试框架,使异步测试变得简单而有趣。 Mocha测试以串行方式运行,允许灵活准确的报告,同时将未捕获的异常映射到正确的测试用例。

了解

Mocha

优点:

  • 好用、易上手
  • 终端显示友好
  • NodeJS结合更自然
  • 可使用多种风格的DSL,比如should/expect
  • 良好的支持JavaScript异步的单元测试
  • 支持before,after,beforeEach,afterEach钩子

缺点:

  • 自身集成度不高(没有断言,spy,异步等)
  • 配合Chai,Sinon等库使用
  • 配置比较麻烦

开始

文件结构

┌────────── src -──math.js
│           
├────────── test-──mocha.test.js 
│              
└──package.json

文件内容

  1. 安装

    # 全局安装mocha
    $ npm i -g mocha
    # 本地安装mocha
    $ npm i -D mocha
    
  2. src/math.js

    module.exports = {
      add(...args) {
        return args.reduce((prev,curr) => {
          return prev + curr;
        })
      },
      mul(...args) {
        return args.reduce((prev, curr) => {
          return prev * curr
        })
      }
    }
    
  3. test/mocha.test.js

    const { add,mul } = require('../src/math.js')
       
    const assert = require("assert");
       
    describe("#math",()=>{
        describe("#add()", function() {
            it("add(2,3) equal 5", function() {
                assert.equal(add(2,3),5);
            });
            it("add(2,2) equal 4", function() {
                assert.equal(add(2,2),4);
            });
        })
       
        describe("#mul()", function() {
            it("mul(2,3) equal 6", function() {
                assert.equal(mul(2,3),6);
            });
        })
    })
    

测试

  1. 进入test目录,运行mocha mocha.test.js,控制台显示。

    test mocha mocha.test.js
       
       
      #math
        #add()
          ✓ add(2,3) equal 5
       
       
      1 passing (8ms)
       
    
  2. 将其配置到package.json

    {
      // ... 
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "mocha": "mocha test/mocha.test.js"
      },
      // ... 
      "devDependencies": {
        "mocha": "^5.2.0"
      }
    }
       
       
    
  3. 运行npm run mocha,看看控制台

    ➜  node_mocha  node_mocha npm run mocha
       
    > node@1.0.0 test /Users/amor/Desktop/node_mocha
    > mocha test/mocha.test.js
       
       
       
      #math
        #add()
          ✓ add(2,3) equal 5
       
       
      1 passing (7ms)
    
  4. 更改mocha.test.js 中的

    // it("add(2,3) equal 5", function() {
    //     assert.equal(add(2,3),5);
    // });
       
    it("add(2,3) equal 5", function() {
            assert.equal(add(2,3),11);
    });
    
  5. 运行npm run mocha,看看控制台

    ➜  node_mocha npm run mocha
       
    > node_mocha@1.0.0 test /Users/amor/Desktop/node_mocha
    > mocha test/mocha.test.js
       
       
       
      #math
        #add()
          1) add(2,3) equal 5
          ✓ add(2,2) equal 4
        #mul()
          ✓ mul(2,3) equal 6
       
       
      2 passing (11ms)
      1 failing
       
      1) #math
           #add()
             add(2,3) equal 5:
       
          AssertionError [ERR_ASSERTION]: 5 == 11
          + expected - actual
       
          -5
          +11
             
          at Context.<anonymous> (test/mocha.test.js:8:14)
    

    强大的图形反馈界面,报错信息反馈简单直白准确。

命令行

单元测试模版

当我们运行如下命令的时候:mocha init .会在当前路径中生成一个模版,文件如下:

┌────────── index.html
├────────── macha.css
├────────── macha.js
└────────── tests.js

mocha全部命令

Options:

    -h, --help                  输出帮助信息
    -V, --version               输出mocha的版本号
    -A, --async-only            强制所有的测试用例必须使用callback或者返回一个promise的格式来确定异步的正确性
    -c, --colors                在报告中显示颜色
    -C, --no-colors             在报告中禁止显示颜色
    -g, --growl                 在桌面上显示测试报告的结果
    -O, --reporter-options <k=v,k2=v2,...>  设置报告的基本选项
    -R, --reporter <name>       指定测试报告的格式
    -S, --sort                  对测试文件进行排序
    -b, --bail                  在第一个测试没有通过的时候就停止执行后面所有的测试
    -d, --debug                 启用node的debugger功能
    -g, --grep <pattern>        用于搜索测试用例的名称,然后只执行匹配的测试用例
    -f, --fgrep <string>        只执行测试用例的名称中含有string的测试用例
    -gc, --expose-gc            展示垃圾回收的log内容
    -i, --invert                只运行不符合条件的测试用例,必须和--grep或--fgrep之一同时运行
    -r, --require <name>        require指定模块
    -s, --slow <ms>             指定slow的时间,单位是ms,默认是75ms
    -t, --timeout <ms>          指定超时时间,单位是ms,默认是200ms
    -u, --ui <name>             指定user-interface (bdd|tdd|exports)中的一种
    -w, --watch                 用来监视指定的测试脚本。只要测试脚本有变化,就会自动运行Mocha
    --check-leaks               检测全局变量造成的内存泄漏问题
    --full-trace                展示完整的错误栈信息
    --compilers <ext>:<module>,...  使用给定的模块来编译文件
    --debug-brk                 启用nodejs的debug模式
    --es_staging                启用全部staged特性
    --harmony<_classes,_generators,...>     all node --harmony* flags are available
    --preserve-symlinks                     告知模块加载器在解析和缓存模块的时候,保留模块本身的软链接信息
    --icu-data-dir                          include ICU data
    --inline-diffs              用内联的方式展示actual/expected之间的不同
    --inspect                   激活chrome浏览器的控制台
    --interfaces                展示所有可用的接口
    --no-deprecation            不展示warning信息
    --no-exit                   require a clean shutdown of the event loop: mocha will not call process.exit
    --no-timeouts               禁用超时功能
    --opts <path>               定义option文件路径 
    --perf-basic-prof           启用linux的分析功能
    --prof                      打印出统计分析信息
    --recursive                 包含子目录中的测试用例
    --reporters                 展示所有可以使用的测试报告的名称
    --retries <times>           设置对于失败的测试用例的尝试的次数
    --throw-deprecation         无论任何时候使用过时的函数都抛出一个异常
    --trace                     追踪函数的调用过程
    --trace-deprecation         展示追踪错误栈
    --use_strict                强制使用严格模式
    --watch-extensions <ext>,... --watch监控的扩展 
    --delay                     异步测试用例的延迟时间
1. -R, –reporter name
  • 用于指定报告的格式。默认是spec

  • 也可以用来指定第三方的报告样式。

  • e.g.:

    $ mocha
    # 默认spec格式
    $ mocha --reporter spec
    # 指定tag格式
    $ mocha --reporter tap
    # 显示所有支持的格式
    $ mocha --reporters
    
2. -G,–growl
  • 打开--growl参数,就会将测试结果在桌面显示。
3. -w,–watch
  • --watch参数用来监视指定的测试脚本。只要测试脚本有变化,就会自动运行Mocha。

    $ mocha --watch
    

    上面命令执行以后,并不会退出。你可以另外打开一个终端窗口,修改test目录下面的测试脚本add.test.js,比如删除一个测试用例,一旦保存,Mocha就会再次自动运行。

4. -b,–bail
  • --bail参数指定只要有一个测试用例没有通过,就停止执行后面的测试用例(只对第一个异常感兴趣。)。这对持续集成很有用。
5. -g,–grep
  • --grep参数用于搜索测试用例的名称(即it块的第一个参数),然后只执行匹配的测试用例。
6. -i,–invert
  • --invert参数表示只运行不符合条件的测试脚本,必须与--grep参数配合使用。
7. -d,–debug
  • 启用nodejs的debug功能。这个选项会用node debug <file>的模式运行你的脚本,所以会在debugger语句处暂停执行。
  • 这个选项和mocha debug以及mocha --debug是不同的
  • mocha debug将会唤起nodejs默认的debug客户端
  • mocha --debug也可以使用不同的接口,比如--Blink的控制台工具
8. –check-leaks
  • 默认情况下,mocha并不会去检查应用暴露出来的全局变量,加上这个配置后就会去检查,此时某全局变量如果没有用上面的–GLOBALS去配置为可接受,mocha就会报错。
9. -t,–timeout ms
  • 用来指定用例超时时间。单位是ms,默认是2s。
  • 可以直接使用带单位的时间来覆盖掉默认的单位。
  • e.g. --timeout 2s--timeout 2000是一样的。
10. -s,–slow ms
  • 用来指定慢用例判定时间,默认是75ms。

配置文件mocha.opts

  1. 在服务端运行的时候,mocha会去加载test目录下mocha.opts文件,来读取mocha配置项。
  2. 配置文件中的每一行代表一项配置。
  3. 如果运行mocha命令的时候,带上的配置参数与这个配置文件中的配置冲突的话,以命令中的为准。

mocha.opt文件:

-- require should
-- reporter dot
-- ui bdd

上面的配置就会让mocha 引入一下should模块、报告样式设置为dot,并且使用bdd的测试接口。在这个基础上,运行mocha的时候也可以添加一些额外的参数,比如添加--Growl选项同时更改报告样式为list风格:

$ mocha --reporter list --growl

测试用例的钩子

Mocha在describe块之中,提供测试用例的四个钩子:before()after()beforeEach()afterEach()。它们会在指定时间执行。

describe('hooks', function() {

  before(function() {
    // 在本区块的所有测试用例之前执行
  });

  after(function() {
    // 在本区块的所有测试用例之后执行
  });

  beforeEach(function() {
    // 在本区块的每个测试用例之前执行
  });

  afterEach(function() {
    // 在本区块的每个测试用例之后执行
  });

  // test cases
});

测试可以出现在before,after或者和钩子函数交替出现。

钩子函数会按照它们被定义的顺序运行。

一般就是,before()(只运行一次)->beforeEach()->afterEach()->after()(只运行一次)

代码

Mocha

本文首次发布于 Azr的博客, 作者 @azrrrrr ,转载请保留原文链接.

原文链接: http://amor9.cn/2018/12/13/mocha/