0%

[Node.js] 使用 mocha 做單元測試

mocha

前言

在開發專案的過程中,很重要的一個部份是測試。在開發時常常會遇到某次修改之後,原本正常的功能突然不能用了,透過單元測試可以確保每次修改後,沒有造成其他地方出問題。

Javascript 有許多單元測試框架,例如:mocha, Jest, Jasmine…等,這篇文章主要是使用 mocha 測試框架。此外,我們還需要斷言庫來幫助我們判斷測試結果是否符合預期,這裡我們使用 chai 斷言庫。另外還可以搭配 supertest 來測試 Node.js API, supertest 是一個提供輕量級的 HTTP Request 測試的套件,通常會用來測試 Node.js API.

接下來就記錄一下如何使用 mocha, chai 和 supertest 來做單元測試。

安裝套件

首先,要先安裝所需套件: mocha, chai, supertest

1
$ npm install mocha chai supertest --save

撰寫測試內容

先在專案目錄底下建立 test 目錄,將測試的內容都放在此目錄底下,再來建立 test_query.js 就可以來撰寫測試內容了。

語法簡介

  • describe(): 描述測試的區塊,可以當作一個測試群組,區塊中可以執行多個測試。
  • it(): 每個測試的內容。
  • before(): 在所有測試開始前,會執行此區塊的內容。
  • after(): 在所有測試結束後,會執行此區塊的內容。
  • beforeEach(): 在每個測試開始前,會執行此區塊的內容。
  • afterEach(): 在每個測試結束後,會執行此區塊的內容。

範例

這裡的範例是做一些 API 的基本測試:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const assert = require('chai').assert;
const supertest = require('supertest');
const app = require('../app');

const api = supertest('http://localhost:3000');

describe('Basic test', () => {

it('API status should be 200', (done) => {
api.get('/')
.expect(200, done);
});

it('The result should be an object with keys', (done) => {
api.get('/query?keyword=Apple')
.expect(200)
.end((err, res) => {
assert.notExists(err);

res.body.forEach((item) => {
assert.hasAllKeys(item, ['id', 'title', 'body']);
});

done();
});
});
});

一開始先 require modules, 其中還有 require app.js, app.js 是 Epress.js entry point, 執行 mocha 測試後,會啟動 API server,並開始執行測試。

再來 const api = supertest('http://localhost:3000'); 這部分是設定 API 路徑,使用 supertest 對 API 發出 request.

最後 describe() 區塊內容就是要測試的 case:

  • 測試 API 是否正常運作,stauts code 須為 200
  • 測試 API 回傳的結果,必須為 object 且包含指定的 key

這裡我們使用 chai 的 assert 來驗證結果是否符合,另外 chai 也有 expect/should 的方式,詳細用法可以參考官方說明文件

執行測試

寫好測試內容,最後就是執行測試囉!
可以直接在家目錄底下執行 mocha,或是把測試指令加到 package.json:

1
2
3
4
5
6
7
// package.json
{
"scripts": {
"dev": "nodemon app",
"test": "mocha --exit"
}
}

指令中加上 --exit 是因為有遇到測試結束後,測試程式沒有終止的情況,所以加上此參數來終止程式。
接著執行 npm test 就會自動執行 test/ 底下的測試。
如果測試成功,會看到以下內容:

Success

失敗的話就會出現:

Failed

這樣我們就完成了使用 mocha 來做測試囉!

參考資料