生成AIでAPIテスト自動化（テストケース生成→コード生成→実行）やってみよう！

# はじめに

テストのための生成AIを搭載した「****UiPath Autopilot for Testers****」でAPIテストの自動化もできるので、本ブログでは、どんな手順で達成できるのか、コツの一部を補足しつつ解説します。尚、UI操作を伴うアプリテストについては、下記ブログで解説しています。

https://qiita.com/Jun96427231/items/8edc9fcc754396dbe2fb

# 全体の流れ
本ブログで解説するのは、①テスト抽出、②テストコード生成、③実行までの流れです。いくつかの例に沿ってやって行きます。尚、テストを抽出する際のドキュメントはAPI仕様書やシーケンス図などを想定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/b3a877ec-8013-c9d5-6339-fee2aa0bc629.png)

# 前提
1. Autopilot for Testersを利用したAPIテストの公式ドキュメントがないため、著者の創造と工夫で執筆してます。今後、公式ドキュメントが公開された場合、最適解が異なる可能性があります。
1.  生成AIなので日々できること、精度が進化しています。ここでの情報から、更に良い方向に変わっていくと思ってます。

# 本ブログでテストするWeb APIの題材
題材として使うWeb APIはUiPath Orchestrator APIです。このAPIをテストすると言った視点に立ち解説します。UiPath Orchestrator API仕様はSwaggerで調べられるので、この中からPOSTとGETのAPIを2つ利用します。

****＜UiPath Orchestrator APIのSwaager＞****
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/8675fc9e-919b-29fd-49cb-264e334306d9.png)

****＜テスト対象のAPI＞****
|メソッド| API名 |説明|
|:-----------|:-|:------------|
|POST| StartTestSetExecution|テストセットの実行を開始する。|
|GET| TestSetExecutions|テストセット実行IDで識別される特定のテストセット実行情報を返す。 |


# ❶POSTメソッドのAPIテストをやってみる
まずは、POSTメソッドのStartTestSetExecutionのAPIテストをやってみます。

## (1)準備

### ・API仕様書を用意する
StartTestSetExecutionのAPI仕様を適当に作成してみました。フォーマットはフリーです。テストで必要な情報が書かれている仕様書ならOKです。

ファイル名：API仕様書.xlsx
シート名：StartTestSetExecution
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/98e55fc8-0298-d490-4801-99e217061a8a.png)

### ・APIコールで使用する設定値ファイルを用意する
APIコールで使う設定値です。環境に合わせて、変更できる様に別ファイルで定義しました。この設定値を生成AIに参照させてテスト生成してみます。

ファイル名：API共通設定値.xlsx
シート名：設定値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/8a979b9b-1875-e8e3-42d5-04b0b90e334d.png)

## (2)テスト生成

### ・要件を作成する
下記の様に要件を登録します。ちなみに説明欄にAPI仕様など入れておくとAPI仕様書は不要です。ここは仕様の管理・運用方法で決まると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/0959c7b6-32c6-b0c3-6a3e-78f91d877e40.png)

### ・テストを生成する
[テストを生成]をクリックして、用意したドキュメントを生成AIに提供します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/18ca4f4a-dbdd-8db2-1bbe-a209e05c74e6.png)

テスト生成で指示するプロンプトを入力します。選択できる既定のプロンプトにはAPIテストに関するものが提供されていないため、完全オリジナルです。作成したプロンプトをプロンプトライブラリに登録しておくと、プロンプトの使い回しができるのでお勧めです。プロンプトは、大事なナレッジです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/f7453020-5990-9150-bc2a-c6e53dbbee31.png)

::: note info
****プロンプトへの指示について****
アプリテストでは****UI操作の手動ステップ****を元にテストコードを生成しますが、APIテストでは手動ステップの代わりに****処理ステップ****を生成すると言った観点に近いです。また、コード生成の精度を上げるために処理ステップには処理で必要な全ての情報が格納される様、プロンプトに細かく指示することをお勧めします。
:::

API仕様書に基づいた正常系と異常系のテストケースでが生成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/98dfe6fa-ec1b-1b37-4ad8-3e79e1dc742c.png)

試しに正常系のテストケースを1つ格納して生成されたステップを確認してみます。APIコールに必要な情報が全て格納されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/f0bd964a-f46b-d5fd-68ba-cd8f023f4f75.png)

## (3)テストコード生成して実行する
UiPath Studioで、本テストケースのコードを生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/ca83b1b9-46ae-b3a4-dcda-05d5e759938d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/e1d8b570-78ed-d277-088c-80109d0e1cb1.png)


::: note warn
****コード生成について****
生成されたコードを見直して、誤っている箇所があれば修正するか、コード生成を再実行します。尚、ローコードでも生成可能ですが、まだC#によるコード生成の方が精度は良いようです。
:::


テストを実行すると2つの合格が確認できました。1つ目は、ステータスコードが200で返ってきたかの検証、2つ目はレスポンスに整数値（テストセット実行ID）が返ってきたかの検証です。このテストコードでは本当にテストセットがトリガーされたか検証は出来ないので、後述で解決します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/9115ddc9-f0d4-82ec-7677-e0108e92bf95.png)

# ❷GETメソッドのAPIテストをやってみる
続けて、GETメソッドのTestSetExecutionsのAPIテストをやってみます。

## (1)準備

### ・API仕様書を用意する
TestSetExecutionsのAPI仕様も適当に作成してみました。
応答レスポンスの情報は、いっぱいありますが、お試しなのでハショリました。

ファイル名：API仕様書.xlsx
シート名：TestSetExecutions
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/83b27593-ede5-fa8a-7bd6-63e3868d237e.png)

### ・テストデータを用意する
Orchestratorに既に格納されているテストセット実行情報が取得できるか検証させたいので、そのテストセット実行IDと、期待するテストセット実行情報をテストデータとして用意します。このデータを生成AIに参照させてテスト生成してみます。
ファイル名：APIテストデータ.xlsx
シート名：設定値

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/b380edfc-f233-b6ca-2ffb-36d02d397763.png)

## (2)テスト生成

### ・要件を作成する
下記の様に要件を登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/12719792-c1c9-8410-bc6f-0f15decafeef.png)

### ・テストを生成する
[テストを生成]をクリックして、用意したドキュメントを生成AIに提供します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/a14da684-e432-3678-c828-6d4a12400b47.png)

テスト生成で指示するプロンプトを入力します。尚、前述のPOSTの際のプロンプトと異なる点は、API名と「APIテストデータ.xlsx」記載のテストデータをテストケース生成のバリエーションで使用してください。と追加している点です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/9373e147-3f4c-20f6-848f-3b0eef8b1d59.png)

API仕様書に基づいた正常系と異常系のテストケースでが生成されました。この中で、テストデータを利用した正常系の2件を格納してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/13347789-638a-87a5-f1eb-bd7b38127a8b.png)

生成された2つのテストケースに格納されたステップを確認してみます。テストデータが使われていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/881fbc1c-b993-e789-872f-c205e7d46589.png)

## (3)テストコード生成して実行する
UiPath Studioで、本テストケースのコードを生成して、実行します。

****＜テストセット実行IDが有効な場合のステータス確認＞****
テストセット実行ID「239850」のテストセット実行情報のStatusが「Cancelled」なので合格です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/41d4423e-a2c3-e8bf-0f72-64d34d77d1c9.png)

****＜テストセット実行IDがペンディング状態の場合のステータス確認＞****
テストセット実行ID「240047」のテストセット実行情報のStatusが「Pending」なので合格です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/962f11a9-d61e-0d90-8946-3f5d8965900a.png)

# ❸複数のAPIを呼び出すシーケンス図でテストをやってみる
「StartTestSetExecution」でテストセットを実行し、戻り値のテストセット実行IDを使用して、「TestSetExecutions」でテストセット実行情報を取得、実際にトリガーされた状態なのか検証します。

## (1)準備

### ・シーケンス図を用意する
別ファイルで適当に作成してみました。画像ファイルです。

ファイル名：APIシーケンス図.png
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/9db28e18-b8b0-0a27-7453-a6e91cb7a45a.png)

## (2)テスト生成

### ・テストを生成する
「StartTestSetExecution」の要件にテストケースを追加します。[テストを生成]をクリックして、用意したドキュメントを生成AIに提供します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/445e4be6-fac6-d8dc-a779-1ab0b0b3cd13.png)

テスト生成で指示するプロンプトを入力します。これまでのプロンプトから前半部分は大幅に変更してます。観点としては、シーケンスを通してレスポンスの値が以降のAPIの設定値で利用できる場合は、レスポンスの値を使用する点と、それぞれのAPIコール毎にHttpClient クラスの新しいインスタンスを初期化し、ベアラートークンとパラメータの設定も再設定する様に指示しています。この指示がなければ、テストコード生成の精度が低かったためです。今後はプロンプトに指示しなくても改善される可能性はあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/61107d70-259c-3e4b-126d-df2e27970ccb.png)

生成を実行するとシーケンス図に基づいたテストケースでが生成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/0207012e-f536-839a-8c7b-1a73cd29b6c0.png)

生成されたテストケースに格納されたステップを確認してみます。シーケンス図の処理ステップとテストコード生成で必要な情報が格納されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/e8fe33ac-502a-4a51-1848-47b3e4985f37.png)

## (3)テストコード生成して実行する
UiPath Studioで、本テストケースのコードを生成して、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/8d7cfac9-c495-64c9-e375-2acc6bc6ce0b.png)

テストを実行すると2つの合格が確認できました。1つ目は、「StartTestSetExecution」のレスポンスに整数値（テストセット実行ID）が返ってきたので合格です。2つ目は、このテストセット実行IDを使用して、「TestSetExecutions」でテストセット実行情報を取得、Statusが「Pending」なので合格です。これで実際にトリガーされ、正しく機能していることが検証できました。


::: note info
テストコードをOrchestratorにパブリッシュして登録しておけば、自動で実行するリグレッションテストもできる様になります。
:::

# おわりに
UiPath Autopilot for Testersを利用したAPIテストの自動化を紹介させて頂きました。今回、簡単な題材でしたが、工夫したら色々とできそうです。これからも情報をアップデートして行きたいと思います！