Supertestを使ったテスト構築方法
本日のアジェンダ
- 今回の目的
- テストコード実装の事前準備
- テストコード実装
- テスト実行
- 今回のまとめ
1. 今回の目的
Supertestとは
Supertestとは、Express(JavaScriptでバックエンドアプリを作るのに便利なヤツ)用のテストライブラリのことです。
今回のハンズオンで、皆さんにはSupertestを用いてテストの環境構築からテストコードの実装までできるようになってもらいたいと考えています。
2. テストコード実装の事前準備
-
こちらのリポジトリをローカルに
git clone
してください。 -
cd supertest-sandbox/
でディレクトリの移動を行ってください。 -
node -v
を実行し、Node.jsのインストールが完了していることを確認してください。 -
npm i
実行し、必要なパッケージやライブラリをインストールしてください。 -
npm run start
でバックエンドアプリを実行してください。{"status":"running"}
と表示されるはずです。
以上で、テストコード実装の事前準備は完了です。
3. テストコード実装
以下の手順で、実際にテストコードを実装していきます。
-
app.test.js
ファイルを作成してください。 -
describe-test構文を用いてテストコードを記述していきます。
この構文について説明します。
describe('テストブロックの説明', () => {
test('テストケースの説明', () => {
//テストコードを書く//
});
});
このように、行うテストをいくつか記述していきます。
詳しい説明はこちらです。
今回作成するテストコード
以下が、今回作成するテストコードになります。
import request from "supertest";
import app from "./app.js";
describe("GET /", () => {
test("runningの文字列が返ってくることの確認", async () => {
const response = await request(app).get("/");
expect(response.body.status).toBe("running");
});
});
describe("POST /users", () => {
test("ユーザー名とパスワードを入力した場合userIdが返ってくることの確認", async () => {
const response = await request(app).post("/users").send({
username: "user",
password: "pass",
});
expect(response.body.userId).toBeDefined();
});
test("ユーザー名とパスワード一方でも未入力の場合ステータスコード400が返ってくることの確認", async () => {
const bodies = [{ username: "user" }, { password: "pass" }, {}];
for (const body of bodies) {
const response = await request(app).post("/users").send(body);
expect(response.statusCode).toBe(400);
}
});
});
<補足資料>
同期処理、非同期処理について
async,awaitについて
4. テスト実施
作成したテストを実行する際はnpm run test
を使用します。
テストが期待通りの結果であればpassed
、そうでなければfailed
が返ってきます。
5. 今回のまとめ
今回は、supertestというテストライブラリを用いて、テストの環境構築から実装までを行いました。
テスト自動化を行うと以下などのメリットがあります。
- 不具合の早期発見
- テスト実施工数の削減
しかし、場合によってはデメリットが発生したり、そもそも自動テストを導入すべきでないケースもあります。例えば、
- テスト自動化の構築や運用・保守にかかるコストの割合が大きい
- 効果があまり見込めない(削減工数が少ない、あまり高品質化を見込めないなど)
などがあります。
導入前に導入の目的や必要性を見極め、開発をより良いものにしていきましょう。
Discussion