本文是對眾多博客的學習和總結,可能存在理解錯誤。請帶著懷疑的眼光,同時如果有錯誤希望能指出。
寫 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