Nodejs單元測試教學:使用Mocha, Chai等工具進行API測試
Table of Contents
- 簡介
- 使用的工具
- 開始之前
- 基本設置
- 測試環境設置
- 創建第一個測試案例
- 擴展測試範例
- 覆蓋率測試
- 使用GitHub Actions
- 結論
🚀 使用Node.js進行單元測試
在本節課視頻中,我們將使用Node.js創建一個API的單元測試。我們將使用Mocha、Chai和Supertest這些工具來完成測試。Mocha是一個JavaScript測試框架,Chai則是一個斷言庫,而Supertest則允許我們向我們的Node.js HTTP服務器發送HTTP請求。我們還將使用Istanbul的NYC包來進行測試覆蓋率,並設置GitHub Actions以自動運行單元測試。現在讓我們開始吧!
簡介
首先,讓我們簡單介紹一下我們將要做的事情。我們將使用Node.js和Express框架來創建一個簡單的API。這個API將允許用戶註冊、登錄和獲取用戶信息。我們的目標是使用單元測試來確保我們的API正常運行並返回正確的結果。我們將創建多個測試用例來驗證不同的輸入和預期輸出情況。
使用的工具
在開始之前,我們需要確保我們安裝了所需的工具和包。我們將使用以下工具和包:
- Node.js:作為我們的運行環境
- Express:用於創建API服務器
- Mocha:用於編寫和運行測試用例
- Chai:用於斷言測試結果
- Supertest:用於發送HTTP請求並測試API響應
- NYC:用於計算測試覆蓋率
- GitHub Actions:用於設置自動運行單元測試
開始之前
在我們開始之前,我們需要設置一些基本的環境。首先,確保你的機器上安裝了Node.js,你可以在終端中運行node -v
來檢查Node.js的版本。如果還沒有安裝Node.js,請到官方網站下載並安裝最新的穩定版本。
接下來,我們需要使用Node.js的包管理器npm來安裝其他相關的包。在終端中運行以下命令來創建一個新的Node.js專案並初始化Package.json
文件:
$ npm init
按照提示完成初始化過程並安裝所需的包。
基本設置
現在我們已經擁有了一個新的Node.js專案,接下來我們需要進行一些基本的設置工作。首先,我們需要安裝一些我們將在測試中使用的包。
$ npm install express mocha chai supertest --save-dev
這將安裝Express框架、Mocha測試框架、Chai斷言庫和Supertest用於測試API響應。
接下來,我們需要配置一些環境變數。在你的專案根目錄下創建一個.env
文件,並添加以下內容:
PORT=3000
這將設置我們的服務器監聽的端口號為3000。
完成以上操作後,我們需要創建一個路由文件。在你的專案根目錄下創建一個routes.js
文件,並添加以下內容:
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('Hello, world!');
});
module.exports = router;
這將創建一個簡單的路由,當用戶訪問根路徑時返回Hello, world!
。
至此,我們的基本設置工作已經完成。現在讓我們測試一下我們的服務器是否正常運行。在終端中運行以下命令來啟動服務器:
npm start
然後在瀏覽器中訪問http://localhost:3000
,你應該能夠看到Hello, world!
的頁面。
測試環境設置
在開始編寫測試用例之前,我們需要安裝並配置測試框架和相關的包。
首先,我們需要安裝mocha
和chai
:
npm install mocha chai --save-dev
這將安裝Mocha測試框架和Chai斷言庫。
接下來,我們需要在專案根目錄下創建一個test
文件夾來存放我們的測試文件。
現在,讓我們創建我們的第一個測試案例。
創建第一個測試案例
在test
文件夾下創建一個app.spec.js
文件,並添加以下內容:
const chai = require('chai');
const chaiHttp = require('chai-http');
const app = require('../app');
const expect = chai.expect;
chai.use(chaiHttp);
describe('App', () => {
it('should return "Hello, world!" when GET /', (done) => {
chai.request(app)
.get('/')
.end((err, res) => {
expect(res).to.have.status(200);
expect(res.body).to.have.property('message').equal('Hello, world!');
done();
});
});
});
這個測試案例將測試當用戶訪問根路徑時,服務器是否返回了正確的內容。
在這個測試案例中,我們使用了chai
的expect
斷言函數來確認測試結果。我們首先使用chai.request(app)
發送一個GET請求到根路徑,然後在end
回調函數中對響應進行斷言。
現在,讓我們運行測試案例來檢查我們的服務器是否正確運行。在終端中運行以下命令:
npm test
如果一切正常,你應該能夠看到測試通過的結果。
這是我們如何使用Mocha和Chai創建和運行單元測試的基本例子。你可以根據你的需求擴展這些測試案例,並添加更多的斷言和測試項目。
覆蓋率測試
我們通常希望確定我們的測試條件是否已達到,並確保我們的代碼被完全覆蓋。為了進行這種類型的測試,我們將使用Istanbul的NYC包。
首先,讓我們安裝NYC包:
npm install nyc --save-dev
然後,我們需要修改package.json
文件來配置測試覆蓋率。在scripts
部分中,將以下命令添加到test
命令之前:
"test:coverage": "nyc --reporter=text mocha"
這將讓我們能夠使用npm run test:coverage
命令運行測試並生成覆蓋率報告。
現在,運行以下命令來測試覆蓋率:
npm run test:coverage
成功運行測試用例後,你應該能夠看到覆蓋率報告。
這是我們如何使用NYC計算測試覆蓋率的例子。你可以根據你的需求定製覆蓋率報告的格式和內容。
使用GitHub Actions
為了確保我們的測試在每次提交代碼時都能自動運行,我們將使用GitHub Actions。
首先,我們需要在專案的根目錄下創建一個.github/workflows
文件夾。在這個文件夾下創建一個main.yml
文件,並添加以下內容:
name: Node.js CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [10.x, 14.x]
mongodb-version: [4.0, 4.2]
steps:
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Set up MongoDB
uses: docker-compose-action@v1
with:
compose-file: docker-compose-test.yml
run: 'mongo:latest'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
這個工作流將在每次提交到main
分支時運行測試。它使用了Ubuntu 20.04作為運行環境,並分別運行了Node.js 10和Node.js 14版本的測試。它還使用了Docker來運行MongoDB來模擬我們的測試環境。
現在,當你將代碼推送到main
分支時,你應該能夠在GitHub Actions面板中看到測試運行的結果。
這就是我們如何使用GitHub Actions設置自動運行單元測試的例子。你可以根據你的需求自定義GitHub Actions的配置。
結論
在本節課中,我們學習了如何使用Node.js和Mocha進行單元測試。我們使用了Chai來斷言測試結果,並使用Supertest來測試API響應。我們還使用了Istanbul的NYC包來計算測試覆蓋率。最後,我們使用GitHub Actions設置了自動運行單元測試。
這是一個簡單的例子,幫助你了解如何使用單元測試來確保你的代碼正常運行。你可以根據你的需求擴展這些測試案例,並根據你的需求設置測試報告和自動運行。
祝你好運並繼續享受編程的樂趣!如果你有任何問題,請隨時提問。