１度やってみて！Webアプリ開発でのプロンプトエンジニアリング

![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942148/c8aeebc3-eecc-db96-9f09-7a59d03b07fc.png)

こんにちは、Naotoです:atom:

表題の件ですが、ざっと経緯だけ説明をさせてください。
私が参画しているプロジェクトでChatGPTにプログラムコードやプロジェクト内の相談をしていたところ、

- 同僚：「もしかしてプロンプトエンジニアリングをされてます？」
- 私：「そんな大層なものじゃないけど、AIにマクロ組んでもらってますよ」
- 同僚：「そのやり方を手順書におこしてほしい!!」
- 私：「独学だから教本と合わせて確認してね(笑)」

複数のプロジェクトや研修でご一緒した方に毎回聞かれるので、いっそオープンなところで記事を書こうと考えた次第です。

---

### 読者の方々に質問です:point_left_tone2:

プロンプトエンジニアリングは難しそうなイメージがないでしょうか？:thinking:

#### ■ 難しそうなイメージ

- 何から手を付けてよいかわからない...
- 決まったフォーマットが必要なのでは？
- 求めてた回答と違ったときにこの後どう修正すればいいの？

上記は払拭できるイメージです。
ChatGPTに記載するメッセージは、以下のイメージを頭に入れておいてください。

"友達/同僚に教えてもらう" or "友達/同僚に聞く" ようなイメージでOKです。

---

### ChatGPTを使用して実際のプロジェクトでも私が使用しているプロンプトのやり方を記載します。

#### 例 1-1: コード作成の相談

```
JavaのSpringBootで作成されたコードのJUnitを作成してほしいって言われたけど、何から手をつけるべきかな？
サンプルのJUnitはあるけど、カバレッジレポートも必要なんだって。
JUnitのコード作成と、カバレッジレポートはどうやればいいか教えて。
```

##### 解説：Spring BootプロジェクトでJUnitを作成し、カバレッジレポートを生成する流れ

1. **JUnitのセットアップ**

   プロジェクトの`pom.xml`（Maven使用時）または`build.gradle`（Gradle使用時）にJUnitとテスト関連の依存関係を追加します。

   - Mavenの場合：
     ```xml
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
     ```

   - Gradleの場合：
     ```gradle
     dependencies {
         testImplementation 'org.springframework.boot:spring-boot-starter-test'
     }
     ```

2. **JUnitのコード作成**

   - **a. テスト対象のクラスを決める**
     実装済みのクラスのうち、まず重要なロジックやビジネスルールを含むメソッドをテスト対象にします。

   - **b. サンプルコードに基づきJUnitテストを作成**

     対象クラス例：
     ```java
     @Service
     public class CalculatorService {
         public int add(int a, int b) {
             return a + b;
         }

         public int subtract(int a, int b) {
             return a - b;
         }
     }
     ```

     JUnitテスト例：
     ```java
     @SpringBootTest
     public class CalculatorServiceTest {

         @Autowired
         private CalculatorService calculatorService;

         @Test
         public void testAdd() {
             int result = calculatorService.add(2, 3);
             Assertions.assertEquals(5, result, "Addition method failed");
         }

         @Test
         public void testSubtract() {
             int result = calculatorService.subtract(5, 3);
             Assertions.assertEquals(2, result, "Subtraction method failed");
         }
     }
     ```

3. **カバレッジレポートの生成**

   - **a. Jacocoをセットアップ**

     Mavenの場合：`pom.xml`に以下を追加
     ```xml
     <build>
         <plugins>
             <plugin>
                 <groupId>org.jacoco</groupId>
                 <artifactId>jacoco-maven-plugin</artifactId>
                 <version>0.8.8</version>
                 <executions>
                     <execution>
                         <goals>
                             <goal>prepare-agent</goal>
                         </goals>
                     </execution>
                     <execution>
                         <id>report</id>
                         <phase>verify</phase>
                         <goals>
                             <goal>report</goal>
                         </goals>
                     </execution>
                 </executions>
             </plugin>
         </plugins>
     </build>
     ```

     Gradleの場合：`build.gradle`に以下を追加
     ```gradle
     plugins {
         id 'jacoco'
     }

     jacocoTestReport {
         dependsOn test
         reports {
             xml.required = true
             html.required = true
         }
     }
     ```

4. **テストとレポートを確認**
   - JUnitの実行結果：IDEやコマンドラインでテストを実行し、結果を確認します。
   - カバレッジレポート：Jacocoで生成されたHTMLファイルをブラウザで開き、カバレッジの詳細を確認します。

---
#### 例 1-2: ChatGPTの回答を確認し問い合わせる
```
Junitは実際のソースコードを渡せば作成してくれる？網羅性も考慮してほしい。
```
ソースコードを提供していただければ、それに基づいてJUnitテストコードを作成できます。また、可能な限り網羅性を考慮して、以下の3つを意識して作成します。
1. **正常系テスト**
   - ソースコードが期待通りに動作する場合の確認を行います。
   - 入力が正常範囲内である際の結果を検証します。

2. **異常系テスト**
   - 想定外の入力やエラー条件下で例外が正しくスローされることを確認します。
   - エラーハンドリングやフェールセーフの挙動を確認します。

3. **境界値テスト**
   - 入力の境界値（最大値、最小値、ゼロ、空文字など）で正しく動作することを確認します。
   - 不正値の取り扱いもカバーします。

さらに、テストカバレッジを意識し、分岐や条件ごとのカバレッジも高めることを目標にします。

**必要な情報**
以下の情報をご提供いただけると、より適切なテストを作成できます。
1. **ソースコード全体**
   - 対象クラスやメソッドの具体的な実装内容。
   
2. **テスト対象外の部分**
   - テスト不要なメソッドやモジュールがあれば教えてください。

3. **具体的なテスト要件**
   - 期待される動作や、特に検証すべきケースについての詳細。

4. **データ依存の有無**
   - データベースや外部 API に依存する場合、モック化の必要性を教えてください。

**次のステップ**
ソースコードをここに貼り付けるか、ファイルでアップロードしてください。内容を確認したうえで、JUnitコードを作成し、必要に応じてカバレッジを最大化するためのJacoco設定もアドバイスします。

---

#### 例 2: プロジェクトの相談

```
プロジェクトの進捗がよろしくない。
毎朝報告会を行っているが、進捗がわかりづらく順調なのかどれぐらい遅延しているか見えない。
WBSで管理しているもののタスクを割り当てた後の個人の裁量が大きく、遅延リカバリーが見えない。
何か良い案などないだろうか？
```

##### 解決策：進捗の可視化と課題解消の仕組み

1. **進捗の可視化を強化**
   - バーンダウンチャートの導入
   - 進捗ステータスの明確化（未着手、進行中、レビュー中、完了）

2. **タスク管理と割り当ての精度を上げる**
   - タスクの粒度を小さくする
   - 優先度の見直し

3. **報告会の効率化**
   - 事前報告を活用
   - 朝会の目的を「課題解消」に絞る

4. **遅延リカバリー策**
   - リソースの再分配
   - スコープの調整
   - タスクの並列化
### 最後に
いかがでしたでしょうか？

「こんな使い方で良かったのか！」と感じていただけたら幸いです。
精度を極めたプロンプトエンジニアリングの門は重いです。
ですが、日常のプロジェクト運営において発生する問題の門は、自宅の玄関くらいの軽さです。

良かったら、いいね:thumbsup:とフォローをお願いいたします。今後の励みになります。

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

> あ、、、マクロのプロンプトを記載してなかったですね。。。いいねが10を超えれば後続記事で記載します。