9.9 KiB
9.9 KiB
cobol_testgen v4 生成 JSON — 格式说明 v2.0
修订履历
| 版本 | 日期 | 变更内容 |
|---|---|---|
| v2.0 | 明确1个json文件=1组数据(group)的命名规则,格式本身与v1相同 |
说明
v2.0 格式本身与v1完全一致,仅补充:
- 一组数据单独放一个json文件
- 一个文件内的
records数组包含该组的全部处理单元 - 命名规则追加
_g{groupId}标识组号
完整规格 JSON(output/json/{プログラム名}_g{groupId}.json)
最外层结构
{
"program": "SAN01MAT",
"records": [
{
"input": { ... }
}
]
}
1条record = 1次处理单元。例如匹配(1:1)时:
- 匹配成功:record内同时包含两个输入FD
- R01-only:record内只含R01的FD
- R02-only:record内只含R02的FD
多个record按处理顺序排列,组成一组完整的测试数据。
例1:单文件CSV输入(1组1条记录)
文件 ZAN01CHK_g1.json:
{
"program": "ZAN01CHK",
"records": [
{
"input": {
"R01INNFIL": {
"R01LINE": "A0000000, , , , ,0, , "
}
}
}
]
}
例2:单文件二进制输入(1组多条记录)
文件 ZAN02CHK_g1.json:
{
"program": "ZAN02CHK",
"records": [
{
"input": {
"R01INNFIL": {
"R01APPL-ID": "A0000001",
"R01EMP-ID": "00000101",
"R01APPL-DATE": "20000101",
"R01START-TIME":"0201",
"R01END-TIME": "0301",
"R01STATUS": "B",
"R01OVT-TYPE": "C",
"R01FILLER": "D000000000000000000000000000000000000000000001"
}
}
},
{
"input": {
"R01INNFIL": {
"R01APPL-ID": "A0000002",
"R01EMP-ID": "00000102",
"R01APPL-DATE": "20000102",
"R01START-TIME":"0202",
"R01END-TIME": "0302",
"R01STATUS": "C",
"R01OVT-TYPE": "D",
"R01FILLER": "D000000000000000000000000000000000000000000002"
}
}
}
]
}
例3:多文件输入(与v1相同)
文件 ZAN03CHK_g1.json:
{
"program": "ZAN03CHK",
"records": [
{
"input": {
"R01INNFIL": {
"R01APPL-ID": "A0000001",
"R01EMP-ID": "00000101",
"R01APPL-DATE": "20000101",
"R01START-TIME":"0201",
"R01END-TIME": "0301",
"R01STATUS": "B",
"R01OVT-TYPE": "C",
"R01FILLER": "D000000000000000000000000000000000000000000001"
},
"R02INNFIL": {
"R02EMP-ID": "00000401",
"R02DATE": "20000101",
"R02TIME-IN": "0501",
"R02TIME-OUT": "0601",
"R02FILLER": "E0000000000000000000000000000000000000000000000000000001"
},
"R03INNFIL": {
"R03HOLIDAY-DATE": "20000101",
"R03HOLIDAY-FLG": "F",
"R03FILLER": "G0000000000000000000000000000000000000000000000000000000000000000000001"
}
}
}
]
}
例4:二文件匹配(マッチング1:1)
v1中ZAN04MAT示例是1条record = 1次匹配处理。
对于匹配(1:1)测试,1组数据 = 1个json文件。1组内包含多条record(R01-only、R02-only、匹配),按处理顺序排列。
文件1:SAN01MAT_g1.json
两端不匹配:先处理R01-only(a001) → 3次匹配(a002/b002, a003/b003, a004/b004) → 最后R02-only(a005)。
{
"program": "SAN01MAT",
"records": [
{
"input": {
"R01INNFIL": {
"R01A001": "a001",
"R01A002": "b001",
"R01A003": "c001",
"R01DATA": "c00000000011"
}
}
},
{
"input": {
"R01INNFIL": {
"R01A001": "a002",
"R01A002": "b002",
"R01A003": "c002",
"R01DATA": "c00000000012"
},
"R02INNFIL": {
"R02A001": "a002",
"R02A002": "b002",
"R02A003": "c002",
"R02DATA": "c00000000012"
}
}
},
{
"input": {
"R01INNFIL": {
"R01A001": "a003",
"R01A002": "b003",
"R01A003": "c003",
"R01DATA": "c00000000013"
},
"R02INNFIL": {
"R02A001": "a003",
"R02A002": "b003",
"R02A003": "c003",
"R02DATA": "c00000000013"
}
}
},
{
"input": {
"R01INNFIL": {
"R01A001": "a004",
"R01A002": "b004",
"R01A003": "c004",
"R01DATA": "c00000000014"
},
"R02INNFIL": {
"R02A001": "a004",
"R02A002": "b004",
"R02A003": "c004",
"R02DATA": "c00000000014"
}
}
},
{
"input": {
"R02INNFIL": {
"R02A001": "a005",
"R02A002": "b005",
"R02A003": "c005",
"R02DATA": "c00000000015"
}
}
}
]
}
文件2:SAN01MAT_g2.json
反向两端不匹配:先处理R02-only(a001) → 3次匹配 → 最后R01-only(a005)。
{
"program": "SAN01MAT",
"records": [
{
"input": {
"R02INNFIL": {
"R02A001": "a001",
"R02A002": "b001",
"R02A003": "c001",
"R02DATA": "c00000000011"
}
}
},
{
"input": {
"R01INNFIL": {
"R01A001": "a002",
"R01A002": "b002",
"R01A003": "c002",
"R01DATA": "c00000000012"
},
"R02INNFIL": {
"R02A001": "a002",
"R02A002": "b002",
"R02A003": "c002",
"R02DATA": "c00000000012"
}
}
},
{
"input": {
"R01INNFIL": {
"R01A001": "a003",
"R01A002": "b003",
"R01A003": "c003",
"R01DATA": "c00000000013"
},
"R02INNFIL": {
"R02A001": "a003",
"R02A002": "b003",
"R02A003": "c003",
"R02DATA": "c00000000013"
}
}
},
{
"input": {
"R01INNFIL": {
"R01A001": "a004",
"R01A002": "b004",
"R01A003": "c004",
"R01DATA": "c00000000014"
},
"R02INNFIL": {
"R02A001": "a004",
"R02A002": "b004",
"R02A003": "c004",
"R02DATA": "c00000000014"
}
}
},
{
"input": {
"R01INNFIL": {
"R01A001": "a005",
"R01A002": "b005",
"R01A003": "c005",
"R01DATA": "c00000000015"
}
}
}
]
}
文件3:SAN01MAT_g3.json
中间不匹配:先匹配(a001) → R01-only(a003) → 匹配(a004) → R02-only(a002) → 匹配(a005)。
{
"program": "SAN01MAT",
"records": [
{
"input": {
"R01INNFIL": {
"R01A001": "a001",
"R01A002": "b001",
"R01A003": "c001",
"R01DATA": "c00000000011"
},
"R02INNFIL": {
"R02A001": "a001",
"R02A002": "b001",
"R02A003": "c001",
"R02DATA": "c00000000011"
}
}
},
{
"input": {
"R01INNFIL": {
"R01A001": "a003",
"R01A002": "b003",
"R01A003": "c003",
"R01DATA": "c00000000013"
}
}
},
{
"input": {
"R01INNFIL": {
"R01A001": "a004",
"R01A002": "b004",
"R01A003": "c004",
"R01DATA": "c00000000014"
},
"R02INNFIL": {
"R02A001": "a004",
"R02A002": "b004",
"R02A003": "c004",
"R02DATA": "c00000000014"
}
}
},
{
"input": {
"R02INNFIL": {
"R02A001": "a002",
"R02A002": "b002",
"R02A003": "c002",
"R02DATA": "c00000000012"
}
}
},
{
"input": {
"R01INNFIL": {
"R01A001": "a005",
"R01A002": "b005",
"R01A003": "c005",
"R01DATA": "c00000000015"
},
"R02INNFIL": {
"R02A001": "a005",
"R02A002": "b005",
"R02A003": "c005",
"R02DATA": "c00000000015"
}
}
}
]
}
DB类型时的输出
输入类型为DB时,每组生成一个独立的SQL insert文件。
| 文件种类 | 命名规则 | 例 |
|---|---|---|
| Insert SQL(一组) | {プログラムID}_g{groupId}.sql |
SAN01MAT_g1.sql |
例(组1):
-- Group: 1
-- 用途: 员工主表基础数据
INSERT INTO EMPLOYEE (EMP_ID, EMP_NAME, BIRTH_DATE, SALARY) VALUES
('0000000001', '测试太郎', '1990-04-01', 350000.00),
('0000000002', '测试花子', '1995-07-15', 420000.00);
字段值规则
| PIC | JSON内表示 | 例 |
|---|---|---|
PIC X(n) |
左对齐 + 空格填充 | "A0000001" (8桁) |
PIC 9(n) |
右对齐 + 前补零 | "00000101" (8桁) |
PIC S9(n) |
符号 + 右对齐 + 前补零 | "+0000101" |
PIC S9(n)V9(m) |
符号 + 右对齐 + 含小数点 | "+001234567" (V9(2)时实际为 +0012345.67) |
PIC S9(n) COMP |
十进制数字字符串(含符号) | "300"、"-100000" |
PIC S9(n) COMP-3 |
十进制数字字符串(含符号) | "1234"、"-5678" |
PIC 9(n) COMP-3 |
十进制数字字符串(无符号) | "1234" |
| FILLER(纯保留) | 字段名为FILLER的未使用区域 |
含有组ID和记录编号的可辨识模式 "D000000...001" |
| FILLER(业务保留) | 字段名有具体名称但实际未使用的保留区 | PIC X(n)填全空格、PIC 9(n)填全零 |
输出目录结构
output/
├── json/ # 完整JSON(每组一个文件,输入类型=文件时输出)
│ ├── SAN01MAT_g1.json
│ ├── SAN01MAT_g2.json
│ └── SAN01MAT_g3.json
└── db/ # DB insert SQL(每组一个文件,输入类型=DB时输出)
├── SAN01MAT_g1.sql
├── SAN01MAT_g2.sql
└── SAN01MAT_g3.sql