Node.js单元测试

文章目录

  • 使用mocha进行单元测试
    • 一、单元测试类型
      • TDD:测试驱动开发
      • BDD:行为驱动开发
    • 二、测试框架mocha
      • (一)安装
      • (二)测试脚本的写法
      • (三)mocha的基本用法
      • (四)命令行参数
      • (五)测试用例的钩子
    • 三、参考

使用mocha进行单元测试

简要介绍如何对Node.js的代码进行单元测试

一、单元测试类型

TDD:测试驱动开发

  • TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。

BDD:行为驱动开发

  • 重点是通过与利益相关者的讨论取得对预期软件行为的清醒认识。它通过自然语言书写非程序员可读的测试用例扩展了测试驱动开发方法。
    行为驱动开发人员使用混合了领域中统一的语言的母语语言来描述他们的代码的目的。

二、测试框架mocha

Mocha(发音"摩卡")诞生于2011年,是现在最流行的JavaScript测试框架之一,在浏览器和Node环境都可以使用。所谓"测试框架",就是运行测试的工具。通过它,可以为JavaScript应用添加测试,从而保证代码的质量。

(一)安装

$ npm install --global mocha

(二)测试脚本的写法

Mocha的作用是运行测试脚本,首先必须学会写测试脚本。所谓"测试脚本",就是用来测试源码的脚本。

假设有以下的calc.js

exports.add = function (i, j) {
  return i + j;
};
exports.mul = function (i, j) {
  return i * j;
};

要测试这个加法模块是否正确,就要写测试脚本。
通常测试脚本的文件名与源码文件名相同,后缀一般为.test.js(表示测试),或者.spec.js(表示规格)。比如calc.js的测试文件命名为calc.test.js,代码如下:

var assert = require('assert');
var calc = require('../calc.js');
describe('Calculator Tests', function () {
  describe('Addition Tests', function () {
    it('returns 1 + 1 = 2', function (done) {
      assert.equal(calc.add(1, 1), 2);
      done();
    });
    it('returns 1 + -1 = 0', function (done) {
      assert.equal(calc.add(1, -1), 0);
      done();
    });
  });
  describe('Multiplication Tests', function () {
    it('returns 2 * 2 = 4', function (done) {
      assert.equal(calc.mul(2, 2), 4);
      done();
    });
    it('returns 0 * 4 = 4', function (done) {
      assert.equal(calc.mul(0, 4), 0);
      done();
    });
  });
});

几点说明:

  • 上面这段代码,就是测试脚本,它可以独立执行。测试脚本里面应该包括一个或多个describe块,每个describe块应该包括一个或多个it块。
  • describe块称为"测试套件"(test suite),表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称(“Calculator Tests”),第二个参数是一个实际执行的函数。
  • it块称为"测试用例"(test case),表示一个单独的测试,是测试的最小单位。它也是一个函数,第一个参数是测试用例的名称(“returns 1 + 1 = 2”),第二个参数是一个实际执行的函数。
  • done:测试完一个样例需要传递done类表明测试样例结束。
  • assert:类型断言,判断样例是否正确。

(三)mocha的基本用法

有了测试脚本以后,就可以用mocha运行它。

$ mocha calc.test.js
Calculator Tests
    Addition Tests
      √ returns 1 + 1 = 2
      √ returns 1 + -1 = 0
    Multiplication Tests
      √ returns 2 * 2 = 4
      √ returns 0 * 4 = 4

  4 passing (34ms)
  • 上面的运行结果表示,测试脚本通过了测试,一共只有4个测试用例,耗时是34毫秒。
  • mocha命令后面紧跟测试脚本的路径和文件名,可以指定多个测试脚本。
  • mocha默认运行test子目录里面的测试脚本,实践中一般在工程目录下建立一个test文件夹,将测试文件放入到文件夹中。然后执行mocha命令。
$ mocha
  # 运行结果
  Calculator Tests
    Addition Tests
      √ returns 1 + 1 = 2
      √ returns 1 + -1 = 0
    Multiplication Tests
      √ returns 2 * 2 = 4
      √ returns 0 * 4 = 4

  PlusOne Tests
    HandleArr Tests
      √ returns 423 + 1 = 424
    HandleArr Carry Tests
      √ returns 429 + 1 = 430
    HandleArr Carry Tests
      √ returns 999 + 1 = 1000
  7 passing (40ms)

test文件夹下面有两个测试文件,calc.test.js,plusOne.test.js

  • mocha默认只执行test子目录下面第一层的测试用例,不会执行更下层的用例。为了改变这种行为,就必须加上–recursive参数,这时test子目录下面所有的测试用例----不管在哪一层----都会执行。

(四)命令行参数

  • –help或-h参数,用来查看Mocha的所有命令行参数。
  • –reporter参数用来指定测试报告的格式,默认是spec格式(tap、dot、spec)
  • mocha默认每个测试用例最多执行2000毫秒,如果到时没有得到结果,就报错。对于涉及异步操作的测试用例,这个时间往往是不够的,需要用-t或–timeout参数指定超时门槛。
$ mocha -t 5000 --recursive --reporter spec
  • mocha默认会高亮显示超过75毫秒的测试用例,可以用-s或–slow调整这个参数。
  • mocha内置对Promise的支持,允许直接返回Promise,等到它的状态改变,再执行断言,而不用显式调用done方法。
// promise.test.js
it('异步请求应该返回一个对象', function() {
  return fetch('https://api.github.com')
    .then(function(res) {
      return res.json();
    }).then(function(json) {
      expect(json).to.be.an('object');
    });});

(五)测试用例的钩子

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

describe('hooks', function() {

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

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

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

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

  // test cases
});

三、参考

  • mocha
    • http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html

你可能感兴趣的:(Node.js,单元测试)