摘要:塊就是測試用例,表示一個多帶帶的測試,塊可以包含多個斷言塊塊就是斷言,判斷預(yù)期結(jié)果和執(zhí)行結(jié)果是否一致失敗的話會打印錯誤提示注意因為箭頭函數(shù)不能夠訪問的上下文,所以在需要用到上下文的時候不能使用,否則報錯。
前言
我的英文水平有點渣,所以就貼上原文給你們自己翻譯了,還有g(shù)ithub地址,如果發(fā)現(xiàn)有些中文文檔的話也會順便贈送飛機(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是一個能在nodejs和瀏覽器環(huán)境運行的有著豐富功能的javascript測試框架,使異步測試變得簡單有趣,Mocha測試持續(xù)運行,能獲得靈活和精確的報告,當(dāng)發(fā)生未知錯誤能映射到正確的測試案例.
Mocha地址
Mocha中文文檔
是一個很出名的測試框架了,估計有接觸過測試代碼的人都知道的東西
安裝
npm install --global mocha
運行終端
mocha
系統(tǒng)會自動搜索當(dāng)前目錄下的test.js文件運行
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是一個可表達(dá)性,可閱讀性,與框架無關(guān)的斷言庫,這個庫的主要目標(biāo)是變得可表達(dá)和可幫助,它使你的測試代碼整潔和有幫助的錯誤信息.
默認(rèn)(當(dāng)你引入should)會在對象原型上擴(kuò)展一個多帶帶不可枚舉的getter允許你去表達(dá)該對象應(yīng)該的行為方式,當(dāng)需要的時候它總是返回本身
它也可以在沒有g(shù)etter擴(kuò)展的情況下使用(甚至不會嘗試去擴(kuò)展對象原型),只要引入(‘should/as-function’),或者如果你已經(jīng)使用自動添加getter的版本,你能調(diào)用無沖突函數(shù).
Results of (something).should getter 和 should(something) 在大多數(shù)情況下都是一樣的
should.js地址
安裝
npm install should --save-dev
斷言庫多種多樣,這是比較出名的一款,但是個人感覺不好用,復(fù)雜的API,冗長的代碼,推薦下面那一款
power-assertPower Assert in JavaScript. Provides descriptive assertion messages through standard assert interface. No API is the best API.
power-assert在JS中通過標(biāo)準(zhǔn)的接口提供了描述性斷言信息,沒有API就是最好的API
power-assert地址
可以通過一行代碼直觀感受一下兩個斷言庫的代碼
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.
另一個js代碼覆蓋工具,當(dāng)運行的時候會通過模塊加載鉤子去計算語句,行,函和分支覆蓋以明顯地添加覆蓋率,支持所有js覆蓋使用案例包括單元測試,服務(wù)端函數(shù)式測試和瀏覽器測試,構(gòu)建測試用例
istanbul地址
describe塊就是測試套件,表示一組相關(guān)的測試,describe塊里面可以包含多個describe塊或者it塊。
it塊就是測試用例,表示一個多帶帶的測試,it塊可以包含多個斷言塊
assert塊就是斷言,判斷預(yù)期結(jié)果和執(zhí)行結(jié)果是否一致,失敗的話會打印錯誤提示
注意:因為箭頭函數(shù)不能夠訪問mocha的上下文,所以在需要用到mocha上下文的時候不能使用,否則報錯。
const assert = require("assert"); describe("你成年了么?", () => { it("我已經(jīng)不是3嵗小孩了!", () => { assert(3 > 18); }); });
打開終端運行命令
mocha
會得出如下結(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本身提供了多個鉤子函數(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()
就如字面意思一樣,可以用來控制測試用例只執(zhí)行或者跳過某些用例而不是采用注釋的方法來改變測試用例
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); }); }); });多次測試retries()
有些時候不是一次測試就能達(dá)到要求的,mocha提供了retries()來設(shè)置重試次數(shù),只要在超過次數(shù)并且都失敗的情況下才會報錯
const assert = require("assert"); describe("猜大小勝利的幾率?", function() { it.only("我買大!", function() { this.retries(5); assert(Math.random() > 0.5); }); });時間控制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ù)和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])
看起來種類繁多,其實都可以一個assert()實現(xiàn),所以說No API is the best API。隨便舉個例子:
const assert = require("assert"); describe("全等比較?", function() { it("a和b全等么?", async function() { assert.deepStrictEqual(18, "18", "a和b不全等!"); }); });istanbul
我們用istanbul來做結(jié)尾吧,這是一個測試代碼覆蓋率的庫,跟上面兩個沒什么關(guān)系。主要是以下四個維度來測試執(zhí)行代碼率
Statements : 語句覆蓋率
Branches : 分支覆蓋率
Functions : 函數(shù)覆蓋率
Lines : 行覆蓋率
我們隨便寫一些加減乘除的測試代碼
const a = 3, b = 18; function add(a, b) { console.log(a + b); } function reduce() { console.log(a - b); } add(a, b);
然后運行
istanbul cover 你的js腳本名
![圖片描述](attimg://article/content/picture/201810/07/151727srxavvairzrpyxvr.png)
然后當(dāng)下目錄還會生成一個coverage文件夾
具體作用我也沒研究,但是里面的lcov-report是可以在瀏覽器打開的測試報告
mocha作為常規(guī)測試庫,power-assert是簡約的斷言庫,搭配istanbul做代碼覆蓋率可以滿足一個基本需求了,因為我本身不會用到這些東西只是簡單了解基礎(chǔ)用法,上面例子都是在編輯器終端運行,實際開發(fā)中會嵌入項目package.json做特殊處理,有興趣的可自行研究。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/110310.html
摘要:原文鏈接在中貫徹單元測試在團(tuán)隊合作中,你寫好了一個函數(shù),供隊友使用,跑去跟你的隊友說,你傳個值進(jìn)去,他就會返回結(jié)果了。如果你也為社區(qū)貢獻(xiàn)過,想更多人使用的話,加上單元測試吧,讓你的值得別人信賴。 原文鏈接:BlueSun | 在Nodejs中貫徹單元測試 在團(tuán)隊合作中,你寫好了一個函數(shù),供隊友使用,跑去跟你的隊友說,你傳個A值進(jìn)去,他就會返回B結(jié)果了。過了一會,你隊友跑過來說,我傳個A...
摘要:在真正寫了一段時間的基礎(chǔ)組件和基礎(chǔ)工具后,才發(fā)現(xiàn)自動化測試有很多好處。有了自動化測試,開發(fā)者會更加信任自己的代碼。由于維護(hù)測試用例也是一大筆開銷畢竟沒有多少測試會專門幫前端寫業(yè)務(wù)測試用例,而前端使用的流程自動化工具更是沒有測試參與了。 本文轉(zhuǎn)載自 天貓前端博客,更多精彩文章請進(jìn)入天貓前端博客查看 前言 為何要測試 以前不喜歡寫測試,主要是覺得編寫和維護(hù)測試用例非常的浪費時間。在真正寫了...
摘要:為什么要寫單元測試減少提高代碼質(zhì)量,保證你的代碼是可測試的放心重構(gòu)當(dāng)你每個方法都寫了單元測試的時候,你每一個改動都會影響相應(yīng)的單元測試,這樣你不用費盡心思的考慮哪里會有影響,特別是復(fù)雜項目或非核心功能不易被測試到,從而導(dǎo)致的產(chǎn)生。 為什么要寫單元測試 減少bug 提高代碼質(zhì)量,保證你的代碼是可測試的 放心重構(gòu) 當(dāng)你每個方法都寫了單元測試的時候,你每一個改動都會影響相應(yīng)的單元測試,這...
閱讀 3094·2021-11-24 09:38
閱讀 1345·2021-09-22 15:27
閱讀 2980·2021-09-10 10:51
閱讀 1518·2021-09-09 09:33
閱讀 931·2021-08-09 13:47
閱讀 2095·2019-08-30 13:05
閱讀 902·2019-08-29 15:15
閱讀 2439·2019-08-29 12:21