摘要:塊就是測(cè)試用例,表示一個(gè)多帶帶的測(cè)試,塊可以包含多個(gè)斷言塊塊就是斷言,判斷預(yù)期結(jié)果和執(zhí)行結(jié)果是否一致失敗的話會(huì)打印錯(cuò)誤提示注意因?yàn)榧^函數(shù)不能夠訪問的上下文,所以在需要用到上下文的時(shí)候不能使用,否則報(bào)錯(cuò)。
前言
我的英文水平有點(diǎn)渣,所以就貼上原文給你們自己翻譯了,還有g(shù)ithub地址,如果發(fā)現(xiàn)有些中文文檔的話也會(huì)順便贈(zèng)送飛機(jī)票
mochaMocha is a feature-rich JavaScript test framework running on Node.js and in the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. Hosted on GitHub.
Mocha是一個(gè)能在nodejs和瀏覽器環(huán)境運(yùn)行的有著豐富功能的javascript測(cè)試框架,使異步測(cè)試變得簡(jiǎn)單有趣,Mocha測(cè)試持續(xù)運(yùn)行,能獲得靈活和精確的報(bào)告,當(dāng)發(fā)生未知錯(cuò)誤能映射到正確的測(cè)試案例.
Mocha地址
Mocha中文文檔
是一個(gè)很出名的測(cè)試框架了,估計(jì)有接觸過(guò)測(cè)試代碼的人都知道的東西
安裝
npm install --global mocha
運(yùn)行終端
mocha
系統(tǒng)會(huì)自動(dòng)搜索當(dāng)前目錄下的test.js文件運(yùn)行
shouldshould is an expressive, readable, framework-agnostic assertion library. The main goals of this library are to be expressive and to be helpful. It keeps your test code clean, and your error messages helpful.By default (when you require("should")) should extends the Object.prototype with a single non-enumerable getter that allows you to express how that object should behave. It also returns itself when required with require.
It is also possible to use should.js without getter (it will not even try to extend Object.prototype), just require("should/as-function"). Or if you already use version that auto add getter, you can call .noConflict function.
Results of (something).should getter and should(something) in most situations are the same
should是一個(gè)可表達(dá)性,可閱讀性,與框架無(wú)關(guān)的斷言庫(kù),這個(gè)庫(kù)的主要目標(biāo)是變得可表達(dá)和可幫助,它使你的測(cè)試代碼整潔和有幫助的錯(cuò)誤信息.
默認(rèn)(當(dāng)你引入should)會(huì)在對(duì)象原型上擴(kuò)展一個(gè)多帶帶不可枚舉的getter允許你去表達(dá)該對(duì)象應(yīng)該的行為方式,當(dāng)需要的時(shí)候它總是返回本身
它也可以在沒有g(shù)etter擴(kuò)展的情況下使用(甚至不會(huì)嘗試去擴(kuò)展對(duì)象原型),只要引入(‘should/as-function’),或者如果你已經(jīng)使用自動(dòng)添加getter的版本,你能調(diào)用無(wú)沖突函數(shù).
Results of (something).should getter 和 should(something) 在大多數(shù)情況下都是一樣的
should.js地址
安裝
npm install should --save-dev
斷言庫(kù)多種多樣,這是比較出名的一款,但是個(gè)人感覺不好用,復(fù)雜的API,冗長(zhǎng)的代碼,推薦下面那一款
power-assertPower Assert in JavaScript. Provides descriptive assertion messages through standard assert interface. No API is the best API.
power-assert在JS中通過(guò)標(biāo)準(zhǔn)的接口提供了描述性斷言信息,沒有API就是最好的API
power-assert地址
可以通過(guò)一行代碼直觀感受一下兩個(gè)斷言庫(kù)的代碼
should.js: (1).should.eql(10); assert.js: assert(1 === 10);istanbul
Yet another JS code coverage tool that computes statement, line, function and branch coverage with module loader hooks to transparently add coverage when running tests. Supports all JS coverage use cases including unit tests, server side functional tests and browser tests. Built for scale.
另一個(gè)js代碼覆蓋工具,當(dāng)運(yùn)行的時(shí)候會(huì)通過(guò)模塊加載鉤子去計(jì)算語(yǔ)句,行,函和分支覆蓋以明顯地添加覆蓋率,支持所有js覆蓋使用案例包括單元測(cè)試,服務(wù)端函數(shù)式測(cè)試和瀏覽器測(cè)試,構(gòu)建測(cè)試用例
istanbul地址
describe塊就是測(cè)試套件,表示一組相關(guān)的測(cè)試,describe塊里面可以包含多個(gè)describe塊或者it塊。
it塊就是測(cè)試用例,表示一個(gè)多帶帶的測(cè)試,it塊可以包含多個(gè)斷言塊
assert塊就是斷言,判斷預(yù)期結(jié)果和執(zhí)行結(jié)果是否一致,失敗的話會(huì)打印錯(cuò)誤提示
注意:因?yàn)榧^函數(shù)不能夠訪問mocha的上下文,所以在需要用到mocha上下文的時(shí)候不能使用,否則報(bào)錯(cuò)。
const assert = require("assert"); describe("你成年了么?", () => { it("我已經(jīng)不是3嵗小孩了!", () => { assert(3 > 18); }); });
打開終端運(yùn)行命令
mocha
會(huì)得出如下結(jié)果
如果將代碼換成assert(30 > 18)則如下
const assert = require("assert"); function timer(ms) { return new Promise(resolve => setTimeout(() => resolve(3), ms)); } describe("你成年了么?", () => { it("我已經(jīng)不是3嵗小孩了!", async () => { const age = await timer(1000); assert(age > 18); }); });鉤子函數(shù)
mocha本身提供了多個(gè)鉤子函數(shù)以供使用,官方摘抄如下:
run "mocha spec.js" | spawn child process | |--------------> inside child process process and apply options | run spec file/s | |--------------> per spec file suite callbacks (e.g., "describe") | "before" root-level pre-hook | "before" pre-hook | |--------------> per test "beforeEach" root-level pre-hook | "beforeEach" pre-hook | test callbacks (e.g., "it") | "afterEach" post-hook | "afterEach" root-level post-hook |<-------------- per test end | "after" post-hook | "after" root-level post-hooks |<-------------- per spec file end |<-------------- inside child process end
const assert = require("assert"); let a = 1; describe("你成年了么?", () => { before("beforeEach", () => console.log(`before: ${a}`)); beforeEach("beforeEach", () => console.log(`beforeEach: ${a}`)); afterEach("afterEach", () => console.log(`afterEach: ${a}`)); after("afterEach", () => console.log(`after: ${a}`)); it("我已經(jīng)不是3嵗小孩了!", () => { a = 2; assert(30 > 18); }); });流程控制only(),ship()
就如字面意思一樣,可以用來(lái)控制測(cè)試用例只執(zhí)行或者跳過(guò)某些用例而不是采用注釋的方法來(lái)改變測(cè)試用例
const assert = require("assert"); describe("你成年了么?", () => { it.skip("我已經(jīng)不是3嵗小孩了!", () => { assert(30 > 18); }); it.only("我是3嵗小孩!", () => { assert(3 > 18); }); });
注意:流程控制不僅可以用在it塊,也能用在describe塊,例如:
const assert = require("assert"); describe("你成年了么?", () => { describe.skip("成年人", () => { it("我已經(jīng)不是3嵗小孩了!", () => { assert(30 > 18); }); }); describe.only("未成年人", () => { it("我是3嵗小孩!", () => { assert(3 > 18); }); }); });多次測(cè)試retries()
有些時(shí)候不是一次測(cè)試就能達(dá)到要求的,mocha提供了retries()來(lái)設(shè)置重試次數(shù),只要在超過(guò)次數(shù)并且都失敗的情況下才會(huì)報(bào)錯(cuò)
const assert = require("assert"); describe("猜大小勝利的幾率?", function() { it.only("我買大!", function() { this.retries(5); assert(Math.random() > 0.5); }); });時(shí)間控制timeout()
如下所示:
const assert = require("assert"); function timer(ms) { return new Promise(resolve => setTimeout(() => resolve(3), ms)); } describe("你成年了么?", function() { it("我已經(jīng)不是3嵗小孩了!", async function() { this.timeout(500); const age = await timer(1000); assert(age > 18); }); });
注意:0是禁止超時(shí),也可以用在鉤子函數(shù)和describe塊上
assert(value, [message])
assert.ok(value, [message])
assert.equal(actual, expected, [message])
assert.notEqual(actual, expected, [message])
assert.strictEqual(actual, expected, [message])
assert.notStrictEqual(actual, expected, [message])
assert.deepEqual(actual, expected, [message])
assert.notDeepEqual(actual, expected, [message])
assert.deepStrictEqual(actual, expected, [message])
assert.notDeepStrictEqual(actual, expected, [message])
看起來(lái)種類繁多,其實(shí)都可以一個(gè)assert()實(shí)現(xiàn),所以說(shuō)No API is the best API。隨便舉個(gè)例子:
const assert = require("assert"); describe("全等比較?", function() { it("a和b全等么?", async function() { assert.deepStrictEqual(18, "18", "a和b不全等!"); }); });istanbul
我們用istanbul來(lái)做結(jié)尾吧,這是一個(gè)測(cè)試代碼覆蓋率的庫(kù),跟上面兩個(gè)沒什么關(guān)系。主要是以下四個(gè)維度來(lái)測(cè)試執(zhí)行代碼率
Statements : 語(yǔ)句覆蓋率
Branches : 分支覆蓋率
Functions : 函數(shù)覆蓋率
Lines : 行覆蓋率
我們隨便寫一些加減乘除的測(cè)試代碼
const a = 3, b = 18; function add(a, b) { console.log(a + b); } function reduce() { console.log(a - b); } add(a, b);
然后運(yùn)行
istanbul cover 你的js腳本名
![圖片描述](attimg://article/content/picture/201810/07/151727srxavvairzrpyxvr.png)
然后當(dāng)下目錄還會(huì)生成一個(gè)coverage文件夾
具體作用我也沒研究,但是里面的lcov-report是可以在瀏覽器打開的測(cè)試報(bào)告
mocha作為常規(guī)測(cè)試庫(kù),power-assert是簡(jiǎn)約的斷言庫(kù),搭配istanbul做代碼覆蓋率可以滿足一個(gè)基本需求了,因?yàn)槲冶旧聿粫?huì)用到這些東西只是簡(jiǎn)單了解基礎(chǔ)用法,上面例子都是在編輯器終端運(yùn)行,實(shí)際開發(fā)中會(huì)嵌入項(xiàng)目package.json做特殊處理,有興趣的可自行研究。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/110310.html
摘要:本文只討論單測(cè)的范疇,對(duì)集成測(cè)試有興趣的話,可以看下的集成測(cè)試代碼。前端單測(cè)現(xiàn)狀測(cè)試本質(zhì)上就是假定一個(gè)輸入,然后判斷得到預(yù)期的輸出。 原文發(fā)于我的博客:https://github.com/hwen/blogS... 要不要寫單測(cè)? 關(guān)于這個(gè) cnode 上就有個(gè)很有意思的討論 做個(gè)調(diào)查,你的 Node 應(yīng)用有寫單測(cè)嗎? 看完這個(gè)應(yīng)該會(huì)有結(jié)論?如果沒有,就回帖跟別人探討下~ 測(cè)試 測(cè)試...
摘要:原文鏈接在中貫徹單元測(cè)試在團(tuán)隊(duì)合作中,你寫好了一個(gè)函數(shù),供隊(duì)友使用,跑去跟你的隊(duì)友說(shuō),你傳個(gè)值進(jìn)去,他就會(huì)返回結(jié)果了。如果你也為社區(qū)貢獻(xiàn)過(guò),想更多人使用的話,加上單元測(cè)試吧,讓你的值得別人信賴。 原文鏈接:BlueSun | 在Nodejs中貫徹單元測(cè)試 在團(tuán)隊(duì)合作中,你寫好了一個(gè)函數(shù),供隊(duì)友使用,跑去跟你的隊(duì)友說(shuō),你傳個(gè)A值進(jìn)去,他就會(huì)返回B結(jié)果了。過(guò)了一會(huì),你隊(duì)友跑過(guò)來(lái)說(shuō),我傳個(gè)A...
摘要:在真正寫了一段時(shí)間的基礎(chǔ)組件和基礎(chǔ)工具后,才發(fā)現(xiàn)自動(dòng)化測(cè)試有很多好處。有了自動(dòng)化測(cè)試,開發(fā)者會(huì)更加信任自己的代碼。由于維護(hù)測(cè)試用例也是一大筆開銷畢竟沒有多少測(cè)試會(huì)專門幫前端寫業(yè)務(wù)測(cè)試用例,而前端使用的流程自動(dòng)化工具更是沒有測(cè)試參與了。 本文轉(zhuǎn)載自 天貓前端博客,更多精彩文章請(qǐng)進(jìn)入天貓前端博客查看 前言 為何要測(cè)試 以前不喜歡寫測(cè)試,主要是覺得編寫和維護(hù)測(cè)試用例非常的浪費(fèi)時(shí)間。在真正寫了...
摘要:為什么要寫單元測(cè)試減少提高代碼質(zhì)量,保證你的代碼是可測(cè)試的放心重構(gòu)當(dāng)你每個(gè)方法都寫了單元測(cè)試的時(shí)候,你每一個(gè)改動(dòng)都會(huì)影響相應(yīng)的單元測(cè)試,這樣你不用費(fèi)盡心思的考慮哪里會(huì)有影響,特別是復(fù)雜項(xiàng)目或非核心功能不易被測(cè)試到,從而導(dǎo)致的產(chǎn)生。 為什么要寫單元測(cè)試 減少bug 提高代碼質(zhì)量,保證你的代碼是可測(cè)試的 放心重構(gòu) 當(dāng)你每個(gè)方法都寫了單元測(cè)試的時(shí)候,你每一個(gè)改動(dòng)都會(huì)影響相應(yīng)的單元測(cè)試,這...
摘要:為保證代碼的質(zhì)量,單元測(cè)試必不可少。本文記錄自己在學(xué)習(xí)單元測(cè)試過(guò)程中的一些總結(jié)。以一個(gè)項(xiàng)目為例,代碼結(jié)構(gòu)如下前端測(cè)試框架主要是與,這里我們選擇,斷言庫(kù)有以及自帶的。 為保證代碼的質(zhì)量,單元測(cè)試必不可少。本文記錄自己在學(xué)習(xí)單元測(cè)試過(guò)程中的一些總結(jié)。 TDD與BDD的區(qū)別 TDD屬于測(cè)試驅(qū)動(dòng)開發(fā),BDD屬于行為驅(qū)動(dòng)開發(fā)。個(gè)人理解其實(shí)就是TDD先寫測(cè)試模塊,再寫主功能代碼,然后能讓測(cè)試模塊通...
閱讀 3078·2021-11-24 09:38
閱讀 1330·2021-09-22 15:27
閱讀 2968·2021-09-10 10:51
閱讀 1504·2021-09-09 09:33
閱讀 917·2021-08-09 13:47
閱讀 2072·2019-08-30 13:05
閱讀 892·2019-08-29 15:15
閱讀 2425·2019-08-29 12:21