#!/usr/bin/env python3 """ 修复验证测试 - 验证所有修复是否成功 """ import os import sys import requests import json import time from pathlib import Path # 项目路径 PROJECT_ROOT = Path(__file__).parent.parent DJANGO_ROOT = PROJECT_ROOT / "信息抽取+数据检验/Django123/atc_extractor/backend" API_BASE = "http://127.0.0.1:8000/api" class FixValidation: def __init__(self): self.results = { 'security_fixes': {}, 'bug_fixes': {}, 'architecture_improvements': {}, 'overall_score': 0 } def check_security_fixes(self): """检查安全修复""" print("🔒 检查安全修复...") # 1. 检查settings.py的环境变量配置 settings_file = DJANGO_ROOT / "backend/settings.py" if settings_file.exists(): with open(settings_file, 'r', encoding='utf-8') as f: content = f.read() # 检查是否使用环境变量 has_env_vars = 'get_env_variable' in content has_secret_key_gen = 'get_random_secret_key' in content has_debug_env = "get_env_variable('DEBUG'" in content self.results['security_fixes'] = { 'environment_variables': has_env_vars, 'dynamic_secret_key': has_secret_key_gen, 'debug_env_control': has_debug_env, 'score': sum([has_env_vars, has_secret_key_gen, has_debug_env]) } print(f" ✓ 环境变量配置: {'是' if has_env_vars else '否'}") print(f" ✓ 动态SECRET_KEY: {'是' if has_secret_key_gen else '否'}") print(f" ✓ DEBUG环境控制: {'是' if has_debug_env else '否'}") # 2. 检查.env.example文件 env_example = DJANGO_ROOT / ".env.example" if env_example.exists(): print(" ✓ .env.example文件已创建") self.results['security_fixes']['env_example'] = True else: print(" ✗ .env.example文件未找到") self.results['security_fixes']['env_example'] = False def check_bug_fixes(self): """检查bug修复""" print("\n🐛 检查bug修复...") # 检查表名拼写修复 views_file = DJANGO_ROOT / "extractor/views.py" services_file = DJANGO_ROOT / "extractor/services.py" table_name_fixes = 0 if views_file.exists(): with open(views_file, 'r', encoding='utf-8') as f: content = f.read() if 'processed_table' in content and 'precessed_table' in content: print(" ✓ views.py: 表名修复且保持向后兼容") table_name_fixes += 1 elif 'processed_table' in content: print(" ⚠ views.py: 表名已修复但可能缺少向后兼容") table_name_fixes += 0.5 if services_file.exists(): with open(services_file, 'r', encoding='utf-8') as f: content = f.read() if 'processed_table' in content and 'precessed_table' in content: print(" ✓ services.py: 表名修复且保持向后兼容") table_name_fixes += 1 elif 'processed_table' in content: print(" ⚠ services.py: 表名已修复但可能缺少向后兼容") table_name_fixes += 0.5 self.results['bug_fixes'] = { 'table_name_fixes': table_name_fixes, 'score': table_name_fixes } def check_architecture_improvements(self): """检查架构改进""" print("\n🏗️ 检查架构改进...") # 1. 检查requirements.txt req_file = DJANGO_ROOT / "requirements.txt" has_requirements = req_file.exists() print(f" ✓ requirements.txt: {'已创建' if has_requirements else '未创建'}") # 2. 检查models.py改进 models_file = DJANGO_ROOT / "extractor/models.py" has_models = False if models_file.exists(): with open(models_file, 'r', encoding='utf-8') as f: content = f.read() has_models = len(content) > 500 and 'class' in content print(f" ✓ models.py改进: {'已完成' if has_models else '未完成'}") # 3. 检查测试文件 test_files = [ PROJECT_ROOT / "test/comprehensive_backend_tests.py", DJANGO_ROOT / "extractor/test_views.py", PROJECT_ROOT / "test/run_tests.py" ] test_coverage = sum(1 for f in test_files if f.exists()) print(f" ✓ 测试覆盖: {test_coverage}/3 个测试文件") self.results['architecture_improvements'] = { 'requirements_file': has_requirements, 'models_enhancement': has_models, 'test_coverage': test_coverage, 'score': sum([has_requirements, has_models, test_coverage > 0]) } def test_api_functionality(self): """测试API功能是否正常""" print("\n🌐 测试API功能...") try: # 测试健康检查 response = requests.get(f"{API_BASE}/health/", timeout=5) if response.status_code == 200: print(" ✓ 健康检查API正常") api_health = True else: print(f" ✗ 健康检查API异常: {response.status_code}") api_health = False except Exception as e: print(f" ✗ API测试失败: {e}") api_health = False self.results['api_functionality'] = { 'health_check': api_health, 'score': 1 if api_health else 0 } return api_health def calculate_overall_score(self): """计算总体评分""" security_score = self.results['security_fixes'].get('score', 0) bug_score = self.results['bug_fixes'].get('score', 0) arch_score = self.results['architecture_improvements'].get('score', 0) api_score = self.results['api_functionality'].get('score', 0) # 权重计算 total_score = ( security_score * 0.3 + # 安全修复30% bug_score * 0.3 + # bug修复30% arch_score * 0.3 + # 架构改进30% api_score * 0.1 # API功能10% ) max_score = (3 * 0.3) + (2 * 0.3) + (3 * 0.3) + (1 * 0.1) # 最大可能分数 percentage = (total_score / max_score) * 100 self.results['overall_score'] = { 'total': total_score, 'max': max_score, 'percentage': percentage } return percentage def generate_report(self): """生成修复验证报告""" print("\n" + "="*60) print("📊 修复验证报告") print("="*60) # 安全修复 sec_fixes = self.results['security_fixes'] print(f"\n🔒 安全修复 ({sec_fixes.get('score', 0)}/3):") print(f" 环境变量配置: {'✓' if sec_fixes.get('environment_variables') else '✗'}") print(f" 动态SECRET_KEY: {'✓' if sec_fixes.get('dynamic_secret_key') else '✗'}") print(f" DEBUG环境控制: {'✓' if sec_fixes.get('debug_env_control') else '✗'}") # Bug修复 bug_fixes = self.results['bug_fixes'] print(f"\n🐛 Bug修复 ({bug_fixes.get('score', 0)}/2):") print(f" 表名拼写修复: {bug_fixes.get('table_name_fixes', 0)}/2 个文件") # 架构改进 arch_imp = self.results['architecture_improvements'] print(f"\n🏗️ 架构改进 ({arch_imp.get('score', 0)}/3):") print(f" requirements.txt: {'✓' if arch_imp.get('requirements_file') else '✗'}") print(f" models.py增强: {'✓' if arch_imp.get('models_enhancement') else '✗'}") print(f" 测试覆盖: {arch_imp.get('test_coverage', 0)}/3") # API功能 api_func = self.results['api_functionality'] print(f"\n🌐 API功能 ({api_func.get('score', 0)}/1):") print(f" 健康检查: {'✓' if api_func.get('health_check') else '✗'}") # 总体评分 overall = self.results['overall_score'] percentage = overall.get('percentage', 0) print(f"\n🎯 总体评分: {percentage:.1f}%") if percentage >= 90: print("🏆 优秀!所有关键问题已修复") elif percentage >= 70: print("✅ 良好!大部分问题已修复") elif percentage >= 50: print("⚠️ 一般,还有部分问题需要修复") else: print("❌ 需要继续修复更多问题") # 保存详细报告 report_file = PROJECT_ROOT / "test/fix_validation_report.json" with open(report_file, 'w', encoding='utf-8') as f: json.dump(self.results, f, indent=2, ensure_ascii=False) print(f"\n📄 详细报告已保存: {report_file}") def run_validation(self): """运行完整验证""" print("🔍 开始修复验证...") self.check_security_fixes() self.check_bug_fixes() self.check_architecture_improvements() # 检查服务器是否运行 try: requests.get(f"{API_BASE}/health/", timeout=3) self.test_api_functionality() except: print("\n⚠️ Django服务器未运行,跳过API测试") self.results['api_functionality'] = {'health_check': False, 'score': 0} self.calculate_overall_score() self.generate_report() def main(): validator = FixValidation() validator.run_validation() score = validator.results['overall_score'].get('percentage', 0) return 0 if score >= 70 else 1 # 70分以上算成功 if __name__ == "__main__": sys.exit(main())