Skip to content

Node 应用中的单元测试

Published: at 07:06

Node 牛刀小试 · 第 7 篇,共 49 篇

为你的 Node 应用添加测试用例

当新增一个新功能或迭代已有功能时,如何保证不会影响到旧功能的正常运作?

单元测试是提高代码质量的一个必要手段,也能够最大限度地减少对旧有功能的最大破坏。对于一些公共库,如 lodashkoareact 而言,它们对健壮性,代码质量有着更高的要求,单元测试则是必备条件了。

除了提高代码质量,单元测试还可以充当 文档 或者 示例 的功能,特别是对那些文档不齐及不见文档特性而言。

BDD 与 TDD

测试分为两大流派,分别为

  1. BDD: Behavior Driven Development,行为驱动开发,先作实现,然后对实现做尽量完整的测试
  2. TDD: Test Driven Development,测试驱动开发,先写测试用例,根据测试用例驱动开发,对于开发细节有很好的把控

断言 | chai

function sum(a, b) {
  return a + b;
}

假设项目中有一个函数 sum,我们要对它进行测试:

sum(1, 1) === 2;

当然这种写法过于简单,当有更多个测试用例时也无法更直观地查看详情,于是有很多优秀的断言库支持:

  1. assert: Node 原生支持的断言模块
  2. chai (6.7k star): 可支持浏览器及 Node 的断言库,支持 TDD 与 BDD
  3. should (2.8k star): 支持 BDD
  4. expect (2.1k star)

框架 | mocha

一个测试用例可以包含一个断言或多个断言,那如何组织多个测试用例呢?

通过框架,它可以对测试用例进行分组测试,并形成测试报告。常见的几种测试框架如下

  1. ava (17.7k)
  2. mocha (19.1k),著名框架 express 通过它来写测试
  3. jest (30.2k),多在浏览器环境中使用,如 react
  4. karma (11k),多在浏览器环境中使用,如 vue

这是一个使用 mochaassert 测试 Array.prototype.indexOf 的示例

const assert = require("assert");
describe("Array", function () {
  describe("#indexOf()", function () {
    it("should return -1 when the value is not present", function () {
      assert.equal([1, 2, 3].indexOf(4), -1);
    });
  });
});

这是通过 mocha 测试框架所形成的测试报告

$ ./node_modules/mocha/bin/mocha

  Array
    #indexOf()
should return -1 when the value is not present


  1 passing (9ms)

仅仅测试某一个 TestSuite

为了更有针对性的调试,仅需对某一个文件进行测试

测试覆盖率

  1. nyc (4.1k star)
  2. codecov
  CLS Session
 expect work
 expect scope return value
 expect work at async resource
 expect work at koa middleware


  4 passing (39ms)


=============================== Coverage summary ===============================
Statements   : 97.06% ( 33/34 )
Branches     : 62.5% ( 5/8 )
Functions    : 92.31% ( 12/13 )
Lines        : 97.06% ( 33/34 )
================================================================================
$ jest --coverage

API 测试