feat(runner): merge black-box groups into COBOL vs Java report

This commit is contained in:
2026-09-13 15:05:43 +08:00
parent b4c0323a8a
commit 0438164b11
2 changed files with 88 additions and 31 deletions
+48 -31
View File
@@ -724,6 +724,36 @@ def _run_java_scene(program_name: str, scene_id: str, java_out_dir, temp_dir: st
return {'label': label, 'rc': rc, 'summaries': summaries} return {'label': label, 'rc': rc, 'summaries': summaries}
def _append_java_report_body(lines: list, rep: dict) -> None:
"""渲染单个组的比对明细(表 + 差异示例)。"""
lines.append('')
if rep.get('error'):
lines.append(f'运行/比对异常: {rep["error"]}')
lines.append('')
return
if not rep['summaries']:
lines.append('(无输出 FD 可比对)')
lines.append('')
return
lines.append('| 出力FD | COBOL记录数 | Java记录数 | 一致 | 不一致 | 判定 |')
lines.append('|--------|------------|-----------|------|--------|------|')
for s in rep['summaries']:
verdict = '一致' if s['mismatched'] == 0 else '不一致'
lines.append(
f"| {s['assign']} | {s['cobol_count']} | {s['java_count']} "
f"| {s['matched']} | {s['mismatched']} | {verdict} |")
diff = [s for s in rep['summaries'] if s['mismatched'] > 0]
if diff:
lines.append('')
lines.append('**差异示例(最多 3 条/FD)**:')
for s in diff:
for smp in s['samples']:
lines.append(f"- {s['assign']}[记录{smp['index']}] 首异位置={smp['pos']}")
lines.append(f" - COBOL: `{smp['cobol']}`")
lines.append(f" - Java : `{smp['java']}`")
lines.append('')
def _write_java_test_report(outdir: str, program_name: str, def _write_java_test_report(outdir: str, program_name: str,
results: list, results: list,
java_reports: list[dict]) -> None: java_reports: list[dict]) -> None:
@@ -743,36 +773,22 @@ def _write_java_test_report(outdir: str, program_name: str,
lines.append(f"| {r.name} | {r.returncode} | {mark} |") lines.append(f"| {r.name} | {r.returncode} | {mark} |")
lines.append('') lines.append('')
white = [r for r in java_reports if r.get('section') != 'black_box']
black = [r for r in java_reports if r.get('section') == 'black_box']
lines.append('## 2. Java 执行与出力比对(逐组逐 FD)') lines.append('## 2. Java 执行与出力比对(逐组逐 FD)')
lines.append('') lines.append('')
for rep in java_reports: for idx, rep in enumerate(white):
lines.append(f'### 2.{java_reports.index(rep) + 1} 组 `{rep["label"]}` (Java rc={rep.get("rc", "N/A")})') lines.append(f'### 2.{idx + 1} 组 `{rep["label"]}` (Java rc={rep.get("rc", "N/A")})')
lines.append('') _append_java_report_body(lines, rep)
if rep.get('error'):
lines.append(f'运行/比对异常: {rep["error"]}') if black:
lines.append('') lines.append('## 2b. 黑盒组 Java 执行与出力比对')
continue
if not rep['summaries']:
lines.append('(无输出 FD 可比对)')
lines.append('')
continue
lines.append('| 出力FD | COBOL记录数 | Java记录数 | 一致 | 不一致 | 判定 |')
lines.append('|--------|------------|-----------|------|--------|------|')
for s in rep['summaries']:
verdict = '一致' if s['mismatched'] == 0 else '不一致'
lines.append(
f"| {s['assign']} | {s['cobol_count']} | {s['java_count']} "
f"| {s['matched']} | {s['mismatched']} | {verdict} |")
diff = [s for s in rep['summaries'] if s['mismatched'] > 0]
if diff:
lines.append('')
lines.append('**差异示例(最多 3 条/FD)**:')
for s in diff:
for smp in s['samples']:
lines.append(f"- {s['assign']}[记录{smp['index']}] 首异位置={smp['pos']}")
lines.append(f" - COBOL: `{smp['cobol']}`")
lines.append(f" - Java : `{smp['java']}`")
lines.append('') lines.append('')
for idx, rep in enumerate(black):
lines.append(f'### 2b.{idx + 1} 黑盒组 `{rep["label"]}` '
f'(Java rc={rep.get("rc", "N/A")})')
_append_java_report_body(lines, rep)
all_fd = [s for rep in java_reports for s in rep.get('summaries', [])] all_fd = [s for rep in java_reports for s in rep.get('summaries', [])]
total_match = sum(s['matched'] for s in all_fd) total_match = sum(s['matched'] for s in all_fd)
@@ -809,8 +825,9 @@ def run_all(program_name: str, outdir: str, temp_dir: str,
multi_write_fds: set | None = None, multi_write_fds: set | None = None,
skip_records: list[dict] | None = None, skip_records: list[dict] | None = None,
skip_term_types: list[str] | None = None, skip_term_types: list[str] | None = None,
java_src_dir: str | None = None java_src_dir: str | None = None,
) -> tuple[list[GroupResult], dict[int, int] | None]: write_report: bool = True
) -> tuple[list[GroupResult], dict[int, int] | None, list[dict]]:
"""完整编排:编译 → 准备目录 → 逐组执行 → 出力保存。 """完整编排:编译 → 准备目录 → 逐组执行 → 出力保存。
Returns: Returns:
@@ -987,13 +1004,13 @@ def run_all(program_name: str, outdir: str, temp_dir: str,
logger.info(f" Merged gcov from {len(gcov_data_sets)} runs ({len(merged_gcov)} lines)") logger.info(f" Merged gcov from {len(gcov_data_sets)} runs ({len(merged_gcov)} lines)")
# ── 5. 生成 COBOL vs Java 出力比对测试报告 ── # ── 5. 生成 COBOL vs Java 出力比对测试报告 ──
if java_cfg and java_reports: if write_report and java_cfg and java_reports:
try: try:
_write_java_test_report(outdir, program_name, results, java_reports) _write_java_test_report(outdir, program_name, results, java_reports)
except Exception as e: # noqa: BLE001 except Exception as e: # noqa: BLE001
logger.warning(f" 测试报告生成失败: {e}") logger.warning(f" 测试报告生成失败: {e}")
return results, merged_gcov return results, merged_gcov, java_reports
# ── 外部(黑盒)数据组执行 ── # ── 外部(黑盒)数据组执行 ──
+40
View File
@@ -0,0 +1,40 @@
"""COBOL vs Java 测试报告:白盒向后兼容 + 黑盒节"""
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
from cobol_testgen.runner import _write_java_test_report, GroupResult
def _summary(assign="W01", matched=1, mismatched=0):
return {"assign": assign, "cobol_count": matched + mismatched,
"java_count": matched + mismatched, "matched": matched,
"mismatched": mismatched, "samples": []}
def test_report_white_only_has_no_black_section(tmp_path):
results = [GroupResult(name="P_main", returncode=0, passed=True)]
reports = [{"label": "main", "rc": 0, "summaries": [_summary()]}]
_write_java_test_report(str(tmp_path), "P", results, reports)
text = (tmp_path / "P_测试报告.md").read_text(encoding="utf-8")
assert "### 2.1 组 `main`" in text
assert "## 2b." not in text
def test_report_with_black_section(tmp_path):
results = [
GroupResult(name="P_main", returncode=0, passed=True),
GroupResult(name="P_black_box_g1", returncode=0, passed=True),
]
reports = [
{"label": "main", "rc": 0, "summaries": [_summary()]},
{"label": "g1", "section": "black_box", "rc": 0,
"summaries": [_summary(assign="W02", mismatched=1)]},
]
_write_java_test_report(str(tmp_path), "P", results, reports)
text = (tmp_path / "P_测试报告.md").read_text(encoding="utf-8")
assert "### 2.1 组 `main`" in text
assert "## 2b. 黑盒组 Java 执行与出力比对" in text
assert "### 2b.1 黑盒组 `g1`" in text