JavaScript 測試教程-part 1:用 Jest 進行單元測試

做者:Marcin Wanago

翻譯:瘋狂的技術宅javascript

原文:https://wanago.io/2018/08/27/...前端

未經容許嚴禁轉載java

本文是 JavaScript 測試教程 系列中的第1部分webpack

  • 1.JavaScript測試教程-part 1:用 Jest 進行單元測試
  • 2.JavaScript測試教程–part 2:引入 Enzyme 並測試 React 組件
  • 3.JavaScript測試教程–part 3:測試 props,掛載函數和快照測試
  • 4.JavaScript測試教程–part 4:模擬 API 調用和模擬 React 組件交互

有多種不一樣種類的測試,我會首先解釋其中的一部分。首先,我將介紹單元測試的基礎知識,即測試應用程序的每一個部分並檢查它們是否適合使用。爲此咱們將使用 Facebook 開發的測試框架 Jest。它已經準備就緒,並具備進行測試所需的功能。程序員

測試的類型

測試是用來檢查你代碼的代碼。測試會使你對本身的程序更有信心。它們還可以防止你在修復一個 bug 時生成另外一個 bug。你能夠測試程序的方方面面,從單個函數及其返回值到在瀏覽器中運行的複雜程序。因爲這是本課程的第一篇文章,所以我會簡要對比一些流行的測試類型。web

單元測試

單元測試覆蓋了代碼塊,確保它們在運行時沒有問題。被測試的單元能夠是函數、模塊和類等。單元測試應該相互隔離而且彼此獨立。對於給定的輸入,用單元測試檢查結果,經過儘早發現問題並避免退化,能夠幫助你確保程序的每一個部分都能按預期工做。面試

集成測試

即便你的全部單元測試都經過了,也只能表明每一個部分能夠正常工做。儘管如此,該程序仍可能失敗。集成測試涵蓋跨模塊流程,其中各個模塊在一塊兒工做時進行組合和測試。多虧了他,你能夠用一種方法來確保你的代碼在總體上可以正常運行。正則表達式

端到端測試(E2E)

與其餘類型的測試相反,端到端測試始終在瀏覽器(或相似瀏覽器)環境中運行。它多是打開的真正瀏覽器,而且在其中運行測試。它也多是無頭瀏覽器環境,即沒有用戶界面運行的瀏覽器。 E2E 測試的重點是在咱們正在運行的程序中模擬實際用戶。他們將模擬滾動,單擊和鍵入之類的行爲,並從實際用戶的角度檢查咱們的程序是否運行良好。npm

用 Jest 進行單元測試

Jest 是 Facebook 開發的測試框架。它的目標之一是經過現成可用的工具提供「零配置」體驗。它已經存在了一段時間,而且快速可靠。json

npm install --save-dev jest

別忘了把它添加到 npm 腳本中。

package.json
"scripts": {
  "test": "jest"
}
爲了簡單起見,我在這裏將 Jest 與簡單的純 Node.js 模塊一塊兒使用(不包括 webpack)。稍後咱們將學習如何在 React 中使用 Jest

首先,讓咱們建立一些能夠測試的簡單函數。

divide.js
function divide(a, b) {
  return a / b;
}
module.exports = divide;

Jest 用正則表達式肯定要測試的文件默認狀況下,若是它們位於 tests 目錄中或以 test.spec 爲後綴,將執行 .js.jsx 文件。你能夠在項目的 package.json 文件中用 testRegex 屬性指定。

package.json
"jest": {
  "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.jsx?$"
}

最後,讓咱們建立測試文件。爲了遵循默認的命名配置,咱們將其命名爲 divide.test.js

divide.test.js
const divide = require('./divide');
 
test('dividing 6 by 3 equals 2', () => {
  expect(divide(6, 3)).toBe(2);
});

npm run test 命令運行該測試:

PASS  ./divide.test.js
  ✓ dividing 6 by 3 equals 2 (5ms)

test 函數用來運行測試。它包含三個參數:測試的名稱,包含指望值的函數和超時(以毫秒爲單位)。超時默認爲 5 秒,並指定若是測試花費的時間太長,則停止測試以前要等待多長時間。

expect 函數用於測試值。做爲參數,它接受你要測試的值:在咱們的例子中,它是 divide 函數的返回。你能夠調用一組 matcher 函數(例子中使用的 toBe)以某種方式測試該值。有關完整信息,請訪問 Jest 文檔

分組測試

每一個文件一般會有一個以上的測試。使用 Jest,你可使用 describe 函數對它們進行分組。它建立了一個能夠合併多個測試的塊。爲了更好地顯示它,讓咱們在全局 Math 對象上進行一些測試。

describe('in the math global object', () => {
 
  describe('the random function', () => {
    it('should return a number', () => {
      expect(typeof Math.random()).toEqual('number');
    })
    it('should return a number between 0 and 1', () => {
      const randomNumber = Math.random();
      expect(randomNumber).toBeGreaterThanOrEqual(0);
      expect(randomNumber).toBeLessThan(1);
    })
  });
 
  describe('the round function', () => {
    it('should return a rounded value of 4.5 being 5', () => {
      expect(Math.round(4.5)).toBe(5);
    })
  });
 
})
你可能會注意到用了 it 函數而不是 test 函數。它是經常使用的別名。運行 it === test 會返回 true

像這樣對測試進行分組可使代碼更整潔。你應該關心程序代碼和對其進行測試的代碼的質量。

若是出現問題,除了使代碼更具可讀性以外,它還有助於提供更友好的錯誤消息。若是將測試改成包含 expect(typeof Math.random()).toEqual('string'),則會看到如下消息:

FAIL  ./math.test.js
  ● in the math global object › the random function › should return a number
 
    expect(received).toEqual(expected)
 
    Expected value to equal:
      "string"
    Received:
      "number"

總結

做爲介紹,咱們已經解釋了最基本的 JavaScript 測試類型。涵蓋的第一類測試是「單元測試」。爲了執行它們,咱們已經瞭解了 Jest 框架的基礎知識。它包括有關如何運行測試(安裝和文件命名)的知識。爲了運行測試,咱們使用了testitdescribe 函數。


本文首發微信公衆號:前端先鋒

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章


歡迎繼續閱讀本專欄其它高贊文章:


相關文章
相關標籤/搜索