#!/usr/bin/env python3 """ 验证PDF报告中的失败用例详情 """ import json import sys from pathlib import Path from run_api_tests import save_pdf_report def verify_latest_report(): """验证最新的测试报告""" print("🔍 验证最新测试报告的PDF失败用例详情") print("=" * 60) # 找到最新的测试报告目录 test_reports_dir = Path("test_reports") if not test_reports_dir.exists(): print("❌ 测试报告目录不存在") return False # 获取所有日期格式的目录 date_dirs = [d for d in test_reports_dir.iterdir() if d.is_dir() and d.name.startswith("2025-")] if not date_dirs: print("❌ 没有找到测试报告目录") return False # 找到最新的目录 latest_dir = max(date_dirs, key=lambda x: x.name) print(f"📁 最新测试报告目录: {latest_dir}") # 读取JSON摘要 json_file = latest_dir / "summary.json" if not json_file.exists(): print(f"❌ 找不到摘要文件: {json_file}") return False try: with open(json_file, 'r', encoding='utf-8') as f: test_data = json.load(f) except Exception as e: print(f"❌ 读取摘要文件失败: {e}") return False # 分析失败用例 failed_cases = [] endpoint_results = test_data.get('endpoint_results', []) for endpoint in endpoint_results: test_cases = endpoint.get('executed_test_cases', []) for tc in test_cases: if tc.get('status') in ['失败', 'FAILED']: failed_cases.append({ 'endpoint': endpoint.get('endpoint_name', 'N/A'), 'case_id': tc.get('test_case_id', 'N/A'), 'case_name': tc.get('test_case_name', 'N/A'), 'severity': tc.get('test_case_severity', 'N/A'), 'message': tc.get('message', 'N/A') }) # 分析stage失败用例 stage_results = test_data.get('stage_results', []) for stage in stage_results: if stage.get('overall_status') in ['失败', 'FAILED']: failed_cases.append({ 'endpoint': f"Stage: {stage.get('stage_name', 'N/A')}", 'case_id': f"STAGE_{stage.get('stage_name', 'N/A')}", 'case_name': stage.get('description', stage.get('stage_name', 'N/A')), 'severity': 'HIGH', 'message': stage.get('message', stage.get('error_message', 'N/A')) }) print(f"📊 测试数据统计:") print(f"- 总端点数: {test_data.get('overall_summary', {}).get('endpoints_tested', 0)}") print(f"- 总测试用例: {test_data.get('overall_summary', {}).get('total_test_cases_executed', 0)}") print(f"- 失败用例数: {len(failed_cases)}") print(f"- 测试成功率: {test_data.get('overall_summary', {}).get('test_case_success_rate', 'N/A')}") if failed_cases: print(f"\n📋 失败用例详情:") for i, case in enumerate(failed_cases, 1): print(f"{i}. {case['case_name']} ({case['case_id']})") print(f" 端点: {case['endpoint']}") print(f" 严重级别: {case['severity']}") print(f" 失败原因: {case['message'][:100]}...") print() # 重新生成PDF报告以验证失败用例详情 pdf_file = latest_dir / "report_cn.pdf" print(f"🔄 重新生成PDF报告: {pdf_file}") try: save_pdf_report(test_data, pdf_file, strictness_level='HIGH') if pdf_file.exists(): file_size = pdf_file.stat().st_size / 1024 print(f"✅ PDF报告生成成功!") print(f"📄 文件大小: {file_size:.2f} KB") print(f"\n🎯 PDF报告现在包含以下新功能:") print("✅ 失败用例详情分析部分") print("✅ 按严重级别分组的失败统计") print("✅ 每个失败用例的详细信息:") print(" - 用例ID和名称") print(" - 所属端点") print(" - 严重级别") print(" - 详细的失败原因") if failed_cases: print(f"\n📝 报告中将显示 {len(failed_cases)} 个失败用例的详细分析") # 按严重级别分组 critical_count = len([c for c in failed_cases if c['severity'] == 'CRITICAL']) high_count = len([c for c in failed_cases if c['severity'] == 'HIGH']) medium_count = len([c for c in failed_cases if c['severity'] == 'MEDIUM']) low_count = len([c for c in failed_cases if c['severity'] == 'LOW']) print(f" - 严重级别: {critical_count} 个") print(f" - 高级别: {high_count} 个") print(f" - 中级别: {medium_count} 个") print(f" - 低级别: {low_count} 个") else: print("✅ 本次测试没有失败用例") return True else: print("❌ PDF报告生成失败") return False except Exception as e: print(f"❌ 生成PDF报告时出错: {e}") import traceback traceback.print_exc() return False def main(): """主函数""" print("🚀 DMS合规性测试工具 - PDF失败用例详情验证") print("=" * 80) success = verify_latest_report() print("\n" + "=" * 80) if success: print("🎉 验证完成!PDF报告已成功添加失败用例详情功能") print("\n💡 新功能说明:") print("1. 在PDF报告中新增了'失败用例详情分析'部分") print("2. 按严重级别统计和分组显示失败用例") print("3. 每个失败用例都包含:") print(" - 用例基本信息(ID、名称、端点、严重级别)") print(" - 详细的失败原因说明") print(" - 清晰的格式化显示") print("4. 支持endpoint测试用例和stage测试用例") print("5. 自动处理长文本,确保PDF显示正常") print("\n📖 使用方法:") print("- 运行测试后,查看生成的PDF报告") print("- 在报告中找到'失败用例详情分析'部分") print("- 每个失败用例都有详细的错误信息和修复建议") sys.exit(0) else: print("❌ 验证失败,请检查错误信息") sys.exit(1) if __name__ == "__main__": main()