本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。
写 Nodejs 也有几个月了,但是一直都没有关注过 Nodejs 的自动化测试。之前在学习 Java Swing 的时候,也研究过几个不同的 GUI 自动化测试框架,比如:
这两天在看某些开源项目的时候,比如 Angular-dashboard-framework 和Angular-meterial-dashboard ,发现都使用了一些自动化测试的框架来进行软件的测试,比如: Mocha , Jasmine 等等。
Nodejs 中的自动化测试框架很多,我们不能一一涉猎,我们会选取比较常见的几个来使用。
在开始我们的主题之前,我们会介绍测试中的几个简单的概念,然后再看一个简单的例子
TDD , 测试驱动开发 (Test-Driven Development) , BDD , 行为驱动开发(Behavior-Driven Development) .
所谓的 测试驱动开发 ,就是在开发之前,先编写一些测试,然后跑一遍测试(此时的结果肯定是全都不通过的),然后开发进行开发,再跑一遍测试,如果测试都通过了,那么表示测试通过。
那么 行为驱动开发 ,就是采用自然语言来描述测试的行为过程。 BDD 可以消除TDD 测试过程中不能发现的问题。
TDD 和 BDD 是一个复杂的话题,大家可以参考下面的文章:
断言在 Nodejs 软件测试过程中很是重要。 Nodejs 就默认提供了内置的断言库assert ,后面我们将要介绍的断言库都是基于 Nodejs 内置的断言库,比如大名鼎鼎的 shouold.js , chai , expect.js 等等。
断言库提供了很多语义化的方法来对值进行各种判断。相对于内置的断言库而言,should.js 等断言库提供了更为自然,更为丰富的判断方法。
目前博主接触的自动化测试框架主要是 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