Title text reads Testing JavaScript with Jest on Vultr. The yellow background contains an icon depicting jest in the top right corner and the letters JS in the bottom left corner.
贊助

在 Vultr 上使用 Jest 測試 JavaScript

閱讀時間 7 分鐘

Jest 是一個流行的 JavaScript 測試框架,用於測試 React 和 JavaScript 程式碼庫。它提供了一套全面的匹配器,用於進行斷言,允許使用者為不同型別的專案編寫測試。Jest 將測試組織成測試套件;這種結構化方法提高了可維護性和可讀性,從而提高了測試效率。

在本文中,我們將探討軟體開發中常用的各種測試型別,並分享一些良好的測試實踐和約定。我們將編寫 JavaScript 函式,並使用 Vultr 伺服器上的 NodeJS 市場應用程式和 Jest 測試框架來測試它們。

測試型別

為了確保程式碼質量和功能,開發通常涉及三種類型的測試。每種型別都有特定的目的

  • 單元測試:這些測試側重於測試單個單元或元件,例如函式、方法或類。此類測試可確保每個程式碼元件本身都能正常執行。

  • 整合測試:這些測試側重於評估應用程式的不同元件是否按預期相互互動。與測試單個元件的單元測試不同,這些測試涉及多個單元之間的互動,以確保它們組合在一起時能按預期執行。

  • 端到端測試:這些測試透過測試應用程式從頭到尾的流程來模擬真實使用者場景。這些測試通常是自動化的,並且像真實使用者一樣與應用程式進行互動,確保應用程式在實際情況中按預期工作。

測試約定

Arrange-Act-Assert (AAA) 模式是用於組織和結構化單元測試用例的常用約定。

為了理解每個部分,這裡有一個示例,我們想測試使用者電子郵件是否為字母數字(字母和數字)並使用 example.com

javascript
test("returns false for an invalid domain", () => {
  const email = "user123@example.net";
  const result = isValidEmail(email);
  expect(result).toBe(false);
});
  • Arrange:在此階段,您設定初始條件並準備測試環境。這包括初始化物件、設定輸入和配置環境以建立您希望測試的場景。在上面的示例中,我們想測試 isValidEmail 函式是否正確識別了無效電子郵件。我們已將 email 變數初始化為不符合我們電子郵件標準的字串,因為它使用了 .net TLD 而不是 .com

  • Act:在此階段,您執行要測試的操作或行為。這可能包括呼叫方法、與物件互動或執行特定程式碼。在上面的示例中,此步驟涉及呼叫 isValidEmail 函式並將 email 變數作為引數傳遞。

  • Assert:最後,在此階段,您驗證“Act”階段的結果是否符合您的預期。在上面的示例中,我們使用了 Jest 框架提供的 expect 函式來確認 isValidEmail 函式返回的 result 已被正確標識為 false,正如對無效電子郵件所預期的那樣。

在 Vultr 上設定專案目錄

首先,請按照我們上一篇文章中 在 Vultr 上部署伺服器 部分的步驟部署一個伺服器。確保您在 **Marketplace Apps** 選項卡中選擇了 **NodeJS**。接下來,讓我們開始設定一個 Node.js 專案並安裝 Jest 框架。然後,我們將在單獨的 JavaScript 檔案中定義兩個函式,並在後續部分中對其進行測試。

  1. 使用以下命令驗證 Node.js 安裝

    bash
    node --version
    
  2. 建立一個專案目錄,並進入該目錄。

    bash
    mkdir sample
    cd sample
    
  3. 初始化一個 Node.js 專案。

    bash
    npm init -y
    
  4. 安裝 Jest 測試框架。

    bash
    npm install --save-dev jest
    

    --save-dev 標誌用於指定包是作為開發依賴項安裝的。這意味著它僅在開發和測試階段使用,而在生產環境中不使用。

  5. 開啟 package.json 檔案。我們使用的是 Nano 文字編輯器。請檢視 快捷方式備忘單 以獲取使用 Nano 的幫助。

    bash
    nano package.json
    
  6. 新增一個測試指令碼。

    json
    "scripts": {
      "test": "jest"
    }
    
  7. 儲存並退出檔案(按 Ctrl + X 關閉檔案,出現提示時按 Y 儲存更改)。

  8. 建立一個 JavaScript 檔案。

    bash
    nano token.js
    
  9. 將以下程式碼複製並貼上到 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 };
    

    上面的程式碼定義了兩個函式 getTokenExpiryDateisTokenExpired,它們計算提供的 JWT 令牌的過期日期,並根據令牌的過期狀態返回 truefalse

  10. 儲存並退出檔案。

  11. 建立另一個 JavaScript 檔案。

    bash
    nano email.js
    
  12. 將以下程式碼複製並貼上到檔案中

    javascript
    function isValidEmail(email) {
      const emailRegex = /[a-zA-Z0-9]+@example\.com/;
      return emailRegex.test(email);
    }
    
    module.exports = { isValidEmail };
    

    上面的程式碼定義了一個 isValidEmail 函式,該函式使用正則表示式驗證提供的電子郵件的結構。正則表示式允許我們驗證所有電子郵件是否為字母數字,並且以 @example.com 結尾。

  13. 儲存並退出檔案。

使用 Jest 編寫單元測試

在本節中,您將學習如何使用 Jest 框架為前面定義的 JavaScript 函式編寫單元測試。我們將把這些測試放在同一專案內的單獨目錄中。我們建議您遵循此處演示的檔案命名約定,因為 Jest 會自動將以 .test.js 結尾的檔案視為測試檔案。

  1. sample 目錄中,建立另一個名為 tests 的目錄並導航到其中。

    bash
    mkdir tests
    cd tests
    
  2. 建立一個 JavaScript 測試檔案。

    bash
    nano token.test.js
    
  3. 將以下程式碼複製並貼上到檔案中

    javascript
    const { 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,並使用它們代替上面的測試中的佔位符。

  4. 儲存並退出檔案。

  5. 建立另一個 JavaScript 測試檔案。

    bash
    nano email.test.js
    
  6. 將以下程式碼複製並貼上到檔案中

    javascript
    const { 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 函式,並透過提供有效和無效電子郵件對其進行測試。它透過將預期輸出與實際輸出進行匹配來檢查驗證結果。

  7. 儲存並退出檔案。

在 Vultr 上執行 Jest 測試

在本節中,您將學習如何使用 Jest 框架透過兩種方法執行測試。在第一種方法中,我們將執行前面各節中定義的每個函式的單獨單元測試。在第二種方法中,我們將同時執行這兩個函式的測試。

執行單個單元測試

  1. 執行令牌驗證測試。

    bash
    npm 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.
    
  2. 接下來,執行電子郵件驗證測試。

    bash
    npm 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.
    

同時執行所有測試

使用以下命令同時執行所有測試

bash
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 的資訊。