📝

Supertestを使ったテスト構築方法

2022/09/14に公開

本日のアジェンダ

  1. 今回の目的
  2. テストコード実装の事前準備
  3. テストコード実装
  4. テスト実行
  5. 今回のまとめ

1. 今回の目的

Supertestとは

Supertestとは、Express(JavaScriptでバックエンドアプリを作るのに便利なヤツ)用のテストライブラリのことです。

今回のハンズオンで、皆さんにはSupertestを用いてテストの環境構築からテストコードの実装までできるようになってもらいたいと考えています。

2. テストコード実装の事前準備

  1. こちらのリポジトリをローカルにgit cloneしてください。

  2. cd supertest-sandbox/でディレクトリの移動を行ってください。

  3. node -vを実行し、Node.jsのインストールが完了していることを確認してください。

  4. npm i実行し、必要なパッケージやライブラリをインストールしてください。

  5. npm run startでバックエンドアプリを実行してください。{"status":"running"}と表示されるはずです。

以上で、テストコード実装の事前準備は完了です。

3. テストコード実装

以下の手順で、実際にテストコードを実装していきます。

  1. app.test.jsファイルを作成してください。

  2. 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