參考:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.htmljavascript
1、安裝環境:工欲善其事,必先利其器!html
1. Node.js的安裝:java
(1)windons環境下:下載Node.js安裝包 -> 安裝;node
命令行窗口:node --version 檢查是否安裝 git
2. npm的安裝:npm
(1)npm installjson
(2)0node.js包管理工具npm安裝模塊後,沒法經過命令行執行命令,提示‘xxx’ 不是內部或外部命令的解決方法:通常出現這樣的問題緣由是npm安裝出現了問題,全局模塊目錄沒有被添加到系統環境變量。框架
(3)Windows用戶檢查下npm的目錄是否加入了系統變量PATH中,若是不存在須要手動添加,添加以後須要從新啓動CMD控制檯。函數
(4)nodejs模塊全局目錄環境變量,npm目錄可使用npm命令去查找:npm config get prefix工具
(5)安裝報錯:npm warn package.json @1.0.0 no repository field. 看字面意思大概是package.json裏缺乏repository字段,也就是說缺乏項目的倉庫字段。
{ ... "repository": { "type": "git", "url": "http://baidu.com" }, ... } 但做爲測試項目或者練習用,只需在package.json裏面作以下配置便可: { ... "private": true, ... } 以這種方式把項目聲明爲私有。
3. mocha全局變量安裝:
(1)npm install --global mocha
2、mocha測試框架demo運行
1. 所謂測試框架,也就是「運行測試的工具」。
2. Mocha是Javascript測試框架之一,它的做用是運行測試腳本,所謂「測試腳本」,就是用來測試源代碼的腳本。
3、測試腳本的寫法
1.Mocha的做用是運行測試腳本,下面是一個加法模塊的代碼
// add.js function add(x, y){ return x + y; } modul.exports = add;
(1)要測試這個加法模塊是否正確,就要寫測試腳本。
(2)一般,測試腳本與所要測試的源碼腳本同名,可是後綴名爲.test.js(表示測試)或者.spec.js(表示規格)。好比,add.js的測試腳本名字就是:add.test.js。
// add.test.js var add = require('./add.js'); var expect = require('chai').expect; describe('加法函數的測試', function(){ it('1加1應該等於2', function(){ expect(add(1,1).to.be.equal(2)); }); });
(3)上面這段代碼,就是測試腳本,能夠獨立運行。
(4)測試腳本應該包括一個或多個describe塊,每一個describe塊應該包括一個或多個it塊。
(5)describe塊稱爲「測試套件」(test suite),表示一組相關的測試。它是一個函數,第一個參數是測試套件的名稱(「加法函數的測試」),第二個參數是一個實際執行的函數。
(6)it塊稱爲「測試用例」(test case),表示一個單獨的測試,是測試的最小單位。它也是一個函數,第一個參數是測試用來的名稱(「1加1應該等於2」),第二個參數是一個實際執行的函數。
4、斷言庫的用法
expect(add(1,2).to.be.equal(2));//斷言
(1)所謂「斷言」,就是判斷源碼的實際執行結果與預期結果是否一致,若是不一致就拋出一個錯誤。上面這句斷言的意思是,調用add(1, 1),結果應該等於2。
(2)全部測試用來(it塊)都應該包含有一句或多句的斷言。它是編寫測試用例的關鍵。斷言功能由斷言庫來實現,Mocha自己不帶斷言庫,因此必須先引入斷言庫。
var expect = require('chai').expect;
(3)斷言庫有不少種,Mocha並不限制使用哪種。上面代碼引入的斷言庫是chai,而且指定使用它的expect斷言風格。
(4)expect斷言的優勢是很接近天然語言,下面是一些例子:
//相等或不想等 expect(4 + 5).to.be.equal(9); expect(4 + 5).to.be.not.equal(10); expect(foo).to.be.deep.equal({bar: 'baz'}); //布爾值爲true expect('everything').to.be.ok; expect(false).to.not.be.ok; //typeof expect('test').to.be.a('string'); expect({foo: 'bar'}).to.be.an('object'); expect(foo).to.be.an.instanceof(Foo); //include expect([1,2,3]).to.include(2); expect('foobar').to.contain('foo'); expect({foo: 'bar', hello: 'universe'}).to.include.kes('foo'); //empty expect([]).to.be.empty; expect('').to.be.empty; expect({}).to.be.empty; //match expect('foobar').to.be.match(/^foo/);
(5)基本上,expect斷言的寫法都是同樣的。頭部是expect方法,尾部是斷言的方法,好比equal、a/an、ok、match等。二者之間是用to或者to.be連接;
(6)expect斷言不成立,就會拋出一個錯誤。事實上,只要不拋出錯誤,測試用例就算經過。
it('1加1應該等於2', function(){});
(7)上面的這個測試用例,內部沒有任何代碼,因爲沒有拋出錯誤,因此仍是經過;
5、Mocha的基本用法
有了測試腳本之後,就能夠用Mocha運行它。
$ mocha add.test.js 加法函數的測試 ✓ 1 加 1 應該等於 2 1 passing (8ms)
(1)上面的運行結果表示,測試腳本經過了測試,一共只有一個測試用例,耗時是8毫秒。
(2)Mocha命令後面緊跟測試腳本的路徑和文件名,能夠指定多個測試腳本:
$ mocha file1 file2 file3
(3)Mocha默認運行test子目錄裏面的測試腳本。因此,通常會把測試腳本防止test目錄裏面,而後執行mocha就不須要參數了,進入子目錄,輸入mocha命令運行便可;
(4)打開test子目錄,會發現還有一個test/dir子目錄,裏面還有一個測試腳本multiple.test.js,並無獲得執行。由於Mocha默認只執行test子目錄下面的第一層的測試用例,不會執行更下層的用例。爲了改變這種行爲,就必須加上--recursive參數,這時test子目錄下面的全部測試用例(無論在那一層)都會執行。