單元測(cè)試 即Unit Testing,簡(jiǎn)稱 UT,是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證,這是*低級(jí)別的測(cè)試活動(dòng),前端開(kāi)發(fā)中單元可以是一個(gè)function也可以是一個(gè)class,也可以是一個(gè)組件。 對(duì)他們的輸出做斷言檢查,是一個(gè)白盒測(cè)試,一般由開(kāi)發(fā)者進(jìn)行編寫(xiě),開(kāi)發(fā)者可以通過(guò)編寫(xiě)執(zhí)行 UT 來(lái)判斷自己的邏輯是否正確。 集成測(cè)試 Integration Testing,其實(shí)集成測(cè)試就是根據(jù)業(yè)務(wù)功能需要把多個(gè)單元整合起來(lái)進(jìn)行測(cè)試。 引用 React 官網(wǎng)上的說(shuō)法:“單元測(cè)試”和“集成測(cè)試”之間的差別可能會(huì)很模糊。 如果你在測(cè)試一個(gè)表單,用例是否應(yīng)該也測(cè)試表單里的按鈕呢?一個(gè)按鈕組件又需不需要有他自己的測(cè)試套件?重構(gòu)按鈕組件是否應(yīng)該影響表單的測(cè)試用例?不同的團(tuán)隊(duì)或產(chǎn)品可能會(huì)得出不同的答案。 端到端測(cè)試 end-to-end,簡(jiǎn)稱 e2e,也被稱作功能測(cè)試(Functional Testing)或者瀏覽器測(cè)試或者冒煙測(cè)試,是指從使用者的角度出發(fā),對(duì)真實(shí)系統(tǒng)進(jìn)行測(cè)試。 e2e測(cè)試本質(zhì)上是一種黑盒測(cè)試,相當(dāng)于模擬用戶訪問(wèn)應(yīng)用程序,主要檢查界面或功能是否正確,自動(dòng)化測(cè)試不完善的時(shí)候通常是由人工來(lái)完成這項(xiàng)測(cè)試工作。 界面測(cè)試 User Interface Testing,簡(jiǎn)稱 UI 測(cè)試,與 e2e 測(cè)試存在大量重疊,通常在做 e2e 的時(shí)候就能夠覆蓋 UI 測(cè)試。 TDD Test Drive Development 即測(cè)試驅(qū)動(dòng)開(kāi)發(fā)。 簡(jiǎn)單的說(shuō)就是先根據(jù)需求寫(xiě)測(cè)試用例,再代碼實(shí)現(xiàn),接著測(cè)試,循環(huán)此過(guò)程直到產(chǎn)品的實(shí)現(xiàn)。 可以看出來(lái),TDD的基本思路就是通過(guò)測(cè)試來(lái)推動(dòng)整個(gè)開(kāi)發(fā)的進(jìn)行,但測(cè)試驅(qū)動(dòng)開(kāi)發(fā)并不只是單純的測(cè)試工作,而是把需求分析、設(shè)計(jì)、質(zhì)量控制量化的過(guò)程。 BDD Behavior Drive Development即行為驅(qū)動(dòng)開(kāi)發(fā),BDD 可以看作是對(duì) TDD 的一種補(bǔ)充,或者說(shuō)是 TDD 的一個(gè)分支。 在 TDD 中,我們并不能完全保證根據(jù)設(shè)計(jì)所編寫(xiě)的測(cè)試就是用戶所期望的功能。BDD 將這一部分簡(jiǎn)單和自然化,用自然語(yǔ)言來(lái)描述,讓開(kāi)發(fā)、測(cè)試、BA 以及客戶都能在這個(gè)基礎(chǔ)上達(dá)成一致。 BDD 更加依賴于需求行為和文檔來(lái)驅(qū)動(dòng)開(kāi)發(fā),這些文檔的描述跟測(cè)試代碼很相似。e2e 測(cè)試更多是和 BDD 的開(kāi)發(fā)模式進(jìn)行結(jié)合。 綜上所述,后文主要會(huì)針對(duì)單元測(cè)試和端到端測(cè)試常用的工具進(jìn)行使用說(shuō)明和對(duì)比。
前端測(cè)試工具有很多,可以分為幾類: 斷言庫(kù) 測(cè)試覆蓋率工具 測(cè)試框架 斷言庫(kù) 測(cè)試的時(shí)候我們需要使用斷言來(lái)判斷代碼是否到達(dá)目的,如果沒(méi)有斷言,我們的測(cè)試也將失去意義。
assert assert 是 Node.JS 內(nèi)置的斷言庫(kù),下面是一個(gè)簡(jiǎn)單的例子: const assert 'assert' ); assert ( 1 2 ); const 'hello world' ; assert .strictEqual( 'helloworld' (左右滑動(dòng)查看完整代碼)
chai 這個(gè)斷言庫(kù)很全很強(qiáng)大,提供了常用的 assert、should、expect 斷言關(guān)鍵字。
https://mmbiz.qpic.cn/mmbiz_png/BuV4gXrNvFpz7OkR8H9LSKVmTx126AILrVT0x2WOyQkc5TWrb0zFicGV7mPib6ibH8X6ju4UmnPMVic52JHDPDXEfA/640?wx_fmt=png
power-assert 如果你在使用assert的話,無(wú)需使用require('power-assert')來(lái)引入power-assert,它的API與assert一樣,而且擁有強(qiáng)大的提示信息,如下圖所示。
(左右滑動(dòng)查看完整代碼) 安裝: npmipower- assert (左右滑動(dòng)查看完整代碼) 測(cè)試覆蓋率工具
Istanbul 這個(gè)軟件以土耳其*大城市伊斯坦布爾命名,因?yàn)橥炼涞靥菏澜缏劽?,而地毯是用?lái)覆蓋的。 安裝: npm install-gistanbul (左右滑動(dòng)查看完整代碼) 運(yùn)行: istanbul coverpath (左右滑動(dòng)查看完整代碼) 測(cè)試框架 測(cè)試框架的作用是提供一些方便的語(yǔ)法來(lái)描述測(cè)試用例,比如可以對(duì)一組用例進(jìn)預(yù)處理和后處理(beforeAll、beforeEach、afterAll、afterEach等),使用 describe函數(shù)表示一組用例,下面將會(huì)列舉一些常見(jiàn)的測(cè)試框架,并做簡(jiǎn)單的分析。
Jest Jest 是Facebook出品的一個(gè)測(cè)試框架,算是一個(gè)大而全的測(cè)試框架,內(nèi)置斷言、測(cè)試覆蓋率工具、Mock工具,開(kāi)箱即用,支持瀏覽器和 NodeJS,支持BDD寫(xiě)法(也就是expect語(yǔ)法)是React官方推薦使用的測(cè)試框架。 Jest既可以用來(lái)做單元測(cè)試,也可以用來(lái)做端到端測(cè)試,在做端到端測(cè)試的時(shí)候可以使用jsdom,網(wǎng)絡(luò)請(qǐng)求使用本地mock數(shù)據(jù),這樣可以確保毫秒級(jí)完成單元測(cè)試,如果需要使用真實(shí)DOM,還是需要配合其它測(cè)試工具。
Mocha Macha也是一個(gè)功能豐富的JS測(cè)試框架,支持瀏覽器和 NodeJS,不過(guò)沒(méi)有內(nèi)置斷言庫(kù)、測(cè)試覆蓋率工具和Mock工具,需要和其他三方庫(kù)配合使用,比如配合chai使用 就可以支持TDD寫(xiě)法(也就是assert.equal語(yǔ)法),當(dāng)然 BDD 寫(xiě)法也是支持的。 Mocha既可以用來(lái)做單元測(cè)試,也可以用來(lái)做端到端測(cè)試,做端到端測(cè)試的時(shí)候需要配合其它測(cè)試工具。
Jasmine Jasmine 是一個(gè)BDD 測(cè)試框架,支持瀏覽器和NodeJS 、內(nèi)置斷言庫(kù)、mock 工具等,經(jīng)常配合Karam使用,但是隨著Jest這種大而全的框架的崛起,Jasmine顯得比較老派,現(xiàn)在熱度逐年下降,使用的人也越來(lái)越少。 e2e測(cè)試工具
Cypress Cypress是一個(gè)e2e測(cè)試框架,測(cè)試界面和文檔做到的一個(gè)產(chǎn)品。
PhantomJS PhantomJS,一個(gè)基于 webkit 內(nèi)核的無(wú)頭瀏覽器,沒(méi)有 UI 界面。用js代碼模擬一些web界面上的操作,用起來(lái)比較不方便,不太推薦使用。
NightmareJS NightmareJS,一個(gè)輕量級(jí)瀏覽器自動(dòng)化測(cè)試庫(kù)?;贓lectron,和PhantomJS類似,但是快了大約2倍且更現(xiàn)代。 Nightmare還有個(gè)優(yōu)點(diǎn)——它提供了一個(gè)Chrome插件 daydream,該插件可以通過(guò)錄制屏幕,自動(dòng)化生成測(cè)試代碼,不過(guò)最近一次更新是在2019年,也不太推薦使用。
Playwright Playwright為現(xiàn)代web應(yīng)用程序提供可靠的端到端測(cè)試。支持使用NodeJS、python、Java、.net四種編程語(yǔ)言的 API,同時(shí)支持Google Chrome和Microsoft Edge(帶有Chromium)、Apple Safari(帶有WebKit)和 Mozilla Firefox。 Playwright支持所有瀏覽器和所有平臺(tái)的無(wú)頭(無(wú)瀏覽器 UI)和有頭(帶瀏覽器 UI)模式。Headed非常適合調(diào)試,而Headless速度更快,適合CI/云執(zhí)行。
Storybook Storybook 是一個(gè)開(kāi)源工具,用于獨(dú)立構(gòu)建 UI 組件和頁(yè)面,它簡(jiǎn)化了 UI 開(kāi)發(fā)、測(cè)試和文檔編制。
Selenium Selenium是e2e測(cè)試鼻祖級(jí)的框架,有多種編程語(yǔ)言的版本,它是基于webdriver而不是webkit內(nèi)核實(shí)現(xiàn)的,所以,Selenium的瀏覽器兼容性相對(duì)于其他瀏覽器要好很多。
Nightwatch Nightwatch原Selenium,是一個(gè)用于web網(wǎng)站或應(yīng)用的自動(dòng)化測(cè)試框架,使用node.js和W3C WebDriver API。 他也是一個(gè)完整和集成的解決方案,使用 BDD 方式,用于網(wǎng)絡(luò)應(yīng)用程序和網(wǎng)站的端到端測(cè)試。它還可用于Node.js 單元和集成測(cè)試。 Nightwatch 的兼容性比較好,F(xiàn)irefox、Chrome、Safari、edge都可以測(cè)。
Protractor Protractor是一個(gè)針對(duì)Angular的e2e測(cè)試框架。 測(cè)試框架運(yùn)行環(huán)境
Karam Karam官網(wǎng)介紹是一個(gè)可以在多個(gè)瀏覽器中執(zhí)行 js 代碼的簡(jiǎn)單工具。它不是一個(gè)完整的測(cè)試框架,沒(méi)有斷言庫(kù),只是啟動(dòng)了一個(gè) http 服務(wù)器,然后生成測(cè)試 html 文件,執(zhí)行測(cè)試用例的 js。 嚴(yán)格來(lái)講Karam其實(shí)不算是一個(gè)測(cè)試框架,而是一個(gè)運(yùn)行測(cè)試框架的環(huán)境。
Puppeteer 既然是瀏覽器,那么我們手工可以在瀏覽器上做的事情Puppeteer都能勝任,另外,Puppeteer 翻譯成中文是”木偶”意思,所以聽(tīng)名字就知道,操縱起來(lái)很方便。 配合headless-recorder,一個(gè)Chrome插件,可以對(duì)操作進(jìn)行錄制,錄制的操作有puppeteer和playwright兩個(gè)版本。 其它測(cè)試工具
AVA AVA是Node.JS的測(cè)試工具,具有簡(jiǎn)潔的API、詳細(xì)的錯(cuò)誤輸出、支持新語(yǔ)法以及流程隔離。
鏈接: https://juejin.cn/post/6978852736976551950 本文為經(jīng)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載文章所包含的文字來(lái)源于原作者。如因內(nèi)容或版權(quán)等問(wèn)題,請(qǐng)聯(lián)系刪除
點(diǎn)擊下方 “閱讀原文” ,了解 職業(yè)新風(fēng)向~