🕌

【テストフレームワーク】Supertestまとめ【Express】

2025/01/06に公開

Supertestとは

主にExpressの結合テストに用いられるツール
HTTPリクエストをシミュレート、サーバーのエンドポイントが正しく動作するか確認するために使う

JavascriptのテストフレームワークであるJestを組み合わせることで、
効率的にExpressアプリの結合テストができる

Supertestのメリット

  1. 結合テストが簡単にできる

  2. E2Eテストが行える

  3. Expressと相性がいい

  4. Jestとの組み合わせが簡単にできる

  5. エラーハンドリングのテストケースも可能

使い方

Supertestの導入
yarn add --dev supertest
Typescriptを使う場合、yarn add --dev @types/supertest

index.js
const express = require('express');
const app = express();

app.use(express.json());

app.get('/api/hello', (req, res) => {
  res.status(200).json({ message: 'Hello, world!' });
});
module.exports = app;
index.test.js
const request = require('supertest');
const app = require('./app'); // Expressアプリケーションのインポート

describe('GET /api/hello', () => {
  it('should return a greeting message', async () => {
    const res = await request(app).get('/api/hello');
    expect(res.statusCode).toEqual(200);
    expect(res.body).toHaveProperty('message', 'Hello, world!');
  });
});

テスト後にDBをクリーンアップする

src/data/index.ts
import { exit } from 'node:process'
import { db } from '../config/db' //DB接続設定している

const clearData = async () => {
  try {
    //MEMO: DB内のすべてのテーブルを再作成する
    await db.sync({ force: true })
    log('DBをクリアしました')
    //MEMO: 正常終了
    exit(0)
  } catch (error) {
    console.log(error, 'DBのクリアに失敗しました');
    //MEMO: 終了
    exit(1)
  }
}

if (process.argv[2] === '--clear') {
  clearData();
}

pachage.jsonのscriptsに以下を追加

 "pretest": "ts-node ./src/data --clear"

Discussion