🧪

ExpressサーバのE2Eテスト

2024/01/10に公開

Expressで作ったAPIサーバのエンドポイントベースのテストを書きたかった。

TypeScriptで書いたのでTS対応も考慮する。
今回はsupertestとjestを使ってみる。

モジュールインストール

$ yarn add -D jest supertest ts-jest @types/jest @types/supertest

Jestの設定

JestでTypeScriptを使用するために、Jestの設定でTypeScriptのトランスパイラーを設定する。プロジェクトのルートディレクトリにjest.config.tsを作成し、以下の内容を追加。

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
};

Expressサーバのサンプルコード

GETとPOSTをサンプルとして用意

// app.ts
import express, { Express, Request, Response } from 'express';

const app: Express = express();
app.use(express.json()); // JSONボディを解析するために必要

app.get('/hello', (req: Request, res: Response) => {
  res.status(200).json({ message: 'Hello world.' });
});

app.post('/data', (req, res) => {
  const data = req.body;
  // 何かしらの処理を行う
  res.status(201).json({ message: 'Data received', data });
});

export default app;
// server.ts
import app from './app';

const port = process.env.PORT || 3000;

app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

テストケースの記述

// app.test.ts
import request from 'supertest';
import app from './app';

describe('GET /hello', () => {
  it('responds with json', async () => {
    const response = await request(app)
      .get('/user')
      .expect('Content-Type', /json/)
      .expect(200);

    expect(response.body).toEqual({ message: 'Hello world.' });
  });
});


describe("POST /data", () => {
  it("responds with json", async () => {
    const testData = { key: "value" };

    const response = await request(app)
      .post("/data")
      .send(testData) // テストデータを送信
      .expect("Content-Type", /json/)
      .expect(201);

    expect(response.body).toEqual({
      message: "Data received",
      data: testData,
    });
  });
});

テストの実行

package.jsonにテストスクリプトを追加。

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

実行すると通った!

$ yarn test
 PASS  src/app.test.ts
  GET /hello
    ✓ responds with json (17 ms)
  POST /data
    ✓ responds with json (6 ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.62 s, estimated 2 s
Ran all test suites.
✨  Done in 2.13s.

Discussion