PlaywrightでAPIテストを自動化する方法

PlaywrightはE2Eテストツールとして知られていますが、実はAPIテストも実装できます。

今回は意外と知られていないPlaywrightを用いてAPIテストを実装する方法を紹介します。

Playwrightとは

Playwrightは、Microsoft社により開発されたOSSの自動テストツールです。

E2Eテストの自動化ツールとして主に用いられ、シナリオテストやビジュアルテストなど様々な要件に対応した機能を持っています。

また、Chrome、Edge、Safari、Firefoxといった主要ブラウザ全てに対応しています。

その機能の豊富さ、ドキュメントの見やすさ・充実さによる習得コストの低さなどの点で、現存の無料自動テストツールの中で最強と言っても過言ではないでしょう。

PlaywrightでAPIテスト!?

E2EテストがメインのPlaywrightですが、前述の通りAPIテストも実装できてしまいます。

単にAPIの挙動を見たいなら、画面操作なしでAPIだけを直接テストした方が開発も運用も楽です。

E2Eテストと同じプロジェクトに、APIテストも一元で開発・管理できるのは非常に便利ですね。

APIテストの実装方法

Playwrgihtのインストールが済んだら、以下の順番でAPIテストを実装します。

  1. 環境変数を設定する
  2. Configを設定する
  3. テストコードを記述する

環境変数を設定する

環境変数を.envファイルに書き出します。トークンやAPIキーなど秘密情報もここに記述するとよいでしょう。

// .env
API_TOKEN_CUSTOMER_A = token_xxx 
X_API_KEY = apikey_xxx

Configを設定する

各テストでのAPIの呼び出しに用いる設定を一律で行えます。

ここでは、例として以下の情報を設定しています。

  • baseURL:APIのエンドポイント。
  • extraHTTPHeaders:ヘッダーの設定。認可が必要な場合、トークンやAPIキーも設定できます。
  • プロキシ

また、.envファイルで設定した環境変数は、process.envで呼び出します。

// playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
  use: {
    baseURL: "https://example.api.com", 
    extraHTTPHeaders: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${process.env.API_TOKEN}`, 
        "x-api-key":  `${process.env.X_API_KEY}`, 
        "x-user-role": "admin",
        "x-user-category": "member",
    }, 
    proxy: {
        server: `http://proxy.example.co.jp:86`, 
    },
});

テストコードを記述する

実際のAPIテストケースに沿った、テストコードを開発します。

リクエストのdataや検証用のオブジェクトデータがもっと複雑な場合や一元管理したい場では、別途変数やJSONファイルに書きだしても良いでしょう。

// test.spec.ts
test("api test", async ({ request, baseURL }, testInfo) => { 
    const response = await test.step("API実行", async () => {
        return await request.post( `/repos/V1/create/issues`,
        {
            data: {
                title: 'title 1',
                description: 'description 1', 
            }
        }); 
    });
    // レスポンスをレポートに添付する  
    await testInfo.attach("Response", {
        body: JSON.stringify(await response.json(), null, 2), 
    });

    // レスポンスステータスが200であることを検証する
    await test.step("レスポンスステータス確認", async () => { 
        expect(response.ok()).toBeTruthy();
        expect(response.status()).toBe(200); 
    });

    // レスポンスデータに特定のオブジェクトが含まれていることを検証する
    await test.step("レスポンスボディ確認", async () => {
        expect(await response.json()).toContainEqual(expect.objectContaining(
        {
            title: 'title 1',
            description: 'description 1', 
        })); 
    });
});

APIテストで使えるアサーションメソッド

上記のテストコードの例では、レスポンスの検証として、レスポンスステータスとレスポンスボディに特定のオブジェクトが含まれているかを確認しました。

Playwrightでは、この他にもAPIテストで使える様々なアサーションメソッドがあり、それらを使ったAPI結果の検証が可能です。

ステータスコードの確認

ステータスコードが200であることを確認する

Responseクラスstatusメソッドと、アサーションのtoBeメソッドを使います。

// ステータスコードが200であることを確認する 
expect(response.status()).toBe(200);

ステータスコードが200番台であることを確認する

2通りの実装方法があります。

1つ目は、APIResponseAssertionsクラスのtoBeOKメソッドを用いる方法です。

// ステータスコードが200番台であることを確認する 
expect(response).toBeOK();

もう一つの方法は、Responseクラスのokメソッドと、アサーションのtoBeTruthyメソッドを使うものです。

// ステータスコードが200番台であることを確認する 
expect(response.ok()).toBeTruthy();

レスポンスボディの確認

レスポンスボディの中身まで確認するには、確認の粒度ごとに以下のようにテストを実装します。

レスポンスボディが期待データと完全に一致することを確認する

アサーションのtoEqualメソッドを用いて、期待データとレスポンスボディの値が完全に一致していることを確認します。

ここでは、レスポンスボディをJSON形式で出力するため、Responseクラスのjsonメソッドを用います。

// 期待データ
const expectedResponse = 
   {
      id: 101,
      name: "Taro Yamada"
   };

// レスポンスボディが期待データと完全に一致することを検証する
expect(await response.json()).toEqual(expectedResponse);

レスポンスボディに特定の期待データが含まれることを確認する

アサーションのtoContainEqualメソッドを用いて、ある期待データがレスポンスボディに含まれていることを確認します。

この方法は、レスポンスボディがオブジェクトの配列型で、かつ期待データがオブジェクト型の場合使うことができます。

 // レスポンスボディは以下のようなオブジェクトの配列型とする
response = [
   {
      id: 101,
      name: "Taro Yamada"
   },
   {
      id: 102,
      name: "Jiro Kondo"
   },
]
// 期待データはオブジェクト型
const expectedResponse = 
   {
      id: 101,
      name: "Taro Yamada"
   };

expect(await response.json()).toContainEqual(expectedResponse);

レスポンスボディに特定のバリューがあることを確認する

アサーションのtoHavePropertyメソッドを用いて、特定のキーに対してある値が設定されていることを確認します。

 // レスポンスは以下のようなオブジェクトとする
response = 
   {
      id: 101,
      name: "Taro Yamada"
   }
// キー"name"にバリュー"Taro Yamada"が設定されていることを確認する
expect(await response.json()).toHaveProperty("name", "Taro Yamada");

レスポンスボディに含まれる、配列の要素数を確認する

toHaveLengthメソッドを用いて、配列型のレスポンスボディに含まれる要素の数を確認します。

 // レスポンスは以下のようなオブジェクトの配列型とする
response = [
   {
      id: 101,
      name: "Taro Yamada"
   },
   {
      id: 102,
      name: "Jiro Kondo"
   },
   {
      id: 103,
      name: "Shokichi Otani"
   },
]
// 配列の要素数の検証 
expect(response.json()).toHaveLength(3);

ここで紹介した以外にも、Responseクラスメソッドやアサーションメソッドを組み合わせることで、様々な検証が可能になります。

まとめ

E2Eテストの自動テストツールのPlaywrightを用いて、APIの自動テストを行うのに必要な設定方法やテストコードの実装方法を紹介しました。

API対象の自動テストツールとしてのイメージは大きくないと思いますが、PlaywrightにはAPIテスト用の機能が十分に用意されており、非常に有用です。

ぜひAPI対象の自動テストツールとしてPlaywrightを検討してみてはいかがでしょうか?

コメント

タイトルとURLをコピーしました