Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Changed feature by issue.([Issue #68](https://github.com/overdrive1708/MagonoteToolkit/issues/68))
- Changed feature by issue.([Issue #70](https://github.com/overdrive1708/MagonoteToolkit/issues/70))
- Changed feature by issue.([Issue #76](https://github.com/overdrive1708/MagonoteToolkit/issues/76))
- Changed feature by issue.([Issue #77](https://github.com/overdrive1708/MagonoteToolkit/issues/77))

### Fixed

Expand Down
20 changes: 17 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
- 日本語
- AI校正
- AIソースコードレビュー
- AIテストケース生成
- 文字列<-->文字コード変換

## ダウンロード方法
Expand All @@ -62,6 +63,7 @@ MagonoteToolkit_vx.x.x.zipをダウンロードしてください。
| AITranslationPromptFilePath | AI翻訳で使用するプロンプトファイルのパスを設定します。 |
| AIProofreadingPromptFilePath | AI校正で使用するプロンプトファイルのパスを設定します。 |
| AISourceCodeReviewPromptFilePath | AIソースコードレビューで使用するプロンプトファイルのパスを設定します。 |
| AITestCaseGenerationPromptFilePath | AIテストケース生成で使用するプロンプトファイルのパスを設定します。 |

### Excelファイル検査
[設定サンプル](asetts/SampleSettings/ExcelFileInspectionSettings.json)を「MagonoteToolkit.exe」と同じ場所に格納してください。
Expand Down Expand Up @@ -118,7 +120,7 @@ MagonoteToolkit_vx.x.x.zipをダウンロードしてください。
### AI翻訳
プロンプトの書き換えが不要な場合は設定不要です。
プロンプトを書き換えたい場合に以下の設定を行ってください。
[変換ルールサンプル](asetts/SampleSettings/AITranslationPrompt.txt)を「MagonoteToolkit.exe」と同じ場所に格納してください。
[プロンプトサンプル](asetts/SampleSettings/AITranslationPrompt.txt)を「MagonoteToolkit.exe」と同じ場所に格納してください。
(全体設定を変更することで格納場所を変更することが可能です。)
その後、下記を参考に設定してください。

Expand All @@ -132,7 +134,7 @@ UTF-8でプロンプトを記載してください。
### AI校正
プロンプトの書き換えが不要な場合は設定不要です。
プロンプトを書き換えたい場合に以下の設定を行ってください。
[変換ルールサンプル](asetts/SampleSettings/AIProofreadingPrompt.txt)を「MagonoteToolkit.exe」と同じ場所に格納してください。
[プロンプトサンプル](asetts/SampleSettings/AIProofreadingPrompt.txt)を「MagonoteToolkit.exe」と同じ場所に格納してください。
(全体設定を変更することで格納場所を変更することが可能です。)
その後、下記を参考に設定してください。

Expand All @@ -144,7 +146,7 @@ UTF-8でプロンプトを記載してください。
### AIソースコードレビュー
プロンプトの書き換えが不要な場合は設定不要です。
プロンプトを書き換えたい場合に以下の設定を行ってください。
[変換ルールサンプル](asetts/SampleSettings/AISourceCodeReviewPrompt.txt)を「MagonoteToolkit.exe」と同じ場所に格納してください。
[プロンプトサンプル](asetts/SampleSettings/AISourceCodeReviewPrompt.txt)を「MagonoteToolkit.exe」と同じ場所に格納してください。
(全体設定を変更することで格納場所を変更することが可能です。)
その後、下記を参考に設定してください。

Expand All @@ -153,6 +155,18 @@ UTF-8でプロンプトを記載してください。
{0}:レビュー対象ソースコード
プロンプトが読み込めなかったり、{0}の記述がなかった場合は、デフォルトのプロンプトで動作します。

### AIテストケース生成
プロンプトの書き換えが不要な場合は設定不要です。
プロンプトを書き換えたい場合に以下の設定を行ってください。
[プロンプトサンプル](asetts/SampleSettings/AITestCaseGenerationPrompt.txt)を「MagonoteToolkit.exe」と同じ場所に格納してください。
(全体設定を変更することで格納場所を変更することが可能です。)
その後、下記を参考に設定してください。

UTF-8でプロンプトを記載してください。
画面で入力したものが{0}に埋め込まれます。
{0}:テストケース生成対象ソースコード
プロンプトが読み込めなかったり、{0}の記述がなかった場合は、デフォルトのプロンプトで動作します。

## 使い方
- [Excelファイル検査](docs/HowToUseExcelFileInspection.md)を参照してください。
- [ExcelファイルID->名称変換](docs/HowToUseExcelFileNumberToName.md)を参照してください。
Expand Down
20 changes: 20 additions & 0 deletions asetts/SampleSettings/AITestCaseGenerationPrompt.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
あなたはシニアQAエンジニア兼プロフェッショナルプログラマーです。
提供されたソースコードを詳細に解析し、品質を担保するための網羅的なテストパターン(テストケース)を洗い出してください。

以下の【テストケース生成対象ソースコード】から、想定されるテストパターンを「正常系」「異常系」「境界値・エッジケース」に分類して一覧化してください。
テストコードの実装は不要です。
テスト観点と入力値・期待値のリストアップのみを行ってください。

【出力形式】
以下の構成でマークダウン形式で出力してください。
1. **コードの概要**: 読み取った処理の目的と主要な仕様
2. **テスト観点概要**: 考慮すべきリスクや特徴的な条件
3. **テストケース一覧**
- 分類(正常系/異常系/境界値) / テスト内容(シナリオ) / 入力値・前提条件 / 期待される結果

【制約事項】
- 暗黙的な制約(型の仕様、桁数制限、null/未定義の考慮など)もコードから読み取って含めてください。
- 実装漏れやバグが起きやすいエッジケースを重点的に抽出してください。

【テストケース生成対象ソースコード】
{0}
94 changes: 94 additions & 0 deletions src/MagonoteToolkit/Models/AITestCaseGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
using OpenAI;
using OpenAI.Chat;
using OpenAI.Models;
using System;
using System.ClientModel;
using System.Collections.ObjectModel;

namespace MagonoteToolkit.Models
{
/// <summary>
/// AIテストケース生成クラス
/// </summary>
internal class AITestCaseGenerator
{
//--------------------------------------------------
// メソッド
//--------------------------------------------------
/// <summary>
/// AIテストケース生成処理
/// </summary>
/// <param name="inputSourceCode">入力ソースコード</param>
/// <param name="model">使用するモデル</param>
/// <returns>生成結果</returns>
public static string Generate(string inputSourceCode, string model)
{
// 「使用するモデル」が空の場合は、ダミー値を設定する。(OpenAI SDKのエラー回避)
if (model == string.Empty)
{
model = "dummy_model";
}

// OpenAI APIの設定
OpenAIClientOptions options = new() { Endpoint = new Uri(ApplicationSettings.ReadSettingsAIOpenAIAPIBaseUrl()) };
OpenAIClient client = new(new ApiKeyCredential(ApplicationSettings.ReadSettingsAIOpenAIAPIKey()), options);
ChatClient chatClient = client.GetChatClient(model);

// プロンプトの作成
string prompt;
try
{
// ファイルの読み込みに成功した場合は、プロンプトファイルの内容を使用
string promptTemplate = System.IO.File.ReadAllText(ApplicationSettings.ReadSettingsAITestCaseGenerationPromptFilePath());
prompt = string.Format(promptTemplate, inputSourceCode);
}
catch (Exception)
{
// ファイルの読み込みに失敗した場合は、デフォルトのプロンプトを使用
prompt = string.Format(Resources.Strings.AITestCaseGenerationDefaultPrompt, inputSourceCode);
}

// リクエストしてレスポンスをテストケース生成結果として採用
string testCaseGenerationResult;
try
{
ChatCompletion completion = chatClient.CompleteChat(prompt);
testCaseGenerationResult = completion.Content[0].Text;
}
catch (Exception ex)
{
testCaseGenerationResult = $"{Resources.Strings.Error}:{ex.Message}";
}
return testCaseGenerationResult;
}

/// <summary>
/// モデルリスト取得処理
/// </summary>
/// <returns>モデルリスト</returns>
public static ObservableCollection<string> GetModels()
{
// OpenAI APIの設定
OpenAIClientOptions options = new() { Endpoint = new Uri(ApplicationSettings.ReadSettingsAIOpenAIAPIBaseUrl()) };
OpenAIClient client = new(new ApiKeyCredential(ApplicationSettings.ReadSettingsAIOpenAIAPIKey()), options);
OpenAIModelClient modelClient = client.GetOpenAIModelClient();

// モデルリストを取得
ObservableCollection<string> modelList = [];
try
{
OpenAIModelCollection models = modelClient.GetModels();
foreach (var model in models)
{
modelList.Add(model.Id);
}
}
catch (Exception)
{
// エラーが発生した場合は空のリストを返す
}

return modelList;
}
}
}
14 changes: 14 additions & 0 deletions src/MagonoteToolkit/Models/ApplicationSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ internal class ApplicationSettings
/// </summary>
public string AISourceCodeReviewPromptFilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AISourceCodeReviewPrompt.txt");

/// <summary>
/// AI関連機能:テストケース生成プロンプトファイルパス
/// </summary>
public string AITestCaseGenerationPromptFilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AITestCaseGenerationPrompt.txt");

//--------------------------------------------------
// 定数(コンフィギュレーション)
//--------------------------------------------------
Expand Down Expand Up @@ -214,6 +219,15 @@ public static string ReadSettingsAISourceCodeReviewPromptFilePath()
return ReadSettings().AISourceCodeReviewPromptFilePath;
}

/// <summary>
/// 設定読み込み処理:AI関連機能:テストケース生成プロンプトファイルパス
/// </summary>
/// <returns>テストケース生成プロンプトファイルパス</returns>
public static string ReadSettingsAITestCaseGenerationPromptFilePath()
{
return ReadSettings().AITestCaseGenerationPromptFilePath;
}

/// <summary>
/// 設定書き込み処理
/// </summary>
Expand Down
82 changes: 82 additions & 0 deletions src/MagonoteToolkit/Resources/Strings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 41 additions & 0 deletions src/MagonoteToolkit/Resources/Strings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -550,4 +550,45 @@
<value>ソースコードレビューを行っています。
しばらくお待ちください。</value>
</data>
<data name="TestCaseGenerationPromptFilePath" xml:space="preserve">
<value>テストケース生成プロンプトファイルパス</value>
</data>
<data name="TestCaseGenerationTargetSourceCode" xml:space="preserve">
<value>テストケース生成対象ソースコード</value>
</data>
<data name="TestCaseGenerationResult" xml:space="preserve">
<value>テストケース生成結果</value>
</data>
<data name="ExecuteTestCaseGeneration" xml:space="preserve">
<value>テストケース生成実施</value>
</data>
<data name="MessageStatusNowTestCaseGenerating" xml:space="preserve">
<value>テストケース生成を行っています。
しばらくお待ちください。</value>
</data>
<data name="AITestCaseGeneration" xml:space="preserve">
<value>AIテストケース生成</value>
</data>
<data name="AITestCaseGenerationDefaultPrompt" xml:space="preserve">
<value>あなたはシニアQAエンジニア兼プロフェッショナルプログラマーです。
提供されたソースコードを詳細に解析し、品質を担保するための網羅的なテストパターン(テストケース)を洗い出してください。

以下の【テストケース生成対象ソースコード】から、想定されるテストパターンを「正常系」「異常系」「境界値・エッジケース」に分類して一覧化してください。
テストコードの実装は不要です。
テスト観点と入力値・期待値のリストアップのみを行ってください。

【出力形式】
以下の構成でマークダウン形式で出力してください。
1. **コードの概要**: 読み取った処理の目的と主要な仕様
2. **テスト観点概要**: 考慮すべきリスクや特徴的な条件
3. **テストケース一覧**
- 分類(正常系/異常系/境界値) / テスト内容(シナリオ) / 入力値・前提条件 / 期待される結果

【制約事項】
- 暗黙的な制約(型の仕様、桁数制限、null/未定義の考慮など)もコードから読み取って含めてください。
- 実装漏れやバグが起きやすいエッジケースを重点的に抽出してください。

【テストケース生成対象ソースコード】
{0}</value>
</data>
</root>
Loading
Loading