Amazon Q Developer（自動コーディングAI）で、ドキュメント生成とUTを自動化するので、私は指示するだけ

https://aws.amazon.com/jp/blogs/news/weekly-genai-20241202/

最近行われたラスベガスでの大きなイベントで発表されたAmazonQの以下新機能を試してみました。
・ドキュメント生成
・UT自動作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/6fe98727-af6e-df4a-54c7-00184a1bac5b.png)

# 環境構築

言語、フレームワーク等の環境に縛りは無いですが、
今回は手っ取り早いSpringBootでRestAPI環境を構築して、検証を行います。

以下を参考にAmazonQでコード生成できるようにしてください。

https://qiita.com/Jasmine_teeeeee/items/a9533f8b0a855fb16eba

getメソッドのAPIを作成します。
コードの生成をしてほしいので、「/dev」で依頼を出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/1db61bf8-128c-e939-85a4-34e4d227d47d.png)
>/dev
>AI want to create an API for retrieving inventory information. The request should include the store number, store name, product code, and product name. The response should include the store number, store name, region, product code, product name, inventory quantity, order quantity, and scheduled delivery date.

上記で実行すると、サマリと操作するファイルの一覧を出してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/938b1da1-78ad-e86f-8f09-a5534afb0792.png)

その次にフォルダ構成に提案
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/14199f69-704e-b019-678e-ea5b6dacc0fa.png)

最後に提案内容を承認するか質問されるので、承認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/4b06a795-e862-9def-6eae-d8ba5dd0cb9c.png)

ファイルが作成されます。特に待ち時間無くすぐに反映されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/1591a315-ad6c-52cf-44ba-84d45f181c49.png)

まだ何かある？と聞かれるので、はいを選択して、以下検証を実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/5c042ab5-bbff-420b-82f8-a7524d395bbb.png)

# 検証

## ドキュメント生成

ドキュメントの生成を行うには「/doc」をテキストボックスに入力して、実行を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/cc0472ac-d7a6-86fe-4771-34e8d4d061c0.png)

今回は初回作成なので、以下を選択します。

:::note info
めも
ドキュメントが作成済みの場合、
新規作成を選んでも、更新を選んでも、ルートディレクトリを選択していれば、
どちらでも大丈夫です。（最終的には差分を確認できる）
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/fce6ee02-f037-fce3-786d-20d67975ef03.png)

ドキュメント生成が必要なディレクトリを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/e61c3a23-d982-ee4e-8f22-1c2f5c4161ba.png)

ドキュメント生成中です。しばらく待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/b46c3e1f-452f-368e-b82c-b0f90e79366f.png)

ReadMeファイルが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/e91e877a-1484-7843-54bf-6082c03ec33f.png)

※作成済みのreadmeがある場合、差分で表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/918ba63f-530a-420f-e619-4b641fed0f11.png)

承認するとプレビュー表示してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/928557a8-dac8-d59c-87e8-1f7df1f0e515.png)

これはどういう線だ？こういうものなんですかね。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/1238473f-f8a5-2da3-c030-54511658a873.png)

## 実装方法の理由を質問してリファクタする

今回生成されたAPIがpostだったので、なぜpostにしたのか質問してみます。

解析対象のコードを右クリックし、「explain」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/bd57d27e-0ef6-a473-0a35-8fe7f46685cc.png)

このコードの意味を説明してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/b2e13927-6d4a-f311-3851-ce12f6f43255.png)

人間「なんでPOSTなん？」
Q　 「ごめん、確かにそうだわ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/d455dc43-a866-2c58-8b89-beca29f5ed6a.png)

このままリファクタ案で書き換えようとすると、変更箇所を人間が理解して元コードを手動で除去する必要があります。
いっそファイルごと書き換えてもらいましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/c20f8061-35b2-4e09-0e86-4d1da84bbdb4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/acf339aa-db7b-095a-a3be-c33a021e0f14.png)

気を利かせて色々提案してくれました。
>/api/inventory - 一般的な在庫クエリ
>/api/inventory/{storeNumber}/products/{productCode} - ストア内の特定の商品
>/api/inventory/stores/{storeNumber} - ストア全体の在庫

よさそうなのでリファクタ案を取り入れてみます。

:::note warn
注意
「insert at cursor」の場合は、変更箇所を人間が理解して元コードを手動で除去する必要があります。
今回はファイル全てのリファクタ案を出し直してもらったので、一度元ファイルのコードを全削除してから、
「insert at cursor」します。
:::

ファイルを書き換えて保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/3ee72d96-7c44-98d8-6fd2-76b107986da8.png)

構造が変わったので、ドキュメントも再度生成します。
「/doc」してこんな感じで選択していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/1863347b-96fe-12a4-62a5-f8b29d05cd33.png)

新規分は追加されましたが、ゴミが残っているので正しく作成し直してもらいましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/4f2ca258-8b9c-560e-a7dd-d1955e48e63d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/324da8ea-a836-45ea-2d25-33f3d4acf534.png)

実態に合わせてくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/62a733c9-d98e-f2d2-6943-4b31cf70dfd4.png)

### 作成されたAPIを実行してみる

使い方を教えてもらいましょう。「how to use」と入力したのち、
使いたいAPI情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/a69fa64f-3df0-42d4-be5d-d4bd70adc4f7.png)

サンプルリクエストデータを実行すると以下の通り、データが取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/169045a8-ebc9-9eb9-050a-977a6d74b8ce.png)

## UT自動作成

UT自動を作成するには「/test」をテキストボックスに入力して、実行を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/1a728838-98d2-15e0-3c95-294dcb3135ed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/64c85cdf-05f6-ca27-e75c-c746d3f23d02.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/c9abe39a-5179-d8f3-274a-f248fde87035.png)

不明点あれば部分的に質問ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/40264f20-073b-01f6-2d7b-a0fc4050d9f4.png)

### 作成されたUTを実行してみる

テストを実行してみましたが、失敗しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/0cb5ad91-4721-cee8-92be-40adaf10cf65.png)

人間「できないぞ、なんでだ？」
Q　 「ホントだ。必須になってないわ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/42b2d6d9-8a13-845f-56d0-00fd2e9e15f8.png)

必須が正しいのか、指定なしを許容するのかは業務次第だと思いますので、
人間が正しい方を指定して、修正していきます。

# 最後に

今回は仕様をふわっと伝えたので、リクエストの必須チェックが中途半端に実装されてしまいましたが、
実装通りのUTではなく、あくまで仕様に沿った出力をしていたのかなと思うと、こっち方が優秀でバグ検出が上手くできそうではあるものの、
どこで検知するのが正しいのか、また、このように不確定な検出方法としていいのか、課題が残るので、
仕様依頼をきちんと行って（設計書を作成してみようかな）からもう一度検証してみようと思いました。