在 Vultr 上使用 Jest 測試 JavaScript
Jest 是一個流行的 JavaScript 測試框架,用於測試 React 和 JavaScript 程式碼庫。它提供了一套全面的匹配器,用於進行斷言,允許使用者為不同型別的專案編寫測試。Jest 將測試組織成測試套件;這種結構化方法提高了可維護性和可讀性,從而提高了測試效率。
在本文中,我們將探討軟體開發中常用的各種測試型別,並分享一些良好的測試實踐和約定。我們將編寫 JavaScript 函式,並使用 Vultr 伺服器上的 NodeJS 市場應用程式和 Jest 測試框架來測試它們。
測試型別
為了確保程式碼質量和功能,開發通常涉及三種類型的測試。每種型別都有特定的目的
-
單元測試:這些測試側重於測試單個單元或元件,例如函式、方法或類。此類測試可確保每個程式碼元件本身都能正常執行。
-
整合測試:這些測試側重於評估應用程式的不同元件是否按預期相互互動。與測試單個元件的單元測試不同,這些測試涉及多個單元之間的互動,以確保它們組合在一起時能按預期執行。
-
端到端測試:這些測試透過測試應用程式從頭到尾的流程來模擬真實使用者場景。這些測試通常是自動化的,並且像真實使用者一樣與應用程式進行互動,確保應用程式在實際情況中按預期工作。
測試約定
Arrange-Act-Assert (AAA) 模式是用於組織和結構化單元測試用例的常用約定。
為了理解每個部分,這裡有一個示例,我們想測試使用者電子郵件是否為字母數字(字母和數字)並使用 example.com 域
test("returns false for an invalid domain", () => {
const email = "user123@example.net";
const result = isValidEmail(email);
expect(result).toBe(false);
});
-
Arrange:在此階段,您設定初始條件並準備測試環境。這包括初始化物件、設定輸入和配置環境以建立您希望測試的場景。在上面的示例中,我們想測試
isValidEmail函式是否正確識別了無效電子郵件。我們已將email變數初始化為不符合我們電子郵件標準的字串,因為它使用了.netTLD 而不是.com。 -
Act:在此階段,您執行要測試的操作或行為。這可能包括呼叫方法、與物件互動或執行特定程式碼。在上面的示例中,此步驟涉及呼叫
isValidEmail函式並將email變數作為引數傳遞。 -
Assert:最後,在此階段,您驗證“Act”階段的結果是否符合您的預期。在上面的示例中,我們使用了 Jest 框架提供的
expect函式來確認isValidEmail函式返回的result已被正確標識為false,正如對無效電子郵件所預期的那樣。
在 Vultr 上設定專案目錄
首先,請按照我們上一篇文章中 在 Vultr 上部署伺服器 部分的步驟部署一個伺服器。確保您在 **Marketplace Apps** 選項卡中選擇了 **NodeJS**。接下來,讓我們開始設定一個 Node.js 專案並安裝 Jest 框架。然後,我們將在單獨的 JavaScript 檔案中定義兩個函式,並在後續部分中對其進行測試。
-
使用以下命令驗證 Node.js 安裝
bashnode --version -
建立一個專案目錄,並進入該目錄。
bashmkdir sample cd sample -
初始化一個 Node.js 專案。
bashnpm init -y -
安裝 Jest 測試框架。
bashnpm install --save-dev jest--save-dev標誌用於指定包是作為開發依賴項安裝的。這意味著它僅在開發和測試階段使用,而在生產環境中不使用。 -
開啟
package.json檔案。我們使用的是 Nano 文字編輯器。請檢視 快捷方式備忘單 以獲取使用 Nano 的幫助。bashnano package.json -
新增一個測試指令碼。
json"scripts": { "test": "jest" } -
儲存並退出檔案(按 Ctrl + X 關閉檔案,出現提示時按 Y 儲存更改)。
-
建立一個 JavaScript 檔案。
bashnano token.js -
將以下程式碼複製並貼上到
token.js檔案中。此程式碼演示瞭如何計算 JSON Web Token (JWT) 的過期日期並檢查它是否已過期。注意:此處顯示的動手編寫的過期檢查僅用於說明目的。在處理真實專案中的身份驗證令牌時,強烈建議依賴成熟的庫,例如 jsonwebtoken。
javascript/** * * @param {string} token * @returns {Date} */ function getTokenExpiryDate(token) { if (!token) return null; const tokenParts = token.split("."); const payload = tokenParts[1]; const decodedPayload = Buffer.from(payload, "base64").toString(); const payloadObject = JSON.parse(decodedPayload); const expiryDate = new Date(payloadObject.exp * 1000); return expiryDate; } /** * * @param {string} token * @returns {boolean} */ function isTokenExpired(token) { const expiryDate = getTokenExpiryDate(token); const currentDate = new Date(); return currentDate > expiryDate; } module.exports = { isTokenExpired };上面的程式碼定義了兩個函式
getTokenExpiryDate和isTokenExpired,它們計算提供的 JWT 令牌的過期日期,並根據令牌的過期狀態返回true或false。 -
儲存並退出檔案。
-
建立另一個 JavaScript 檔案。
bashnano email.js -
將以下程式碼複製並貼上到檔案中
javascriptfunction isValidEmail(email) { const emailRegex = /[a-zA-Z0-9]+@example\.com/; return emailRegex.test(email); } module.exports = { isValidEmail };上面的程式碼定義了一個
isValidEmail函式,該函式使用正則表示式驗證提供的電子郵件的結構。正則表示式允許我們驗證所有電子郵件是否為字母數字,並且以@example.com結尾。 -
儲存並退出檔案。
使用 Jest 編寫單元測試
在本節中,您將學習如何使用 Jest 框架為前面定義的 JavaScript 函式編寫單元測試。我們將把這些測試放在同一專案內的單獨目錄中。我們建議您遵循此處演示的檔案命名約定,因為 Jest 會自動將以 .test.js 結尾的檔案視為測試檔案。
-
在
sample目錄中,建立另一個名為tests的目錄並導航到其中。bashmkdir tests cd tests -
建立一個 JavaScript 測試檔案。
bashnano token.test.js -
將以下程式碼複製並貼上到檔案中
javascriptconst { isTokenExpired } = require("/root/sample/token.js"); describe("isTokenExpired", () => { test("should return false if the token is not expired", () => { const token = "eyJ0eXAiOiJKV1QiLCJhbGciOi..."; const result = isTokenExpired(token); expect(result).toBe(false); }); test("should return true if the token is expired", () => { const token = "eyJ0eXAiOiJKV1QiLCJhbGciOi..."; const result = isTokenExpired(token); expect(result).toBe(true); }); });上面的程式碼使用前面定義的
isTokenExpired函式來確定該函式是否按預期執行,根據 JWT 是否過期返回正確的布林值。注意:如果您希望
isTokenExpired函式檢查真實令牌,您可以使用 JSON Web Token Builder 生成已過期和未過期的 JWT,並使用它們代替上面的測試中的佔位符。 -
儲存並退出檔案。
-
建立另一個 JavaScript 測試檔案。
bashnano email.test.js -
將以下程式碼複製並貼上到檔案中
javascriptconst { isValidEmail } = require("/root/sample/email.js"); describe("isValidEmail", () => { test("returns true for a valid email", () => { const email = "user123@example.com"; const result = isValidEmail(email); expect(result).toBe(true); }); test("returns false for an invalid domain", () => { const email = "user123@example.net"; const result = isValidEmail(email); expect(result).toBe(false); }); });上面的程式碼使用了前面定義的
isValidEmail函式,並透過提供有效和無效電子郵件對其進行測試。它透過將預期輸出與實際輸出進行匹配來檢查驗證結果。 -
儲存並退出檔案。
在 Vultr 上執行 Jest 測試
在本節中,您將學習如何使用 Jest 框架透過兩種方法執行測試。在第一種方法中,我們將執行前面各節中定義的每個函式的單獨單元測試。在第二種方法中,我們將同時執行這兩個函式的測試。
執行單個單元測試
-
執行令牌驗證測試。
bashnpm test -- tests/token.test.js如果測試成功透過,您的輸出將如下所示
> sample@1.0.0 test > jest tests/token.test.js PASS tests/token.test.js isTokenExpired ✓ should return false if the token is not expired (2 ms) ✓ should return true if the token is expired (1 ms) Test Suites: 1 passed, 1 total Tests: 2 passed, 2 total Snapshots: 0 total Time: 0.315 s, estimated 1 s Ran all test suites matching /tests\/token.test.js/i. -
接下來,執行電子郵件驗證測試。
bashnpm test -- tests/email.test.js如果測試成功透過,您的輸出將如下所示
> sample@1.0.0 test > jest tests/email.test.js PASS tests/email.test.js isValidEmail ✓ returns true for a valid email (2 ms) ✓ returns false for an invalid domain (1 ms) Test Suites: 1 passed, 1 total Tests: 2 passed, 2 total Snapshots: 0 total Time: 0.451 s Ran all test suites matching /tests\/email.test.js/i.
同時執行所有測試
使用以下命令同時執行所有測試
npm test
如果測試成功透過,您的輸出將如下所示
> sample@1.0.0 test > jest PASS tests/email.test.js PASS tests/token.test.js Test Suites: 2 passed, 2 total Tests: 4 passed, 4 total Snapshots: 0 total Time: 0.225 s, estimated 1 s Ran all test suites.
總結
在本文中,我們瞭解了各種測試型別和測試約定。我們探討了如何在 Vultr 伺服器上使用 Node.js(預裝)和 Jest 編寫和執行函式單元測試。透過利用 Jest 等工具,您可以提高程式碼的可靠性和健壯性,從而開發更穩定、可維護的軟體。
這是一篇由 Vultr 贊助的文章。Vultr 是全球最大的私營雲計算平臺。Vultr 是開發者的首選,已為 185 個國家/地區的 150 萬多客戶提供了靈活、可擴充套件、全球化的雲計算、雲 GPU、裸金屬和雲端儲存解決方案。瞭解更多關於 Vultr 的資訊。