iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
Modern Web

想成為超級開源貢獻者嗎 ? 新手也能用Javascript寫出專業高效能的"新世代"開源庫系列 第 6

新世代的框架庫需求-測試下 -該選甚麼測試框架呢

  • 分享至 

  • xImage
  •  

一個完整的開源庫必須包含

  • 文檔
  • 好的編譯需求
  • 規範
  • 測試
  • 持續集成

單元測試 -Jest / Mocha

昨天我們一起討輪完單元測試,常見的單元測試工具如:jest(vue/react都是用他), Mocha ,Ava,
我們稍微簡單比較三者差異
-下圖為(https://www.npmtrends.com/)統計 [2019.08 - 2020.08] npm下載量的實時數據

TEST COMPARE12

可以看到主要以Mocha/jest為最大宗,所以這次就先以這兩者來討論

Mocha

JavaScript單元測試工具

  • 可在Node.js與瀏覽器上執行, 實作前後端的測試腳本
  • 支援兩種測試模式
    • BDD (Behavior Driven Development )
    • TDD (Test Driven Development)
  • 搭配多種的斷言庫(Assertions)
    • should.js, expect.js, better-assert, unexpected
    • chai.js (should.js, expect.js, assert.js )

Chai

  • Chai 提供 BDD 語法測試用的斷言庫(Assertion Library)。斷言庫是一種判斷工具,明確地將預測結果指出。若實際結果和預測不同,就是測試有誤。以下對語法做簡單說明。

  • 支援 Promise

  • 仿自然語言,淺顯易懂

  • 同時支持 BDD 和 TDD 兩種測試模式

  • 可以支持主要的三種斷言方式 (should.js, expect.js, assert.js ):

    以下給一個Mocha+Chai(assert)範例

    //test/lib/sum.js
      var sum = require('../../lib/sum')
      var assert = require('assert')
      describe('和函式的測試',function () {
        it('1加1應該等於2',function () {
          var expect=10;
          assert.equal(sum(1,1),expect);
        })
      })
    
    

Jest

  • Jest為一 Facebook 開源計劃的項目,從 Jasmine 發展而來, Jest 對於 React 的整合度高,而且本身也整合了斷言、 Mock 等 Library 以及 Coverage 報告功能,還有滿特別的 Snapshot 測試,以及 watch 模式可以只測試當次更改的檔案,最重要是它的設定頗好上手的。

Jest 主要有幾個常用的部分

  • globals api

    1. describe(name, fn) 將一組功能相關的測試用例組合在一起
    2. 周期函數
      afterAll(fn, timeout)  所有測試用例跑完以後執行的函數
      beforeAll(fn, timeout)  所有測試用例執行之前執行的函數
      afterEach(fn)  在每個測試用例執行完後執行的函數
      beforeEach(fn)  在每個測試用例執行之前需要執行的函數
      
  • Jest 對象

      1. jest.fn(implementation)  //返回一個全新沒有使用過的 mock function,這個 function 在被調用的時候會記錄很多和函數調用有關的信息
      2. jest.mock(moduleName, factory, options)  //用來 mock 一些模塊或者文檔
      3. jest.spyOn(object, methodName)  //返回一個 mock function,和 jest.fn 相似,但是能夠追蹤 object[methodName] 的調用信息,類似 Sinon
      4. jest.resetModules()  //確保 import/require 的 module 是初始乾淨未被污染的狀況
      5. jest.resetAllMocks()  //重設所有 mock 物件的狀態
    
  • snapshot

    • 多用來測試一個 UI 元件
  • 斷言

      expect(value) // 要測試一個值進行斷言的時候,要使用 expect 對值進行包裹
      toBe(value) //使用 Object.is 來進行比較
      toEqual(value) //用於對象的深比較
      toMatch(regexpOrString) //用來檢查字符串是否匹配,可以是正則表達式或者字符串
    

備註

之後我們會以Jest為測試主軸,
由於沒有使用過JS測試框架的經驗,如果有不合適的地方,歡迎指出。
感謝各位我們明天見。

參考資料:

上一篇
新世代的框架庫需求-測試-上
下一篇
新世代的框架庫需求 - 持續集成 travis CI
系列文
想成為超級開源貢獻者嗎 ? 新手也能用Javascript寫出專業高效能的"新世代"開源庫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言