华为云优惠活动, 三年4核16G服务器仅需不到2000块钱 截止到五月底
你可以跟着我的笔记 当我有一台服务器时,我做了什么 来开始维护服务器并搭建应用,将引导你使用 docker 和 k8s 搭建一个自己的服务器开发集群。

# 为你的 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)

# 测试覆盖率

  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 )
================================================================================

# API 测试

扫码关注公众号全栈成长之路,并发送

即可在关注期间无限制浏览本站全部文章内容

点击关闭

你也可以在文章关于回复公众号扫码解锁全站的技术实现中获得解锁代码,永久解锁本站全部文章

Last Updated: 4/5/2020, 8:15:55 AM