feat(cli): add --black-box to cobol_testgen and wire black-box run

This commit is contained in:
2026-09-13 15:07:57 +08:00
parent 0438164b11
commit a59a42f155
2 changed files with 54 additions and 4 deletions
+52 -2
View File
@@ -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_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 .design import enum_paths, generate_records, get_term_type, extend_abend_programs, make_base_record
from .output import output_json, output_input_files 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 .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 from japanese_data import generate_fullwidth_text, generate_halfwidth_katakana, generate_wareki_date
try: 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 _HAVE_RUNNER = True
except ImportError: except ImportError:
_HAVE_RUNNER = False _HAVE_RUNNER = False
@@ -1408,6 +1410,30 @@ def main():
if not _HAVE_RUNNER: if not _HAVE_RUNNER:
logger.warning("--gcov: runner.py not found. Compile/run will be skipped. " logger.warning("--gcov: runner.py not found. Compile/run will be skipped. "
"Use --gcov without runner only generates test data + static coverage.") "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 i = 0
while i < len(args): while i < len(args):
if args[i] == '--temp-dir': if args[i] == '--temp-dir':
@@ -1840,6 +1866,8 @@ def main():
logger.info(f" Skip 数据集: {skip_outpath}(全部输入 FD 空文件: {', '.join(skip_input_assigns)}") logger.info(f" Skip 数据集: {skip_outpath}(全部输入 FD 空文件: {', '.join(skip_input_assigns)}")
gcov_data = None gcov_data = None
group_results = []
white_java_reports = []
if gcov_mode and proc_div and _HAVE_GCOV and _HAVE_RUNNER: if gcov_mode and proc_div and _HAVE_GCOV and _HAVE_RUNNER:
_temp = temp_dir or str(prog_outdir / '.gcov_cache') _temp = temp_dir or str(prog_outdir / '.gcov_cache')
source_dir = str(filepath.parent) source_dir = str(filepath.parent)
@@ -1858,7 +1886,7 @@ def main():
exp.update(eo[fd_name]) exp.update(eo[fd_name])
expected_records[i] = exp 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, filepath.stem, str(prog_outdir), _temp,
fields_dict, fd_fields, select_info, open_dir, fields_dict, fd_fields, select_info, open_dir,
term_types, records, expected_records=expected_records, term_types, records, expected_records=expected_records,
@@ -1866,6 +1894,7 @@ def main():
multi_write_fds=multi_write_fds, multi_write_fds=multi_write_fds,
skip_records=skip_records, skip_records=skip_records,
skip_term_types=skip_term_types, skip_term_types=skip_term_types,
write_report=not do_black_box,
) )
passed = sum(1 for r in group_results if r.passed) passed = sum(1 for r in group_results if r.passed)
@@ -1879,6 +1908,27 @@ def main():
logger.warning(f" [{r.name}] {d.field}: " logger.warning(f" [{r.name}] {d.field}: "
f"期望={d.expected!r}, 实际={d.actual!r}") 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: if do_run and proc_div and _HAVE_RUNNER:
run_and_compare( run_and_compare(
filepath.stem, str(prog_outdir), fields_dict, filepath.stem, str(prog_outdir), fields_dict,
+1 -1
View File
@@ -831,7 +831,7 @@ def run_all(program_name: str, outdir: str, temp_dir: str,
"""完整编排:编译 → 准备目录 → 逐组执行 → 出力保存。 """完整编排:编译 → 准备目录 → 逐组执行 → 出力保存。
Returns: Returns:
(results_list, merged_gcov_data) (results_list, merged_gcov_data, java_reports)
merged_gcov_data is None when no gcov runs. merged_gcov_data is None when no gcov runs.
""" """
source_dir = source_dir or str(Path(outdir).parent) source_dir = source_dir or str(Path(outdir).parent)