這是使用 Express、Sequelize 和 Postgres 建立 API 的第三部分。在第二部分中,我們建立了簡單的API端點來示範Sequelize中的CRUD操作。在本文中,我們將重點放在為第二部分中建立的 API 端點編寫端到端測試。

術語解釋

  • 端對端測試 - 一種測試類型,用於測試應用程式從開始到結束的流程是否如預期運作。這也稱為功能測試。此類測試的一個範例是測試端點或路由,其中涉及測試端點工作所需的所有內容,例如資料庫連接、依賴項等。

  • 測試執行器 - 在給定目錄或檔案中取得原始程式碼(測試)、執行測試並將結果寫入控制台或任何指定位置的程式庫或工具,例如 Jest、Mocha。

  • Jest - Jest 是 Facebook 開發的 JavaScript 測試框架。它以最少的配置開箱即用,並具有內建的測試執行器、斷言庫和模擬支援。

  • Supertest - 用於測試 Node.js HTTP 伺服器的函式庫。它使我們能夠以程式設計方式向 HTTP 伺服器發送 HTTP 請求(例如 GET、POST、PATCH、PUT、DELETE)並獲取結果。

現在我們已經解釋了基本術語,讓我們深入了解主要業務。

如果您一直按照先前的文章進行操作,那麼請在您最喜歡的文字編輯器中開啟它,否則克隆使用的儲存庫此處

第 1 步 - 安裝 Jest 和 supertest

打開終端機並“cd”到專案根目錄並執行以下命令:

npm install --save-dev jest supertest

步驟 2 - 設定 Jest

打開“package.json”並將以下程式碼新增至其中。

 "jest": {
    "testEnvironment": "node",
    "coveragePathIgnorePatterns": [
      "/node_modules/"
    ]
  },

這是我們測試 API 時需要設定 jest 的基本配置。您希望 jest 忽略的任何檔案都放置在 "coveragePathIgnorePatterns" 內。 "coveragePathIgnorePatterns" 指定一個與要排除的目錄相符的正規表示式,在我們的例子中,我們希望它忽略 node_modules 目錄。

接下來我們新增“test”腳本。在 package.jsonscripts 部分中,加入以下腳本:

"test": "jest"

步驟 3 - 測試配置

現在,讓我們確認「jest」已準備好執行我們的測試。在終端機中執行“npm test”。您會注意到控制台上列印如下所示的錯誤,這表示「jest」已設定。

未指定測試時出現 Jest 錯誤

讓我們新增一個簡單的測試來驗證配置。建立一個名為「tests」的新目錄並新增一個新檔案「sample.test.js」。在「sample.test.js」中,加入以下程式碼:

describe('Sample Test', () => {
  it('should test that true === true', () => {
    expect(true).toBe(true)
  })
})

現在,執行“npm test”,您將得到如下所示的輸出:

範例測試輸出

Jest 如何辨識測試檔?

Jest 以三種方式辨識測試文件:

  • 副檔名為「.test.js」的文件

  • 副檔名為「.spec.js」的文件

  • __tests__ 資料夾或目錄中的所有檔案。

測試 API 端點

現在我們已經設定了測試環境,是時候開始測試 API 端點了。由於我們的端點需要向資料庫發出請求,因此我們需要設定一個測試資料庫。設定測試資料庫的原因是每次執行測試時我們都會刪除該資料庫。每次執行測試時刪除資料庫可確保測試的完整性。也就是說,如果一個測試是在資料庫中建立一個「post」記錄,我們要確保在測試執行之前資料庫中沒有「post」記錄,這樣,我們就可以確定得到的結果從測試中。

第 4 步 - 建立測試資料庫

在本文的第一部分中,我們建立了兩個資料庫,一個用於開發,另一個用於測試。如果您尚未建立測試資料庫,請依照連結建立測試資料庫。

步驟 5 - 設定測試腳本

我們需要以下腳本:

  • pretest - pretest 是一個 npm 腳本,當呼叫 npm test 指令時會自動呼叫。我們將掛接命令來更改環境以進行測試,並在每次測試執行之前刷新資料庫。

  • migrate:reset:此命令將負責在每次測試執行之前刷新資料庫。

現在編輯“package.json”的“scripts”,如下所示:

"scripts": {
    "start-dev": "nodemon index.js",
    "migrate": "npx sequelize-cli db:migrate",
    "migrate:reset": "npx sequelize-cli db:migrate:undo:all && npm run migrate",
     "test": "cross-env NODE_ENV=test jest --testTimeout=10000",
    "pretest": "cross-env NODE_ENV=test npm run migrate:reset"
  }

腳本修改需要注意的地方:

  • cross-env - 用於設定環境變數的與作業系統無關的套件。我們用它將NODE_ENV設為test,以便我們的測試可以使用測試資料庫。執行以下命令來安裝跨環境。
npm i -D cross-env
  • --testTimeout 標誌 - 這會增加 Jest 的預設逾時時間,即 5000 毫秒。這很重要,因為測試執行者需要在執行測試之前刷新資料庫。

第 6 步 - 測試腳本

npm test

如果一切正常,您應該在終端機上看到以下輸出:

替代文本

仔細觀察上面的螢幕截圖,您會注意到一行 using environment "test" 表示 cross-env 已更改了 NODE_ENV

最後一步 - 測試路由/端點

現在,讓我們開始為端點編寫測試。在測試目錄中建立一個名為routes.test.js的文件

touch tests/routes.test.js
  • 測試建立後端點

將以下程式碼複製到“tests/routes.test.js”中:

const request = require('supertest')
const app = require('../server')
describe('Post Endpoints', () => {
  it('should create a new post', async () => {
    const res = await request(app)
      .post('/api/posts')
      .send({
        userId: 1,
        title: 'test is cool',
      })
    expect(res.statusCode).toEqual(201)
    expect(res.body).toHaveProperty('post')
  })
})
  • describe 函數用於將相關測試分組在一起

  • it 是執行實際測試的 test 函數的別名。

-“expect”函數使用一組“matcher”函數測試值。

請造訪 Jest 文件 以取得 jest 函數的完整清單和詳細資訊。

現在,執行測試

npm test

輸出如下圖所示:

替代文本

有關所有端點測試的完整程式碼,請檢查儲存庫

結論

我們已經能夠完成為與資料庫互動的 API 端點編寫測試的過程。在本文的最後部分,我將撰寫有關將 CI/CD 和程式碼覆蓋工具整合到測試環境的文章。在那之前請繼續關注。

如果您對改進文章有任何疑問或建議,請隨時與我聯繫。您也可以透過下面的評論部分分享您的想法。謝謝!

本文最初發表在我的部落格


原文出處:https://dev.to/nedsoft/testing-nodejs-express-api-with-jest-and-supertest-1km6


共有 0 則留言