摘要:背景最近負(fù)責(zé)一個(gè)需求,使用到了測(cè)試框架做單元測(cè)試介紹就是一種單元測(cè)試框架,它不依賴任何其他框架,也不需要對(duì)操作,具有靈巧而明確的語(yǔ)法可以讓你輕松的編寫測(cè)試代碼。布爾測(cè)試,判斷值是否是,或者可以轉(zhuǎn)換為。
背景
最近負(fù)責(zé)一個(gè)需求,使用到了jasmine測(cè)試框架做單元測(cè)試
介紹Jasmine就是一種JavaScript單元測(cè)試框架,它不依賴任何其他JS框架,也不需要對(duì)DOM操作,具有靈巧而明確的語(yǔ)法可以讓你輕松的編寫測(cè)試代碼。它是一套Javascript行為驅(qū)動(dòng)開發(fā)框架(BDD),干凈簡(jiǎn)潔,表達(dá)力強(qiáng)且易于組織,不依賴于其他任何框架和DOM,可運(yùn)行于Node.js,瀏覽器端或移動(dòng)端。
Jasmine官網(wǎng)
Jasmine github
Suites
Suites可以理解為一組測(cè)試,使用全局的Jasmin函數(shù)describe 創(chuàng)建。describe 函數(shù)接受兩個(gè)參數(shù),一個(gè)字符串和一個(gè)函數(shù)。字符串是這個(gè)Suites的名字或標(biāo)題(通常描述下測(cè)試內(nèi)容),函數(shù)是實(shí)現(xiàn)Suites的代碼塊。
Specs
Specs可以理解為一個(gè)測(cè)試,使用全局的Jasmin函數(shù)it 創(chuàng)建。和describe 一樣接受兩個(gè)參數(shù),一個(gè)字符串和一個(gè)函數(shù),函數(shù)就是要執(zhí)行的測(cè)試,字符串就是測(cè)試的名字。一個(gè)Spec可以包含多個(gè)expectations來(lái)測(cè)試代碼。在Jasmine中,一個(gè)expectations就是一個(gè)斷言,只能是true 或false 。只有全部expectations是true 的時(shí)候spec才會(huì)通過(guò)。
由于describe 和it 塊實(shí)質(zhì)上都函數(shù),所有他可以包含任何的可執(zhí)行代碼。javascript的作用域規(guī)則也是適用的,所以describe 內(nèi)定義的變量,其內(nèi)部所有的it 都能訪問(wèn)到。
Expectations
expectations由expect 函數(shù)創(chuàng)建。接受一個(gè)參數(shù)。和Matcher一起聯(lián)用,設(shè)置測(cè)試的預(yù)期值。
在Jasmine中,每個(gè)Matcher實(shí)現(xiàn)一個(gè)“期望值”和“實(shí)際值”的布爾判斷,Jasmine會(huì)根據(jù)Mather判斷expectation是true 還是false ,然后決定spec是測(cè)試通過(guò)還是失敗。所有Matcher可以通過(guò)not 執(zhí)行否定判斷。
基礎(chǔ)matchers
toBe():相當(dāng)于===比較。
toNotBe()
toBeDefined():檢查變量或?qū)傩允欠褚崖暶髑屹x值。
toBeUndefined()
toBeNull():是否是null。
toBeTruthy():布爾測(cè)試,判斷值是否是,或者可以轉(zhuǎn)換為true。
toBeFalsy()
toBeLessThan():數(shù)值比較,小于。
toBeGreaterThan():數(shù)值比較,大于。
toEqual():相當(dāng)于==,注意與toBe()的區(qū)別。
一個(gè)新建的Object不是(not to be)另一個(gè)新建的Object,但是它們是相等(to equal)的。
expect({}).not().toBe({});
expect({}).toEqual({});
toNotEqual()
toContain():數(shù)組中是否包含元素(值)。只能用于數(shù)組,不能用于對(duì)象。
toBeCloseTo():是比較兩個(gè)值是否足夠接近(不一定要相等)。
it("The "toBeCloseTo" matcher is for precision math comparison", function() { var pi = 3.1415926, e = 2.78; expect(pi).not.toBeCloseTo(e, 2); expect(pi).toBeCloseTo(e, 0); });
看源碼理解用法
getJasmineRequireObj().toBeCloseTo = function () { function toBeCloseTo() { return { compare: function (actual, expected, precision) { if (precision !== 0) { precision = precision || 2; } return { pass: Math.abs(expected - actual) < (Math.pow(10, -precision) / 2) }; } }; } return toBeCloseTo; };
比如第二個(gè)expect就是如果pi-e的絕對(duì)值小于10的-0次方除以2的值,斷言通過(guò)
toMatch():按正則表達(dá)式匹配。
toNotMatch()
toThrow():檢驗(yàn)一個(gè)函數(shù)是否會(huì)拋出一個(gè)錯(cuò)誤
it("toThrow判斷一個(gè)函數(shù)是否有拋出異常", function() { var foo = function() { return 1 + 2; }; var bar = function() { return a + 1; //a不存在 }; expect(foo).not.toThrow(); expect(bar).toThrow(); });
其他matchers
jasmine.any(Class)
傳入構(gòu)造函數(shù)或者類返回?cái)?shù)據(jù)類型作為期望值,返回true表示實(shí)際值和期望值數(shù)據(jù)類型相同:
it("matches any value", function() { expect({}).toEqual(jasmine.any(Object)); expect(12).toEqual(jasmine.any(Number)); });
jasmine.anything()
如果實(shí)際值不是null或者undefined則返回true:
it("matches anything", function() { expect(1).toEqual(jasmine.anything()); });
jasmine.objectContaining({key:value})
實(shí)際對(duì)象只要匹配到有對(duì)應(yīng)的鍵/值就算匹配通過(guò):
foo = { a: 1, b: 2, bar: "baz" }; expect(foo).toEqual(jasmine.objectContaining({bar: "baz"}));
jasmine.arrayContaining([val1,val2,...])
實(shí)際數(shù)組只要匹配到有包含的數(shù)值就算匹配通過(guò):
foo = [1, 2, 3, 4]; expect(foo).toEqual(jasmine.arrayContaining([3, 1]));
jasmine.stringContaining(str)
stringContaining可以匹配字符串的一部分也可以匹配對(duì)象內(nèi)的字符串:
expect({foo: "bar"}).toEqual({foo: jasmine.stringMatching(/^bar$/)}); expect("foobarbaz").toEqual({foo: jasmine.stringMatching("bar")});Setup and Teardown
為了在復(fù)雜的測(cè)試用例中更加便于組裝和拆卸,Jasmine提供了四個(gè)函數(shù):
beforeEach(function) //在每一個(gè)測(cè)試用例(it)執(zhí)行之前都執(zhí)行一遍beforeEach函數(shù);
afterEach(function) //在每一個(gè)測(cè)試用例(it)執(zhí)行完成之后都執(zhí)行一遍afterEach函數(shù);
beforeAll(function) //在所有測(cè)試用例執(zhí)行之前執(zhí)行一遍beforeAll函數(shù);
afterAll(function) //在所有測(cè)試用例執(zhí)行完成之后執(zhí)行一遍afterAll函數(shù);
jasmine還有自定義matcher的功能和一些高級(jí)功能,暫時(shí)沒(méi)有用到,有機(jī)會(huì)學(xué)習(xí)下
參考資料JavaScript單元測(cè)試框架——Jasmine入門
JavaScript 單元測(cè)試框架:Jasmine 初探
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80001.html
摘要:很快我發(fā)現(xiàn)有一個(gè)誤區(qū),許多人認(rèn)為單元測(cè)試必須是一個(gè)集中運(yùn)行所有單元的測(cè)試,并一目了然。許多人認(rèn)為單元測(cè)試,甚至整個(gè)測(cè)試都是在編碼結(jié)束后的一道工序,而修復(fù)也不過(guò)是在做垃圾掩埋一類的工作。 單元測(cè)試Unit Test 很早就知道單元測(cè)試這樣一個(gè)概念,但直到幾個(gè)月前,我真正開始接觸和使用它。究竟什么是單元測(cè)試?我想也許很多使用了很久的人也不一定能描述的十分清楚,所以寫了這篇文章來(lái)嘗試描述它...
摘要:?jiǎn)卧獪y(cè)試我們可以將其分成兩類獨(dú)立單獨(dú)測(cè)試與測(cè)試工具集。工具集還有更多,這一切我們將在單元測(cè)試組件與指令單元測(cè)試逐一說(shuō)明。那么下一篇,我們將介紹如何使用進(jìn)行單元測(cè)試。 本文將探討如何搭建測(cè)試環(huán)境、以及Angular測(cè)試工具集。 測(cè)試環(huán)境 絕大部分都是利用Angular Cli來(lái)創(chuàng)建項(xiàng)目,因此,默認(rèn)已經(jīng)集成我們所需要的npm包與腳本;當(dāng)然,如果你是使用自建或官網(wǎng) quickstart 的話...
摘要:小結(jié)我們初步了解了使用來(lái)進(jìn)行測(cè)試,這樣有利于我們接下來(lái)去理解使用進(jìn)行單元測(cè)試翻譯中 showImg(https://segmentfault.com/img/bVxI9p); 這是一些列文章,陸續(xù)翻譯整理中... 原文地址:http://www.bradoncode.com/blog/2015/05/12/angularjs-testing-getting-started/ @ Bra...
摘要:不論你是在寫瀏覽器端還是后端的,總存在那么一個(gè)問(wèn)題我該使用什么單元測(cè)試庫(kù)去確保我的代碼如預(yù)期的運(yùn)行呢總是有那么一些流行的框架可供選擇。在中仍然流行,并且擁有來(lái)自許多地方性的支持。如果你的測(cè)試使用它,直到調(diào)用了才能通過(guò)。 不論你是在寫瀏覽器端javascript還是后端的nodejs,總存在那么一個(gè)問(wèn)題:我該使用什么單元測(cè)試庫(kù)去確保我的代碼如預(yù)期的運(yùn)行呢?總是有那么一些流行的框架可供選擇...
摘要:框架本身可以很好地支持自下而上的單元測(cè)試。在中,這些原因可以分為性能真實(shí)的操作,依靠定時(shí)行為及網(wǎng)絡(luò)活動(dòng)減慢了測(cè)試隔離單元測(cè)試應(yīng)把重點(diǎn)放在小的一塊功能成為可能,并解耦不可靠的或低依賴使用對(duì)象是擁抱和的基本組成部分。 最近在慢慢深入Backbone,也試著寫一些測(cè)試,找一些合適的文檔來(lái)學(xué)習(xí)。于是就找到了一個(gè)系列的文章 : Testing Backbone applications with...
閱讀 2497·2023-04-25 19:24
閱讀 1716·2021-11-11 16:54
閱讀 2842·2021-11-08 13:19
閱讀 3556·2021-10-25 09:45
閱讀 2563·2021-09-13 10:24
閱讀 3293·2021-09-07 10:15
閱讀 4046·2021-09-07 10:14
閱讀 2962·2019-08-30 15:56