v1.0
This commit is contained in:
@@ -0,0 +1,258 @@
|
||||
# COBOL テストデータ生成 Agent
|
||||
|
||||
COBOL プログラムの詳細設計書・COPYBOOK・ソースコードを解析し、DeepSeek v4 Flash API を使ってテストデータ(JSON/SQL)を自動生成する Python ツール。
|
||||
|
||||
## クイックスタート
|
||||
|
||||
```bash
|
||||
# インストール
|
||||
pip install -r requirements.txt
|
||||
|
||||
# テスト実行
|
||||
python -m pytest tests/ -v
|
||||
|
||||
# 単一プログラムのテストデータ生成
|
||||
python main.py \
|
||||
--design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN04MAT.md" \
|
||||
--source "D:\cobol-tna-system\src\ZAN04MAT.cbl" \
|
||||
--file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" \
|
||||
--cpy "D:\cobol-tna-system\cpy" \
|
||||
--db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" \
|
||||
--output "output"
|
||||
```
|
||||
|
||||
| 引数 | 必須 | 説明 |
|
||||
|------|------|------|
|
||||
| `--design` | ✓ | 詳細設計書 .md のパス |
|
||||
| `--source` | ✓ | COBOL ソース .cbl のパス |
|
||||
| `--file-db-md` | ✓ | ファイル/DB 構造定義 .md のパス |
|
||||
| `--cpy` | ✓ | COPYBOOK 格納ディレクトリ |
|
||||
| `--db-md` | ✓ | DB 定義書 .md のパス |
|
||||
| `--output` | | 出力ディレクトリ(デフォルト: `output`) |
|
||||
| `--api-key` | | DeepSeek API Key |
|
||||
| `--model` | | モデル名(デフォルト: `deepseek-v4-flash`) |
|
||||
| `--rules` | | ルール格納ディレクトリ(デフォルト: `rules`) |
|
||||
|
||||
### ライブラリとしての利用
|
||||
|
||||
```python
|
||||
from agent import generate
|
||||
|
||||
result = generate(
|
||||
design_md="詳細設計書_ZAN04MAT.md",
|
||||
source_cbl="src/ZAN04MAT.cbl",
|
||||
file_db_md="COPY句定義書.md",
|
||||
cpy_dir="cpy/",
|
||||
db_md="DB定義書.md",
|
||||
output_dir="output/"
|
||||
)
|
||||
|
||||
# result = {"output_files": {...}, "program_id": "ZAN04MAT", "groups": 5, "input_type": "file"}
|
||||
```
|
||||
|
||||
## プロジェクト構造
|
||||
|
||||
```
|
||||
├── agent/ # コアモジュール
|
||||
│ ├── __init__.py # generate() エントリポイント + 全エクスポート
|
||||
│ ├── models.py # データクラス定義(ProgramMeta, FileInfo, CopyField 等)
|
||||
│ ├── markdown_utils.py # Markdown テーブル解析ユーティリティ
|
||||
│ ├── input_parser.py # 設計書・COPYBOOK・DB定義の解析
|
||||
│ ├── rule_loader.py # PGMパターン→ルールファイルのマッチング
|
||||
│ ├── prompt_builder.py # DeepSeek API プロンプト組立
|
||||
│ ├── api_client.py # API 呼出 + 3回リトライ + JSON パース
|
||||
│ └── output_writer.py # JSON / SQL ファイル出力
|
||||
├── rules/ # データ生成ルール(.md ファイル)
|
||||
│ ├── pgm_pattern/ # PGMパターン別ルール
|
||||
│ │ ├── マッチング(1-1).md
|
||||
│ │ ├── マッチング(1-N).md
|
||||
│ │ ├── マッチング(N-1).md
|
||||
│ │ ├── DB更新.md
|
||||
│ │ ├── 振り分け.md
|
||||
│ │ ├── 項目チェック.md
|
||||
│ │ ├── レイアウト編集のみ(GETPUT).md
|
||||
│ │ ├── キーブレイク(集計).md
|
||||
│ │ ├── キーブレイク(集約).md
|
||||
│ │ ├── キーブレイク(集計、集約).md
|
||||
│ │ ├── SELECT処理.md
|
||||
│ │ ├── MERGE.md
|
||||
│ │ ├── 50分割.md
|
||||
│ │ ├── CSV→FB変換.md
|
||||
│ │ └── GETPUT(編集出力).md
|
||||
│ └── special_feature/ # 特殊機能ルール
|
||||
│ └── 条件分支.md
|
||||
├── layout/ # ドキュメントテンプレート(参考)
|
||||
├── tests/ # テストコード (48 tests)
|
||||
│ └── test_data/ # テストフィクスチャ
|
||||
├── main.py # CLI エントリポイント
|
||||
├── requirements.txt # 依存関係
|
||||
├── AGENTS.md # AI エージェント向け指示書
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## 処理フロー
|
||||
|
||||
```
|
||||
[詳細設計書.md] ──┐
|
||||
[ソース.cbl] ────┤
|
||||
[COPYBOOK .cpy] ─┤
|
||||
[DB定義書.md] ───┘
|
||||
│
|
||||
▼
|
||||
InputParser ──→ ProgramMeta(全メタデータ)
|
||||
│
|
||||
▼
|
||||
RuleLoader ───→ ルール.md + 条件分支.md(該当時)
|
||||
│
|
||||
▼
|
||||
PromptBuilder ─→ API プロンプト
|
||||
│
|
||||
▼
|
||||
APIClient ────→ DeepSeek API(最大3回リトライ)
|
||||
│
|
||||
▼
|
||||
OutputWriter ──→ output/{プログラムID}/g{N}/{プログラムID}_g{N}.json
|
||||
output/{プログラムID}/g{N}/{プログラムID}_g{N}.sql
|
||||
```
|
||||
|
||||
## 出力形式
|
||||
|
||||
### 入力元がファイルの場合(JSON)
|
||||
|
||||
```json
|
||||
{
|
||||
"program": "ZAN04MAT",
|
||||
"records": [
|
||||
{
|
||||
"input": {
|
||||
"ZAN04R01": {
|
||||
"R01-APPL-ID": "A0000001",
|
||||
"R01-EMP-ID": "00000001",
|
||||
"R01-APPL-DATE": "20250101",
|
||||
"R01-START-TIME": "0800",
|
||||
"R01-END-TIME": "1700",
|
||||
"R01-STATUS": "1",
|
||||
"R01-OVT-TYPE": "O",
|
||||
"R01-FILLER": " "
|
||||
},
|
||||
"ZAN04R02": {
|
||||
"R02-APPL-ID": "A0000002",
|
||||
...
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 入力元が DB の場合(SQL)
|
||||
|
||||
```sql
|
||||
-- Group: 1
|
||||
-- 用途: 正常INSERT + 多keyテスト
|
||||
INSERT INTO LEAVE_RECORDS (EMP_ID, LEAVE_TYPE, START_DATE, ...) VALUES
|
||||
('00000001', '01', '20260101', ...),
|
||||
('00000002', '02', '20260102', ...);
|
||||
```
|
||||
|
||||
### 出力ディレクトリ構成
|
||||
|
||||
```
|
||||
output/
|
||||
└── ZAN04MAT/
|
||||
├── g1/
|
||||
│ └── ZAN04MAT_g1.json
|
||||
├── g2/
|
||||
│ └── ZAN04MAT_g2.json
|
||||
└── g3/
|
||||
└── ZAN04MAT_g3.json
|
||||
```
|
||||
|
||||
## 対応 PGM パターン
|
||||
|
||||
| パターン | ルールファイル | カバー数 | 多keyテスト |
|
||||
|----------|---------------|----------|-------------|
|
||||
| マッチング(1:1) | マッチング(1-1).md | 1 | ✓ |
|
||||
| マッチング(1:N) | マッチング(1-N).md | 2 | ✓ |
|
||||
| マッチング(N:1) | マッチング(N-1).md | 1 | ✓ |
|
||||
| DB更新 | DB更新.md | 5 | ✓ |
|
||||
| 振り分け | 振り分け.md | 2 | — |
|
||||
| 項目チェック | 項目チェック.md | 2 | — |
|
||||
| GETPUT | レイアウト編集のみ(GETPUT).md | 3 | — |
|
||||
| キーブレイク(集計) | キーブレイク(集計).md | 2 | ✓ |
|
||||
| キーブレイク(集約) | キーブレイク(集約).md | 1 | ✓ |
|
||||
| キーブレイク(集計、集約) | キーブレイク(集計、集約).md | 1 | ✓ |
|
||||
| SELECT処理 | SELECT処理.md | 1 | ✓ |
|
||||
| MERGE | MERGE.md | 1 | ✓ |
|
||||
| 50分割 | 50分割.md | 1 | — |
|
||||
| CSV→FB変換 | CSV→FB変換.md | 1 | — |
|
||||
|
||||
**合計: 24 プログラム対応**
|
||||
|
||||
### 多keyテストとは
|
||||
|
||||
キーが複数項目(例: A001, A002, A003)で構成される場合、基準データの各キー項目を 1 つだけ変えた N 件の追加データを各グループ末尾に生成する。これにより COBOL プログラムが正しい全キー項目で比較していることを検証する。
|
||||
|
||||
## ルール追加方法
|
||||
|
||||
1. `rules/pgm_pattern/` に新しい `.md` ファイルを作成
|
||||
2. `agent/rule_loader.py` の `PGM_PATTERN_MAP` にエントリを追加
|
||||
3. コード変更不要、ルール .md ファイル追加のみで拡張可能
|
||||
|
||||
ルールマッチング: まず `PGM_PATTERN_MAP` 完全一致 → なければルールファイル名(.md 除く)が PGM パターン文字列内に含まれるかチェック。
|
||||
|
||||
## 全プログラム実行コマンド
|
||||
|
||||
```bash
|
||||
# マッチング(1:1)
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN04MAT.md" --source "D:\cobol-tna-system\src\ZAN04MAT.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
|
||||
# マッチング(1:N)
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN05MAT.md" --source "D:\cobol-tna-system\src\KIN05MAT.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN07DAI.md" --source "D:\cobol-tna-system\src\KIN07DAI.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
|
||||
# マッチング(N:1)
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN03CHK.md" --source "D:\cobol-tna-system\src\ZAN03CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
|
||||
# DB更新
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN02UPD.md" --source "D:\cobol-tna-system\src\KIN02UPD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN08DBU.md" --source "D:\cobol-tna-system\src\KIN08DBU.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU02REG.md" --source "D:\cobol-tna-system\src\KYU02REG.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU06UPD.md" --source "D:\cobol-tna-system\src\KYU06UPD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN06UPD.md" --source "D:\cobol-tna-system\src\ZAN06UPD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
|
||||
# 振り分け
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN01INP.md" --source "D:\cobol-tna-system\src\KIN01INP.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN01CHK.md" --source "D:\cobol-tna-system\src\ZAN01CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
|
||||
# 項目チェック
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN02CHK.md" --source "D:\cobol-tna-system\src\ZAN02CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN04CHK.md" --source "D:\cobol-tna-system\src\KIN04CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
|
||||
# GETPUT
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN06CLD.md" --source "D:\cobol-tna-system\src\KIN06CLD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU08PRI.md" --source "D:\cobol-tna-system\src\KYU08PRI.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN09CSV.md" --source "D:\cobol-tna-system\src\KIN09CSV.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
|
||||
# キーブレイク(集計)
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN03EXP.md" --source "D:\cobol-tna-system\src\KIN03EXP.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN05CAL.md" --source "D:\cobol-tna-system\src\ZAN05CAL.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
|
||||
# キーブレイク(集約)
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU03AGG.md" --source "D:\cobol-tna-system\src\KYU03AGG.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU04CAL.md" --source "D:\cobol-tna-system\src\KYU04CAL.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
|
||||
# その他
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU05DED.md" --source "D:\cobol-tna-system\src\KYU05DED.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU07DIV.md" --source "D:\cobol-tna-system\src\KYU07DIV.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU09MRG.md" --source "D:\cobol-tna-system\src\KYU09MRG.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU01CVT.md" --source "D:\cobol-tna-system\src\KYU01CVT.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output"
|
||||
```
|
||||
|
||||
## 注意事項
|
||||
|
||||
- **API Key**: DeepSeek API キーは `agent/__init__.py` にハードコードされています。本番利用時は環境変数などに変更してください。
|
||||
- **サブプログラム**: `PGMタイプ = サブ` のプログラムは処理対象外です。
|
||||
- **全角/半角**: 詳細設計書内の PGMパターン表記には全角括弧 `()` と半角括弧 `()` のバリエーションがあります。`rule_loader.py` で両方対応済みです。
|
||||
- **テスト**: 全 48 テストが `tests/test_data/` のフィクスチャを使って API を mock して動作します。
|
||||
- **所要時間**: 24 プログラム全実行で約 26 分(DeepSeek API 応答速度に依存)。
|
||||
Reference in New Issue
Block a user