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

前端先鋒發表於2019-11-15

作者:Marcin Wanago 翻譯:瘋狂的技術宅 原文:wanago.io/2018/08/27/…

JavaScript testing tutorial – part one. Explaining types of tests. Basics of unit testing with Jest

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

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

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

測試的型別

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

單元測試

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

整合測試

即使你的所有單元測試都通過了,也只能代表每個部分可以正常工作。儘管如此,該程式仍可能失敗。整合測試涵蓋跨模組流程,其中各個模組在一起工作時進行組合和測試。多虧了他,你可以用一種方法來確保你的程式碼在整體上能夠正常執行。

端到端測試(E2E)

與其他型別的測試相反,端到端測試始終在瀏覽器(或類似瀏覽器)環境中執行。它可能是開啟的真正瀏覽器,並且在其中執行測試。它也可能是無頭瀏覽器環境,即沒有使用者介面執行的瀏覽器。 E2E 測試的重點是在我們正在執行的程式中模擬實際使用者。他們將模擬滾動,單擊和鍵入之類的行為,並從實際使用者的角度檢查我們的程式是否執行良好。

用 Jest 進行單元測試

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

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 函式。

歡迎關注前端公眾號:前端先鋒,免費領取Webpack教程。

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

相關文章