Nodejs 的测试方法

发表于:2016-07-07来源:推酷作者: Hello Qeesung点击数: 标签:Nodejs
写 Nodejs 也有几个月了,但是一直都没有关注过 Nodejs 的自动化测试。之前在学习 Java Swing 的时候,也研究过几个不同的 GUI 自动化测试框架,比如: Abbot ,可以实现自动化点击界

本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。

Nodejs 测试(1)

写 Nodejs 也有几个月了,但是一直都没有关注过 Nodejs 的自动化测试。之前在学习 Java Swing 的时候,也研究过几个不同的 GUI 自动化测试框架,比如:

  • Abbot ,可以实现自动化点击界面上的按钮等操作,主要是通过代码来实现;
  • AutoIT ,可以将对一个软件的操作录制下来,然后存为脚本,一次录制,多次运行。

这两天在看某些开源项目的时候,比如 Angular-dashboard-framework 和Angular-meterial-dashboard ,发现都使用了一些自动化测试的框架来进行软件的测试,比如: Mocha , Jasmine 等等。

Nodejs 中的自动化测试框架很多,我们不能一一涉猎,我们会选取比较常见的几个来使用。

在开始我们的主题之前,我们会介绍测试中的几个简单的概念,然后再看一个简单的例子

TDD 与 BDD

TDD , 测试驱动开发 (Test-Driven Development) , BDD , 行为驱动开发(Behavior-Driven Development) .

所谓的 测试驱动开发 ,就是在开发之前,先编写一些测试,然后跑一遍测试(此时的结果肯定是全都不通过的),然后开发进行开发,再跑一遍测试,如果测试都通过了,那么表示测试通过。

那么 行为驱动开发 ,就是采用自然语言来描述测试的行为过程。 BDD 可以消除TDD 测试过程中不能发现的问题。

TDD 和 BDD 是一个复杂的话题,大家可以参考下面的文章:

断言(Assert)

断言在 Nodejs 软件测试过程中很是重要。 Nodejs 就默认提供了内置的断言库assert ,后面我们将要介绍的断言库都是基于 Nodejs 内置的断言库,比如大名鼎鼎的 shouold.js , chai , expect.js 等等。

断言库提供了很多语义化的方法来对值进行各种判断。相对于内置的断言库而言,should.js 等断言库提供了更为自然,更为丰富的判断方法。

测试框架(Test Framework)

目前博主接触的自动化测试框架主要是 Mocha 和 Jasmine 这两个。测试框架并不负责断言的判断,断言编写,它们只是才有一种更为合理整洁的方式来管理我们的断言。这就为我们使用自动化测试框架带来了很大的灵活性,比如在使用 Mocha 自动化测试框架的时候,博主决定采用 nodejs 内置的 assert 断言库来编写断言。不久之后,博主新学习了 should.js ,于是决定将之前用 assert 断言库写的测试全部用should.js 替换,这也是可以的。因为 should.js , chai 等断言库都是基于nodejs 内置的 assert 断言库的。

例子

首先创建一个工程

# create a new nodejs project
$ cd ~/desktop && mkdir nodejs-test
$ cd $_ && npm init

# enter some infomation here

# install some dependecies
$ npm install -g mocha
$ npm install --save-dev should

这时我们目录下就有一个 package.json 文件,然后新建一个 lib 目录,并在lib 目录中创建一个 math.js 文件,作为我们自己实现的模块。

# create lib and math module
$ mkdir lib && cd lib
$ emacs math.js

math.js 模块内容如下,并最后导入 add 函数, add 函数就是我们最后要测试的函数

/**
 *  add numbers
 */
function add(number1 , number2){  
    if(arguments && arguments.length  === 0)
        return null;
    var numbers = Array.from(arguments);
    var result = 0;
    numbers.forEach(function(number) {
        result += number;
    });
    return result;
};


module.exports = {  
    add:add
};

回到与 package.json 同级的根目录,新建一个 test 目录,然后新建 add-test.js 文件

$ cd .. && mkdir test && cd test
$ emacs add-test.js

add-test.js 文件的内容如下,主要是测试 add 函数,下面的测试内容分别是:

  • 不传入参数
  • 传入一个参数
  • 传入两个参数
  • 传入多个参数
var should = require("should");  
var add = require("../lib/math.js").add;  
var assert = require("assert");

describe("add test", function () {  
    describe("with no input args",function () {
        it("result should equal to null",function () {
            (add() === null).should.be.true;
        });
    });

    describe("add one number",function  () {
        it("result should equal to the number",function () {
            add(1).should.equal(1);
        });

    });

    describe("add two number",function name() {
        it("result should equal to the number1+ number2",function () {
            add(1,2).should.equal(3);
        });
    });


    describe("add numbers",function name() {
        it("result should equal to number1+ number2 + ...",function () {
            add(1,2,3,4).should.equal(10);
        });
    });
});

回到工程跟目录,执行一下, mocha ,我们就可以看到下面的结果:

~/Desktop/nodejs-test $ mocha


  add test
    with no input args
      √ result should equal to null
    add one number
      √ result should equal to the number
    add two number
      √ result should equal to the number1+ number2
    add numbers
      √ result should equal to number1+ number2 + ...


  4 passing (8ms)

我们将 add 函数中的 + 操作符换成 - ,然后再运行一遍测试,除了第一个测试,剩下的测试都抛出异常了

 add test
    with no input args
      √ result should equal to null
    add one number
      1) result should equal to the number
    add two number
      2) result should equal to the number1+ number2
    add numbers
      3) result should equal to number1+ number2 + ...


  1 passing (10ms)
  3 failing

  1) add test add one number result should equal to the number:

      AssertionError: expected -1 to be 1
      + expected - actual

      --1
      +1

      at Assertion.fail (C:\Users\qeesung\Desktop\nodejs-test\node_modules\should\cjs\should.js:326:17)
      at Assertion.Object.defineProperty.value (C:\Users\qeesung\Desktop\nodejs-test\node_modules\should\cjs\should.js:398:19)
      at Context.<anonymous> (C:\Users\qeesung\Desktop\nodejs-test\test\add-test.js:14:27)
      ... more error here
 

原文转自:http://www.tuicool.com/articles/QVvY7jm