From a59a42f155f55177289d85862532d4ddd8723de9 Mon Sep 17 00:00:00 2001 From: zhang_taoming <854317252@qq.com> Date: Sun, 13 Sep 2026 15:07:57 +0800 Subject: [PATCH] feat(cli): add --black-box to cobol_testgen and wire black-box run --- cobol_testgen/__init__.py | 54 +++++++++++++++++++++++++++++++++++++-- cobol_testgen/runner.py | 4 +-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/cobol_testgen/__init__.py b/cobol_testgen/__init__.py index a240845..a7383cf 100644 --- a/cobol_testgen/__init__.py +++ b/cobol_testgen/__init__.py @@ -30,11 +30,13 @@ from .pipeline_bridge import build_branch_tree_fallback from .design_mcdc import enum_paths as mcdc_enum_paths, _filter_stop from .design import enum_paths, generate_records, get_term_type, extend_abend_programs, make_base_record from .output import output_json, output_input_files +from .blackbox import load_black_box_groups from .coverage import run_coverage, generate_coverage_index, collect_decision_points, mark_coverage from japanese_data import generate_fullwidth_text, generate_halfwidth_katakana, generate_wareki_date try: - from .runner import run_and_compare, run_all, GroupInfo, GroupResult + from .runner import (run_and_compare, run_all, GroupInfo, GroupResult, + run_external_groups, _write_java_test_report) _HAVE_RUNNER = True except ImportError: _HAVE_RUNNER = False @@ -1408,6 +1410,30 @@ def main(): if not _HAVE_RUNNER: logger.warning("--gcov: runner.py not found. Compile/run will be skipped. " "Use --gcov without runner only generates test data + static coverage.") + + do_black_box = False + black_box_arg = None + i = 0 + while i < len(args): + a = args[i] + if a == '--no-black-box': + do_black_box = False + args.pop(i) + continue + if a == '--black-box': + do_black_box = True + if i + 1 < len(args) and not args[i + 1].startswith('--'): + black_box_arg = args[i + 1] + args.pop(i + 1) + args.pop(i) + continue + if a.startswith('--black-box='): + do_black_box = True + black_box_arg = a.split('=', 1)[1] + args.pop(i) + continue + i += 1 + i = 0 while i < len(args): if args[i] == '--temp-dir': @@ -1840,6 +1866,8 @@ def main(): logger.info(f" Skip 数据集: {skip_outpath}(全部输入 FD 空文件: {', '.join(skip_input_assigns)})") gcov_data = None + group_results = [] + white_java_reports = [] if gcov_mode and proc_div and _HAVE_GCOV and _HAVE_RUNNER: _temp = temp_dir or str(prog_outdir / '.gcov_cache') source_dir = str(filepath.parent) @@ -1858,7 +1886,7 @@ def main(): exp.update(eo[fd_name]) expected_records[i] = exp - group_results, gcov_data = run_all( + group_results, gcov_data, white_java_reports = run_all( filepath.stem, str(prog_outdir), _temp, fields_dict, fd_fields, select_info, open_dir, term_types, records, expected_records=expected_records, @@ -1866,6 +1894,7 @@ def main(): multi_write_fds=multi_write_fds, skip_records=skip_records, skip_term_types=skip_term_types, + write_report=not do_black_box, ) passed = sum(1 for r in group_results if r.passed) @@ -1879,6 +1908,27 @@ def main(): logger.warning(f" [{r.name}] {d.field}: " f"期望={d.expected!r}, 实际={d.actual!r}") + if do_black_box and proc_div and _HAVE_RUNNER: + bb_dir = Path(black_box_arg) if black_box_arg else prog_outdir + bb_groups = load_black_box_groups(bb_dir, fd_fields, select_info, fields_dict) + if not bb_groups: + logger.warning(f" --black-box: 未在 {bb_dir} 找到可用黑盒数据,跳过") + else: + _bb_temp = temp_dir or str(prog_outdir / '.gcov_cache') + bb_results, bb_java_reports = run_external_groups( + filepath.stem, str(prog_outdir), _bb_temp, + fields_dict, fd_fields, select_info, open_dir, + roles, field_to_fd, bb_groups, + source_dir=str(filepath.parent), + data_fields=fields_dict, + multi_write_fds=multi_write_fds, + ) + all_results = list(group_results) + list(bb_results) + all_reports = list(white_java_reports) + list(bb_java_reports) + if all_reports: + _write_java_test_report(str(prog_outdir), filepath.stem, + all_results, all_reports) + if do_run and proc_div and _HAVE_RUNNER: run_and_compare( filepath.stem, str(prog_outdir), fields_dict, diff --git a/cobol_testgen/runner.py b/cobol_testgen/runner.py index 6d4123a..a140486 100644 --- a/cobol_testgen/runner.py +++ b/cobol_testgen/runner.py @@ -829,9 +829,9 @@ def run_all(program_name: str, outdir: str, temp_dir: str, write_report: bool = True ) -> tuple[list[GroupResult], dict[int, int] | None, list[dict]]: """完整编排:编译 → 准备目录 → 逐组执行 → 出力保存。 - + Returns: - (results_list, merged_gcov_data) + (results_list, merged_gcov_data, java_reports) merged_gcov_data is None when no gcov runs. """ source_dir = source_dir or str(Path(outdir).parent)