這是使用 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.json
的 scripts
部分中,加入以下腳本:
"test": "jest"
步驟 3 - 測試配置
現在,讓我們確認「jest」已準備好執行我們的測試。在終端機中執行“npm test”。您會注意到控制台上列印如下所示的錯誤,這表示「jest」已設定。
讓我們新增一個簡單的測試來驗證配置。建立一個名為「tests」的新目錄並新增一個新檔案「sample.test.js」。在「sample.test.js」中,加入以下程式碼:
describe('Sample Test', () => {
it('should test that true === true', () => {
expect(true).toBe(true)
})
})
現在,執行“npm test”,您將得到如下所示的輸出:
Jest 以三種方式辨識測試文件:
副檔名為「.test.js」的文件
副檔名為「.spec.js」的文件
__tests__
資料夾或目錄中的所有檔案。
現在我們已經設定了測試環境,是時候開始測試 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