從這周開始,每週至少完成一篇分享~每週週六睡前完成本週的初步讀文章分享,下週四睡前將上週的大問題修改完畢,將深刻理解的知識補充完~一定要堅持下去~也希望自己能夠深刻理解每一個內容,如果大家發現文章中的問題或者有好的建議可直接留言,有好的相關文章也歡迎發給我~一起加油吧!
1.node assert
斷言是程式設計術語,表示為一些布林表示式,程式設計師相信在程式中的某個特定點該表示式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。assert主要是用於有肯定結果的測試。
主要函式
assert(value, message), assert.ok(value, [message]) //判斷中值是否為true
assert.ifError(value) //測試值是否不為 false,當為 true 時丟擲。常用於回撥中第一個 error 引數的檢查。
assert.fail(actual, expected, message, operator) //丟擲異常,有message時顯示 message,沒有使用operator作為為分隔符
assert.equal(actual, expected, [message]) //("=="判斷)是否相等
assert.notEqual(actual, expected, [message]) //("=="判斷)是否不相等
assert.strictEqual(actual, expected, [message]) //("==="判斷)是否相等 相反:notStrictEqual
assert.notDeepEqual(actual, expected[, message]) // 是否深度匹配
assert.throws(block, [error], [message]) //宣告一個block用於丟擲錯誤,'error'可以是建構函式,驗證函式或者正規表示式
assert.doesNotThrow(block, [message])//宣告模組不丟擲錯誤
2.ATDD,TDD,BDD
TDD(測試驅動開發)
TDD指的是Test Drive Development,很明顯的意思是測試驅動開發,也就是說我們可以從測試的角度來檢驗整個專案。大概的流程是先針對每個功能點抽象出介面程式碼,然後編寫單元測試程式碼,接下來實現介面,執行單元測試程式碼,迴圈此過程,直到整個單元測試都通過。這一點和敏捷開發有類似之處。
BDD(行為驅動開發)
BDD指的是Behavior Drive Development,也就是行為驅動開發。BDD用自然語言來描述,讓開發、測試、BA以及客戶都能在這個基礎上達成一致。因為測試優先的概念並不是每個人都能接受的,可能有人覺得系統太複雜而難以測試,有人認為不存在的東西無法測試。所以,我們在這裡試圖轉換一種觀念,那便是考慮它的行為,也就是說它應該如何執行,然後抽象出能達成共識的規範。
3.mocha(音:摩卡)
mocha是一款功能豐富的javascript單元測試框架,它既可以執行在nodejs環境中,也可以執行在瀏覽器環境中。mocha會序列地執行我們編寫的測試用例,可以在將未捕獲的異常對映到對應測試用例(?這裡是指的哪部分)的同時,保證輸出靈活準確的測試結果。
mocha會生成一個包在最外面的describe函式
同步程式碼測試
var assert = require('chai').assert; //斷言模組chai中的assert風格
describe('用例集描述string', function() { // "測試套件"(test suite),表示一組相關的測試
it('用例的描述string', function() { //it為一個測試用例,用例通過後會在描述前打勾
// function為用例的內容
assert.equal(-1, [1,2,3].indexOf(5));
assert.equal(-1, [1,2,3].indexOf(0));
});
});複製程式碼
非同步程式碼測試
callback:x
describe('User', function() {
describe('#save()', function() {
it('should save without error', function(done) {
var user = new User('Luna');
user.save(function(err) {
if (err) throw err; //判斷用例執行成功與否是在非同步程式碼的回撥裡邊完成的
done(); // 通知Mocha測試結束
/* user.save(done); // 非同步程式碼中邏輯錯誤時,會在回撥中丟擲一個錯誤,直接這樣寫即可 */複製程式碼
});
});
});
});複製程式碼
promise: 讓用例函式返回一個promise物件來進行正確性判斷
不建議使用箭頭函式~~
鉤子函式 (下面4種)
describe('hooks', function() {
before('可選:描述string',function [funName可選] () {
// runs before all tests in this block
});
after(function() {
// runs after all tests in this block
});
beforeEach(function() {
// runs before each test in this block
});
afterEach(function() {
// runs after each test in this block
});
// test cases
});複製程式碼
如果在用例集函式之外定義鉤子函式,那麼這個鉤子函式將會對所有的mocha單元測試用例生效。
常用方法
describe.only()/it.only() : 只執行此用例集或用例
describe.skip()/it.skip():跳過此用例集或用例的執行,跳過的用例會被標記為pending
的用例
this.skip();: 呼叫skip函式跳過此用例
this.retries();:重新執行用例(會重新執行用例函式的beforeEach和afterEach鉤子函式)
this.slow(num);:標記耗費num時間認為執行耗時過長
this.timeout(500):定義用例、用例集、鉤子函式超時時間,如果巢狀的用例集或者用例重寫了timeout時間,則會覆蓋上層的設定。通過this.timeout(0)
,可以關掉用例或用例集的超時判斷。
mocha.setup('bdd'): 設定介面型別
mocha.run(); : 測試指令碼載入完之後用mocha.run()
函式來執行測試
常用命令
mocha init
: 生成一個瀏覽器中單元測試的架子
mocha --delay
: 在全域性環境中生成一個run函式,延遲工作完成後呼叫run函式run()即可啟動測試。mocha命令的基本格式是:mocha [debug] [options] [files]
測試介面型別
mocha的測試介面型別指的是集中測試用例組織模式的選擇,包括BDD行為驅動開發(Behavior Driven Development),TDD測試驅動開發(Test-Driven Development),Exports,QUnit 和 Require-style 幾種
BDD(預設的測試介面)
BDD測試介面提供 describe(), context(), it(), specify(), before(), after(), beforeEach(), 和 afterEach()幾種函式,其中context函式只是describe函式的別名,specify函式也是if函式的別名。
TDD
TDD介面提供 suite(), test(), suiteSetup(), suiteTeardown(), setup(), 和 teardown()函式
額外補充知識點(讀取檔案時用到) :
bash萬用字元(node萬用字元)【eg:$ mocha 'test/**/*.@(js|jsx)' 需加單引號】
萬用字元 意義
* 匹配0任意多個字元(包括零個或一個)
? 匹配任意一個字元(不包括零個)
[characters] 匹配任意一個屬於字符集中的字元
[!characters] 匹配任意一個不是字符集中的字元
[[:class:]] 匹配任意一個屬於指定字元類中的字元
字元類 意義
[:alnum:] 匹配任意一個字母或數字
[:alpha:] 匹配任意一個字母
[:digit:] 匹配任意一個數字
[:lower:] 匹配任意一個小寫字母
[:upper] 匹配任意一個大寫字母
4.should.js
shouldjs是一個BDD測試斷言庫,它包裝了assert,改變了書寫風格,擴充套件了Object.prototype,額外提供了".should"語法。一旦引入了should,即“var should = require('should');”,那麼當前js檔案內的所有繼承至Object的物件都可以.should:
目標物件.should.xxxx複製程式碼
如果目標物件沒有繼承至Object,那就換一種方式使用:
should(目標物件).xxx複製程式碼
或者
should.xxxxx(目標物件);複製程式碼
should庫需要額外安裝:$ npm install should --save-dev
瀏覽器端將should包下的should.js引入到前臺頁面,即可和後端一樣使用。
靜態方法
should提供了一系列的靜態方法,這些方法可以對非Object物件使用。它們和assert的基本方法其實是一樣的。具體api看上面連結。
Assertions 斷言
每一個should斷言都返回一個被should.js包裝過的物件,所以他可以形成鏈式語法,但是有一些斷言,比如.length,.property 等將被斷言的物件改變成了其屬性值。
而且在“鏈”中,可以使用下面等方便理解的詞,這些詞其實對should的斷言一點實際影響都沒有,注意,沒有.or。
.an, .of, .a, .and, .be, .have, .w ith, .is, .which.
5.自動化測試工具karma
karma就是把我們測試過程中編寫的測試用例,通過它呼叫瀏覽器來執行這些測試用例,然後再彙集測試結果,生成測試報告。可以選擇各類測試框架(mocha、Jasmine 等)。
6.Travis CI
Travis-ci是一款持續整合(Continuous Integration)服務,它能夠很好地與Github結合,每當程式碼更新時自動地觸發整合過程。
配置.travis.yml檔案,在travis官網上開啟自動構建,則可以簡單地開始某一專案的自動構建