作者:Marcin Wanago 翻譯:瘋狂的技術宅 原文:wanago.io/2018/08/27/…
本文是 JavaScript 測試教程 系列中的第1部分
-
- JavaScript測試教程-part 1:用 Jest 進行單元測試
-
- JavaScript測試教程–part 2:引入 Enzyme 並測試 React 元件
-
- JavaScript測試教程–part 3:測試 props,掛載函式和快照測試
-
- 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 框架的基礎知識。它包括有關如何執行測試(安裝和檔案命名)的知識。為了執行測試,我們使用了test、 it 和 describe 函式。