iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
自我挑戰組

API 全攻略系列 第 21

Day 21:API 測試自動化(使用 Jest / Supertest)

  • 分享至 

  • xImage
  •  

前言

在前面幾天,我們建立了一個簡單的 Todo API,並且加入了路由、CRUD、資料庫、驗證與 Middleware。不過,隨著功能越來越多,光靠「手動測試」API(用 Postman 或 curl)已經不太夠用了。

這時候,就需要 自動化測試 來幫助我們:

  • 確保功能在修改後依然正常(避免改壞)。
  • 提高開發效率,不用每次都手動點擊測試。
  • 為專案提供更高的穩定性。

今天,我們會用 Jest + Supertest 來完成 Todo API 的自動化測試。


工具介紹

  • Jest :一個功能完整的 JavaScript 測試框架,支援單元測試與整合測試。
  • Supertest :用來模擬 HTTP 請求,專門用於測試 Express API。

安裝方式:

npm install --save-dev jest supertest

在 package.json 中加上測試指令:

"scripts": {
  "test": "jest"
}

撰寫第一個測試

建立一個 tests/todo.test.js 檔案,內容如下:

const request = require('supertest');
const app = require('../app'); // 引入 Express app

describe('Todo API', () => {
  it('應該回傳所有 Todos', async () => {
    const res = await request(app).get('/api/todos');
    expect(res.statusCode).toEqual(200);
    expect(Array.isArray(res.body)).toBe(true);
  });
});

說明:

  1. request(app) → 用 Supertest 直接模擬對 API 的請求。
  2. .get('/api/todos') → 測試 GET 路由。
  3. expect(res.statusCode).toEqual(200) → 驗證回傳的狀態碼是 200。
  4. expect(Array.isArray(res.body)).toBe(true) → 驗證回傳的資料是陣列。

測試 CRUD 功能

建立 Todo

it('應該建立一個新的 Todo', async () => {
  const res = await request(app)
    .post('/api/todos')
    .send({ title: 'Test Todo' });

  expect(res.statusCode).toEqual(201);
  expect(res.body).toHaveProperty('_id');
  expect(res.body.title).toBe('Test Todo');
});

取得單一 Todo

it('應該取得特定 Todo', async () => {
  const newTodo = await request(app)
    .post('/api/todos')
    .send({ title: 'Fetch Me' });

  const res = await request(app).get(`/api/todos/${newTodo.body._id}`);
  expect(res.statusCode).toEqual(200);
  expect(res.body.title).toBe('Fetch Me');
});

更新 Todo

it('應該更新 Todo', async () => {
  const newTodo = await request(app)
    .post('/api/todos')
    .send({ title: 'Update Me' });

  const res = await request(app)
    .put(`/api/todos/${newTodo.body._id}`)
    .send({ title: 'Updated Todo' });

  expect(res.statusCode).toEqual(200);
  expect(res.body.title).toBe('Updated Todo');
});

刪除 Todo

it('應該刪除 Todo', async () => {
  const newTodo = await request(app)
    .post('/api/todos')
    .send({ title: 'Delete Me' });

  const res = await request(app).delete(`/api/todos/${newTodo.body._id}`);
  expect(res.statusCode).toEqual(200);
  expect(res.body).toHaveProperty('message', 'Todo deleted');
});

執行測試

在終端機執行:

npm test

如果一切正常,會看到類似輸出:

PASS  tests/todo.test.js
  Todo API
    應該回傳所有 Todos (50 ms)
    應該建立一個新的 Todo (30 ms)
    應該取得特定 Todo (25 ms)
    應該更新 Todo (28 ms)
    應該刪除 Todo (26 ms)

小結

今天我們學會了:

  • 使用 Jest + Supertest 進行 API 測試自動化。
  • 如何撰寫 CRUD 測試案例 ,確保 API 功能穩定。
  • 測試能幫助我們在專案成長過程中,避免功能壞掉卻沒發現。

到這裡,我們的 Todo API 已經不只是能跑,還能確保「每次修改都不會出錯」!


上一篇
Day 20:Middleware 介紹與應用
下一篇
Day 22:gRPC 簡介
系列文
API 全攻略24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言