🧪
ExpressサーバのE2Eテスト
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