Postman × GitHub Actions でWebAPIのテストを自動化しよう！

こんにちは！はっしーです！
この記事は、Postman Advent Calendar 2023 シリーズ1、18日目の記事です。

Postmanの日本法人設立、日本上陸おめでとうございます！
各地でイベントも多く開かれており、盛り上がりをとても感じています！
福岡に住んでいる私も以下のイベントにオンラインで参加しました！（参加者に配られたPostman Tシャツはめちゃくちゃ可愛くて、当日現地に行けなかったことを悔やみました...泣）
ぜひまた福岡に来てください！

https://postman.connpass.com/event/289659/


以前よりAPIクライアントとしてPostmanは使用していました。
ただ、ほんとにAPIクライアントとしての機能のみですｗ
Meetupやワークショップで、ほかにもAPIカタログやAPIテスト、モックサーバーなど様々な機能があることを知りました。

今回は、APIテストの自動化について触ってみたので紹介したいと思います！

記事の流れとしては以下です。

- サンプルのアプリを作成する。
- GitHub Actionを使用してアプリをAzureにデプロイする。
- GitHub ActionにPostmanのAPIテストを組み込み自動化する。


## サンプルのアプリを作成する

では早速サンプルのアプリを作成します。
使用技術：C#、ASP.NET CoreのMinimal API
開発環境：GitHub Codespaces

- GitHubリポジトリを作成して、Codespaceを立ち上げます。
![2023-12-17_16h22_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/4bca101b-1c15-397f-2687-6ad313098d26.png)
![2023-12-17_16h23_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/ec872371-1778-2cd3-32a5-dcdf491160cd.png)
![2023-12-17_16h24_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/e1192160-ff05-88f1-3c5a-4ae50bc8d022.png)


- ターミナルで以下コマンドを入力します。

    - `dotnet new web -o SampleApi`
![2023-12-17_16h30_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/f1ed3bcd-1d5d-4b9d-3227-d44ea4d8e038.png)

    - `cd SampleApi`
    - `dotnet run`
![2023-12-17_16h37_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/5ad9ccd7-3b06-4828-f05d-147eb4908c4d.png)
- ソリューションファイルを作り忘れていたので作成し、プロジェクトを追加します。
    - `dotnet new sln`
    - `dotnet sln add SampleApi`
![2023-12-18_22h22_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/00e26f42-da9d-62a3-81b0-9f98a98203f3.png)


- これでGETのHTTPリクエストに対して、「Hello World!」と返すアプリケーションができました。

## Postmanを使用してリクエストを送信する

- まずは、Codespacesで実行中のAPIにアクセスできるように設定します。（今回は認証なしでアクセスできるようにします）
- Codespaces画面でポートタブを選択します。
- 実行中のポートで右クリックし、ポートの表示範囲をPublicに変更します。![2023-12-18_21h39_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/bcc1e9ab-5723-a44f-961e-73b9bb707fe2.png)
- 転送されたアドレス宛にPostmanからリクエストを行います。
![2023-12-18_21h45_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/5e4d4e17-8e0b-aca7-6033-5414d4c48381.png)
- Hello Worldが返ってきました。

## サンプルアプリをAzureにデプロイする
- ここで一度変更をコミット、プッシュしましょう。
![2023-12-18_21h47_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/241d17f6-52f0-ba64-d0c0-d0b5202e844c.png)

- [Azure Portal](https://portal.azure.com/#home)にアクセスします。

- リソースの作成を選択します。
![2023-12-18_21h51_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/2bd0b6d3-e162-a892-6428-01c78206092e.png)

- Webアプリの作成を選択します
（サービスが出てこない場合は検索窓で検索してください）
![2023-12-18_21h52_211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/57a60deb-87a1-3976-73ab-5d7cc83a8bb3.png)
- 以下の内容でWebアプリの作成を行います。
    - 基本タブ
        - サブスクリプション：任意
        - リソースグループ：任意の名前で作成
        - 名前：任意の名前
        - ランタイムスタック：.NET7
        - オペレーティングシステム：Windows
        - 地域：Japan East
        - 価格プラン
            - Windowsプラン：任意の名前で作成
            - 価格プラン：Free F1を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/6d7d8445-5f15-54e6-d190-b077a50430f1.png)

    - デプロイタグ
        - デプロイタグを選択します![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/320dc0f7-d081-8bed-317c-4737b64e70d0.png)
        - GitHub Actionsの設定を有効化します。
        - サンプルアプリのリポジトリを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/4faa52fe-d9dc-8cba-c472-d096fb104562.png)
    - 基本タブとデプロイタブの設定ができたら、確認及び作成を選択します。![2023-12-18_22h08_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/a82484b4-fba5-ab94-aacb-d78b720308f9.png)
    - 内容を確認し、入力した情報と相違なければ作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/db2687cb-7b6d-cf67-156a-6d9bda2b436f.png)

- デプロイが完了したら、リソースに移動します。
![2023-12-18_22h32_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/a7862b70-0fba-560e-5a90-3923c727f567.png)

- GitHubリポジトリ、Actionsタブからワークフローが実行されていることが確認できます。（※ソリューションファイルを作り忘れていたので1度失敗しました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/cd52782e-abc7-c70d-efc6-5efeb66a8e68.png)

- URLへアクセスすると、Codespacesのときと同じく「Hello World!」が確認できます。
![2023-12-18_22h34_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/2a36ba81-8450-b17c-427d-5056e8a3a23b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/993d9c81-cf8f-4493-65c2-5fe8dc04c1e1.png)

これでデプロイが完了しました！

## Postmanでテストを作成する

- それではPostmanでAPIのテストを作成してみます。
- まずリクエスト先のURLをCodeSpacesのURLからデプロイ先のURLに変更し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/dd31a554-7235-ff4d-ccff-f041a9d814e1.png)

- リクエストのTestsタブを選択します。
- 今回、テストの作成にPostbotを使用してみます。
https://www.postman.com/product/postbot/
- Postbotのアイコンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/a221ae4c-cff2-e12e-62d0-4c47764669ba.png)
- Add Tests to this request を選択します。すると....
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/d0fb836b-9c08-9149-a9f2-062211101984.png)
- 以下のようなテストが作成されました！めちゃくちゃ便利！
    ```
    
    pm.test("Response status code is 200", function () {
        pm.expect(pm.response.code).to.equal(200);
    });
    
    
    pm.test("Response has the correct Content-Type header", function () {
        pm.expect(pm.response.headers.get("Content-Type")).to.include("text/plain");
    });
    
    
    pm.test("Response body is not empty", function () {
        pm.expect(pm.response.text()).to.not.be.empty;
    });
    
    
    pm.test("Response body contains the expected text 'Hello World!'", function () {
        pm.expect(pm.response.text()).to.include("Hello World!");
    });
    
    
    ```
- リクエストを実行して、レスポンスのTest Resultsタブを選択するとテスト結果が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/808e0ce8-7b86-e189-f035-74b863b3fc8b.png)



## GitHub ActionsにAPIテストを組み込む
APIのテストを自動で行うようにActionsのワークフローに組み込んでみましょう！

- 
- リクエストが含まれるPostmanのコレクションを選択します。
- Runsタブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/811816bc-a3f5-f30f-f613-1f2273249015.png)
- コレクションランナーの実行方法を選択し、「Configure command」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/a27f30df-9607-fc38-59c1-e0f33ce3f70d.png)

- 実行するコレクションとCI/CDサービス、実行環境のOSを指定します。（今回はPostmanの環境変数は設定していなのでEnvironmentは空欄です、実際は環境変数を設定し選択します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/3f69f0a5-3adc-bdd7-8b26-9ca61b82a077.png)
- APIKeyを生成します。Keyには使用するアプリがわかるような任意の名前を付けます。
- 生成されたKeyはメモ帳などに控えておきます。
- 同様に「Copy Postman CLI Command」を選択し、控えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/5681fb7e-9211-91f1-c32b-163f03851b9a.png)


- GitHubリポジトリ移動します。
- GitHubリポジトリのシークレットにPostmanのAPIKeyを登録します。
- リポジトリのSettingsタブに移動し、Secrets and bariables > Actionsを選択、New repository secretを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/a177d204-66ae-2f29-bec4-e241650b81ca.png)
- `POSTMAN_API_KEY`という名前で、さきほど控えておいたシークレットを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/6c8b04c6-f4d9-074d-fc11-c28cf764b204.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/084fae5e-5ce8-47f3-32f8-9682a5077dc3.png)

### GitHubリポジトリのワークフローを更新
- Githubリポジトリのワークフローファイルに移動します。
- Editボタンを押して、Postmanのテストを実行するJobを追加します。
- デプロイ後に動作をテストするように設定しました。
```
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions

name: Build and deploy ASP.Net Core app to Azure Web App - app-postman-test-api

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    runs-on: windows-latest

    steps:
      - uses: actions/checkout@v4

      - name: Set up .NET Core
        uses: actions/setup-dotnet@v1
        with:
          dotnet-version: '7.x'
          include-prerelease: true

      - name: Build with dotnet
        run: dotnet build --configuration Release

      - name: dotnet publish
        run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp

      - name: Upload artifact for deployment job
        uses: actions/upload-artifact@v3
        with:
          name: .net-app
          path: ${{env.DOTNET_ROOT}}/myapp

  deploy:
    runs-on: windows-latest
    needs: build
    environment:
      name: 'Production'
      url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}

    steps:
      - name: Download artifact from build job
        uses: actions/download-artifact@v3
        with:
          name: .net-app

      - name: Deploy to Azure Web App
        id: deploy-to-webapp
        uses: azure/webapps-deploy@v2
        with:
          app-name: 'app-postman-test-api'
          slot-name: 'Production'
          publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_92F20BE71AB14367A2E112CFB370C9C2 }}
          package: .

  automated-api-tests:
    runs-on: windows-latest
    needs: deploy
    steps:
      - uses: actions/checkout@v3
      - name: Install Postman CLI
        run: |
          powershell.exe -NoProfile -InputFormat None -ExecutionPolicy AllSigned -Command "[System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://dl-cli.pstmn.io/install/win64.ps1'))"
      - name: Login to Postman CLI
        run: postman login --with-api-key ${{ secrets.POSTMAN_API_KEY }}
      - name: Run API tests
```
- 変更をコミットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/fd9048f9-a4b1-85f4-71c3-4e889a405727.png)
- GitHubリポジトリのActionsタブに移動すると、ワークフローが実行されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/9c897e1e-4b8c-2d68-c242-2606dfaae7dd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/c97cfea0-8229-9520-2365-891edab318a9.png)
- ワークフローの実行が終わると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/58385003-4355-c9b9-12c8-3e6e39d4e3bc.png)

### APIテスト結果の確認
- automated-api-testsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/5794dc04-aa0e-6c2c-ee57-f3b149bbf7c6.png)
- Postmanで作成した4つのテストが実行されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704555/44f01c88-820a-b812-2641-ecded0f1bc02.png)

## まとめ
今回は、Postmanを使用したAPIテスト自動化のワークフローを構成しました。

テスト作成からワークフローファイルのスクリプトなどPostmanが自動で生成してくれてとても簡単に設定することができました。

パフォーマンステストや、結果のビジュアライズなど触れていない機能もあるみたいなのでどんどん触っていこうと思います。

最後まで読んでいただきありがとうございました！