通過構建自己的JavaScript測試框架來了解JS測試

2020-09-05 杭州程式設計師小張


測試(單元或集成)是編程中非常重要的一部分。在當今的軟體開發中,單元/功能測試已成為軟體開發的組成部分。隨著Nodejs的出現,我們已經看到了許多超級JS測試框架的發布:JasmineJest等。

單元測試框架

這有時也稱為隔離測試,它是測試獨立的小段代碼的實踐。如果你的測試使用某些外部資源(例如網絡或資料庫),則不是單元測試。

單元測試框架試圖以人類可讀的格式描述測試,以便非技術人員可以理解所測試的內容。然而,即使你是技術人員,BDD格式的閱讀測試也會使你更容易理解所發生的事情。

例如,如果我們要測試此功能:

function Helloworld() { return &39;;}

我們會像這樣寫一個jasmine測試規範:

describe(&39;, () => { ① it(&39;, () => { ② expect(helloWorld())③.toEqual(&39;); ④ });});

說明:

  • describe(string, function) 函數定義了我們所謂的測試套件,它是各個測試規範的集合。
  • it(string, function) 函數定義了一個單獨的測試規範,其中包含一個或多個測試期望。
  • 預計(實際)表達式就是我們所說的一個期望。它與匹配器一起描述應用程式中預期的行為片段。
  • matcher(預期)表達式就是我們所說的Matcher。如果傳入的期望值與傳遞給Expect函數的實際值不符,則將布爾值與規範進行布爾比較。

安裝和拆卸

有時候為了測試一個功能,我們需要進行一些設置,也許是創建一些測試對象。另外,完成測試後,我們可能需要執行一些清理活動,也許我們需要從硬碟驅動器中刪除一些文件。

這些活動稱為「設置和拆卸」(用於清理),Jasmine有一些功能可用來簡化此工作:

  • beforeAll 這個函數在describe測試套件中的所有規範運行之前被調用一次。
  • afterAll 在測試套件中的所有規範完成後,該函數將被調用一次。
  • beforeEach 這個函數在每個測試規範之前被調用,it 函數已經運行。
  • afterEach 在運行每個測試規範之後調用此函數。

在Node中的使用

在Node項目中,我們在與 src 文件夾相同目錄的 test 文件夾中定義單元測試文件:

node_prj src/ one.js two.js test/ one.spec.js two.spec.js package.json

該測試包含規格文件,這些規格文件是src文件夾中文件的單元測試,package.jsonscript 部分進行了 test

{ ..., &34;: { &34;: &34; // or &34; }}

如果 npm run test 在命令行上運行,則jest測試框架將運行 test 文件夾中的所有規範文件,並在命令行上顯示結果。

現在,我們知道了期望和構建的內容,我們繼續創建自己的測試框架。我們的這個框架將基於Node,也就是說,它將在Node上運行測試,稍後將添加對瀏覽器的支持。

我們的測試框架將包含一個CLI部分,該部分將從命令行運行。第二部分將是測試框架的原始碼,它將位於lib文件夾中,這是框架的核心。

首先,我們首先創建一個Node項目。

mkdir kwuocd kwuonpm init -y

安裝chalk依賴項,我們將需要它來為測試結果上色:npm i chalk

創建一個lib文件夾,其中將存放我們的文件。

mkdir lib

我們創建一個bin文件夾是因為我們的框架將用作Node CLI工具。

mkdir bin

首先創建CLI文件。

在bin文件夾中創建kwuo文件,並添加以下內容:

39;kwuo&39;../lib/cli/cli&39;Hello world&39;says hello&39;Hello world!&39;chalk&39;Test Suites&39;√&39;X&34;nnamdi&39;path&39;fs&39;./../&readdirSync 方法讀取「test」文件夾的內容並返回它們。

  • runTestFiles:它接受數組中的文件,使用 forEach 方法循環遍歷它們,並使用 require 方法運行每個文件。
  • kwuo文件夾結構如下所示:

    測試我們的框架

    我們已經完成了我們的測試框架,讓我們通過一個真實的Node項目對其進行測試。

    我們創建一個Node項目:

    mkdir examplesmkdir examples/mathcd examples/mathnpm init -y

    創建一個src文件夾並添加add.js和sub.js

    mkdir srctouch src/add.js src/sub.js

    add.js和sub.js將包含以下內容:

    // src/add.jsfunction add(a, b) { return a+b}module.exports = add// src/sub.jsfunction sub(a, b) { return a-b}module.exports = sub

    我們創建一個測試文件夾和測試文件:

    mkdir testtouch test/add.spec.js test/sub.spec.js

    規範文件將分別測試add.js和sub.js中的add和sub函數

    // test/sub.spec.jsconst sub = require(&39;)describe(&34;, () => { it(&34;, () => { expect(sub(2, 1)).toEqual(1) }) it(&34;, () => { expect(sub(3, 2)).toEqual(1) })})// test/add.spec.jsconst add = require(&39;)describe(&34;, () => { it(&34;, () => { expect(add(1, 2)).toEqual(3) }) it(&34;, () => { expect(add(2, 3)).toEqual(5) })})describe(&39;, () => { let expected; beforeEach(() => { expected = &34;; }); afterEach(() => { expected = &34;; }); it(&39;, () => { expect(add(&34;, &34;)) .toEqual(expected); });});

    現在,我們將在package.json的「script」部分中運行「test」以運行我們的測試框架:

    { &34;: &34;, &34;: &34;, &34;: &34;, &34;: &34;, &34;: { &34;: &34; }, &34;: [], &34;: &34;, &34;: &34;}

    我們在命令行上運行 npm run test,結果將是這樣的:

    看,它給我們展示了統計數據,通過測試的總數,以及帶有「失敗」或「通過」標記的測試套件列表。看到通過的測試期望「add Hello + World」,它將返回「HelloWorld」,但我們期望返回「Hello」。如果我們糾正它並重新運行測試,所有測試都將通過。

    // test/add.spec.js...describe(&39;, () => { let expected; beforeEach(() => { expected = &34;; }); afterEach(() => { expected = &34;; }); it(&39;, () => { expect(add(&34;, &34;)) .toEqual(expected); });});

    看,我們的測試框架像Jest和Jasmine一樣工作。它僅在Node上運行,在下一篇文章中,我們將使其在瀏覽器上運行。

    代碼在Github上

    Github倉庫地址:philipszdavido/kwuoKwuo

    你可以使用來自NPM的框架:

    cd IN_YOUR_NODE_PROJECTnpm install kwuo -D

    將package.json中的「test」更改為此:

    { ... &34;: { &34;: &34; ... }}

    總結

    我們建立了我們的測試框架,在這個過程中,我們學會了如何使用全局來設置函數和屬性在運行時任何地方可見。

    我們看到了如何在項目中使用 describeitexpect 和各種匹配函數來運行測試。下一次,你使用Jest或Jasmine,你會更有信心,因為現在你知道它們是如何工作的。


    最近整理了一份優質視頻教程資源,想要的可以關注我然後私信「666」即可免費領取哦!如果文章對你有所啟發和幫助,可以點個關注、收藏、轉發,也可以留言討論,這是對作者的最大鼓勵。

    相關焦點

    • 2019年最流行的五大JavaScript 自動化測試框架
      與任何新的測試庫一樣,測試用例是使用行為驅動的開發方法編寫的。用戶可以將用戶的測試用例放在一個名為_tests_的文件夾中,並開始運行它們。(2)Jest被認為是一個有很好文檔的、快速執行的JavaScript測試框架。(3)Jest提供了一種健壯的開發人員工具,代碼更不容易出錯。該框架還可以通過捕獲屏幕截圖來執行可視化回歸測試。
    • javascript在自動化測試項目中的應用「軟體測試開發入門教程」
      比如說我今天分享的主題是javascript在自動化測試中的應用有些朋友說我之前講的自動化測試的東西,需要消化很久,有一定的難度,意思就是說我動不動就講測試框架,測試開發是不是會有這樣的感覺?比如今天分享的javascript,大家做軟體測試有沒有用過?
    • 如何用Mocha測試JavaScript - 基礎知識
      Mocha是最受歡迎的Node.js測試框架之一,它看起來很令人生畏,實際上卻很容易入門。將如下代碼複製到test.js文件中:var assert = require('assert');describe('Array', function() { describe('indexOf() ✓ 當值不存在時,應該返回 -11 passing (9ms)leaf我們的測試通過!太棒了。不過我們不知道為什麼...且聽下面分解。
    • JavaScript單元測試實踐:QUnit在瀏覽器擴展API測試中的應用
      其實並不難理解:官方解釋:「在計算機編程中,單元測試(又稱為模塊測試)是針對程序模塊(軟體設計的最小單位)來進行正確性檢驗的測試工作。程序單元是應用的最小可測試部件。在過程化編程中,一個單元就是單個程序、函數、過程等;對於面向對象編程,最小單元就是方法,包括基類(超類)、抽象類、或者派生類(子類)中的方法。」
    • 如何用Mocha測試JavaScript - 第2部分
      本教程將提供如何使用Mocha進行測試的小型真實示例。到教程結束時,我們將成功使用Mocha測試現有的JS文件。在讀本教程之前,應該先了解Mocha是什麼,如何分組測試以及如何使用斷言庫。如果需要複習,請參閱我的第一篇Mocha教程。項目設置上一個教程中我們已經安裝了Mocha。
    • 基於TensorFlow.js的JavaScript機器學習
      通過做出一些預測來評估經過訓練的模型。第一步:讓我們從基礎開始創建一個HTML頁面並包含JavaScript。將以下代碼複製到名為index.html的HTML文件中。為代碼創建javascript文件在與上面的HTML文件相同的文件夾中,創建一個名為script.js的文件,並將以下代碼放入其中。
    • 基於JavaScript的單元測試
      Sublime 工具,使用 Mocha 進行單元測試,並通過覆蓋率分析來輔助進行單元測試。Mocha 軟體是一個開源的 JavaScript 測試框架,它和 Jasmine 一起作為 JavaScript 語言中最為流行和常用的兩款單元測試框架,但是它自帶的功能比 Jasmine 更為強大。可以通過 Mocha 官網(http://mochajs.org)的學習資料快速學習 Mocha 的使用,因為其官網主頁就是全套基本教程。
    • 小程序自動化測試實踐
      為了應對小程序如火如荼的發 展,騰訊在今年5月底推出了 miniprogram-automator 來支持小程序的自動化測試,本文也主要是基於此項技術來做介紹,讓大家對小程序自動化有個初步的了解。通過APP自動化的工具appium來實現的2. 通過Airtest來實現3. 通過FAutoTest來實現這些方法大同小異,基本上都屬於黑盒自動化方案。此處不做具體介紹,大家可以自行查閱。
    • 最受歡迎的3種最流行的Node.js框架以及何時使用它們
      JavaScript無處不在,Node.js在JavaScript的廣泛使用中發揮了重要作用。自2009年推出以來,Node.js已成為構建伺服器端javascript應用程式的首選技術。 構建交互式Web應用程式的指數級增長推動了新Javascript框架的開發和部署。
    • Backbone.js 1.2.1 發布,JavaScript 的 MVC 框架
      Backbone.js 1.2.1 發布,此版本更新內容如下:Collection#add now avoids
    • 前端開發框架三劍客—AngularJS VS. Backone.js VS.Ember.js
      美中不足的是該引擎功能較簡單,我們通常需要加入其它的javascript代碼來實現其它功能,例如下面的例子:很多創新的工具不斷湧現,極大地提高了工作效率,例如:Protractor,Batarang,Zone.js等。此外,Angular還與社區進行廣泛合作,不斷進行改進。有關Angular 2.0的設計文檔,可以點擊這裡進行了解,任何人都可以直接在上面發表意見。Angular能夠幫助我們有條不紊地把程序生成區塊進行分類:控制器,指令,裝配器,篩選器,服務和視圖(模板)等。
    • 用於構建API和微服務的流行JavaScript框架
      作為一種非常強大的JavaScript框架,Hapi通過最小的開銷和各種開箱即用(out-of-box)的功能,來構建安全、魯棒且可擴展的API。Sails可以在幾周內為您構建出實用的、可用於生產環境的Node應用程式。 用戶可以通過Sails提供的數據驅動式API,來開發聊天應用、儀錶板、以及多人遊戲等軟體。同時,Sails能夠使用Express來處理Node上的HTTP請求,並使用waterline進行各種與對象相關(object-related)的資料庫映射。
    • Angular、React.js 和Node.js到底選誰?
      【IT168 評論】在JavaScript領域,Angular、React.js和Node.js之間的戰鬥一直在持續升溫!  為了工作,程式設計師選擇正確的框架和庫來構建應用程式是至關重要的,這也就是為什麼Angular和React之間有著太多的爭議。
    • 什麼是自動化測試?了解一下~
      軟體測試招聘方面基本上都有關於自動化測試的要求。了解 selenium、appium或者其他自動化測試框架至少熟悉一門面向對象開發語言,會使用JMeter、Postman等接口測試工具等等,這些相信在招聘信息上都看過,就不詳細列舉了。本文主要的目的就是科普一下什麼是自動化測試。
    • Ember.js和Vue.js,哪種框架更適合前端開發?
      ,才能夠最大程度的確保Web應用程式的構建順利。下面我們就來詳細分析Ember.js和Vue.js框架之間的異同。Ember.js正因為Vue.js的簡單易用,即使是新的開發人員,也會發現使用它來構建應用程式有多麼容易。通過Vue.js,您可以返回並輕鬆檢查語法錯誤。
    • 從0到1開發自動化測試框架
      因此,如何如何構建穩定的、易擴展的自動化的測試項目對于敏捷測試有重要的意義。在設計框架的時候應該儘可能的沿用自動化測試工具已提供的功能,避免重複開發,以減少開發成本。通過對現有自動化測試工具的原理進行深入分析及優缺點比較,並基於Appium和TestNG兩類自動化測試框架解決上述自動化測試中遇到的問題。
    • Node.js的5大框架,誰才是Node.js的優秀框架?
      Fastify是Express的兩倍首先,框架的目的是幫助你在從頭開始構建web應用程式時克服一些常見的開發挑戰。在為自己選擇Node.js框架之前應考慮哪些事項?expressjs主頁:http://expressjs.com/Koa.js —— Node.js的下一代Web框架它是由構建Express.js的開發人員設計的,重點是Express.js
    • JavaScript最火框架Vue
      Vue什麼是 VueVue.js 是目前最火的前端框架,Rect是最流行的前端框架(Rect除了可以開發網頁之外還可以開發手機,Vue也可以用於開發手機)Vue.js 前端的主流框架之一,和Angular.js
    • 2017年最佳JavaScript框架,庫和工具
      為了幫助大家更好地選擇JavaScript框架、庫和工具,本文將對流行的框架、庫和工具進行一些對比,但是由於篇幅有限,可能並不能包含到所有的框架、庫和工具,所以歡迎大家在下方補充評論,共同學習進步。  為了讓大家的討論在共同的水平線上,首先我們先來確定一下框架、庫和工具的概念。可能每個人對於這三者都有自己的理解,但是本文是基於以下的概念來進行討論的。
    • Nodejs測試:從0到90(實踐篇)
      但是如果當私有方法特別多且複雜時,測試私有方法比測試接口或公共方法更直接、有效。嚴格上講,javascript並沒有私有方法的概念,這裡所討論的私有方法指未被導出(exports)的方法。一個簡單的盒子,在一個 cal.js 裡有一個 add 方法,如下所示:function add(a, b) { return a + b;}此方法為私有方法,無法直接通過 cal 測試,但可以通過 rewire 獲取。