#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Socket JSON 传输系统自动测试脚本 用于快速验证服务器和客户端功能 """ import subprocess import time import threading import os import sys import json from datetime import datetime # 设置标准输出编码为 UTF-8(解决 Windows 控制台编码问题) if sys.platform.startswith('win'): import codecs sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach()) sys.stderr = codecs.getwriter('utf-8')(sys.stderr.detach()) class SocketTester: def __init__(self): self.server_process = None self.test_results = [] def log(self, message, level="INFO"): """记录测试日志""" timestamp = datetime.now().strftime("%H:%M:%S") print(f"[{timestamp}] {level}: {message}") self.test_results.append(f"[{timestamp}] {level}: {message}") def start_server(self): """启动服务器""" try: self.log("正在启动服务器...") self.server_process = subprocess.Popen( [sys.executable, "server.py"], cwd=os.getcwd(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # 等待服务器启动 time.sleep(2) if self.server_process.poll() is None: self.log("✅ 服务器启动成功", "SUCCESS") return True else: stdout, stderr = self.server_process.communicate() self.log(f"❌ 服务器启动失败: {stderr}", "ERROR") return False except Exception as e: self.log(f"❌ 启动服务器时出错: {e}", "ERROR") return False def stop_server(self): """停止服务器""" if self.server_process: try: self.server_process.terminate() self.server_process.wait(timeout=5) self.log("⛔ 服务器已停止", "INFO") except subprocess.TimeoutExpired: self.server_process.kill() self.log("⛔ 强制停止服务器", "WARNING") except Exception as e: self.log(f"❌ 停止服务器时出错: {e}", "ERROR") def test_client_commands(self): """测试客户端命令""" try: self.log("开始测试客户端功能...") # 运行客户端测试 result = subprocess.run( [sys.executable, "client.py", "test"], cwd=os.getcwd(), capture_output=True, text=True, timeout=30 ) if result.returncode == 0: self.log("✅ 客户端测试完成", "SUCCESS") self.log("客户端输出:", "DEBUG") for line in result.stdout.split('\n'): if line.strip(): self.log(f" {line}", "DEBUG") return True else: self.log(f"❌ 客户端测试失败: {result.stderr}", "ERROR") return False except subprocess.TimeoutExpired: self.log("❌ 客户端测试超时", "ERROR") return False except Exception as e: self.log(f"❌ 客户端测试出错: {e}", "ERROR") return False def verify_files(self): """验证文件是否正确创建""" self.log("验证测试文件...") required_files = ["server.py", "client.py", "test_data.json"] missing_files = [] for file in required_files: if not os.path.exists(file): missing_files.append(file) if missing_files: self.log(f"❌ 缺少文件: {', '.join(missing_files)}", "ERROR") return False else: self.log("✅ 所有必需文件都存在", "SUCCESS") return True def run_full_test(self): """运行完整测试""" self.log("🚀 开始 Socket JSON 传输系统完整测试", "INFO") self.log("=" * 50, "INFO") success_count = 0 total_tests = 4 try: # 测试 1: 验证文件 self.log("\n📋 测试 1/4: 验证文件存在性", "INFO") if self.verify_files(): success_count += 1 # 测试 2: 启动服务器 self.log("\n🖥️ 测试 2/4: 启动服务器", "INFO") if self.start_server(): success_count += 1 # 测试 3: 客户端功能测试 self.log("\n💻 测试 3/4: 客户端功能测试", "INFO") if self.test_client_commands(): success_count += 1 # 测试 4: 文件传输验证 self.log("\n📁 测试 4/4: 验证文件传输", "INFO") if os.path.exists("client_test.json"): self.log("✅ 发现客户端创建的测试文件", "SUCCESS") try: with open("client_test.json", 'r', encoding='utf-8') as f: data = json.load(f) self.log("✅ JSON 文件格式正确", "SUCCESS") self.log(f"文件内容预览: {data.get('message', 'N/A')}", "DEBUG") success_count += 1 except Exception as e: self.log(f"❌ JSON 文件格式错误: {e}", "ERROR") else: self.log("❌ 未找到客户端测试文件", "ERROR") finally: self.stop_server() # 测试结果总结 self.log("\n" + "=" * 50, "INFO") self.log(f"🎯 测试完成: {success_count}/{total_tests} 项通过", "SUCCESS" if success_count == total_tests else "WARNING") if success_count == total_tests: self.log("🎉 所有测试通过!Socket JSON 传输系统工作正常", "SUCCESS") else: self.log("⚠️ 部分测试失败,请检查上述错误信息", "WARNING") return success_count == total_tests def save_test_report(self): """保存测试报告""" report = { "test_time": datetime.now().isoformat(), "test_results": self.test_results, "summary": f"测试完成,详细日志共 {len(self.test_results)} 条" } with open("test_report.json", 'w', encoding='utf-8') as f: json.dump(report, f, ensure_ascii=False, indent=2) self.log("📊 测试报告已保存到 test_report.json", "INFO") def main(): """主函数""" print("🧪 Socket JSON 传输系统自动测试工具") print("=" * 50) if len(sys.argv) > 1: command = sys.argv[1].lower() if command == "help": print("使用方法:") print(" python test_socket.py - 运行完整测试") print(" python test_socket.py full - 运行完整测试") print(" python test_socket.py help - 显示帮助") return tester = SocketTester() try: success = tester.run_full_test() tester.save_test_report() if success: print("\n🎊 测试全部通过!您的 Socket JSON 传输系统运行正常!") else: print("\n🔧 测试发现问题,请查看上述日志进行修复") except KeyboardInterrupt: print("\n⛔ 测试被用户中断") tester.stop_server() except Exception as e: print(f"\n❌ 测试过程中出现异常: {e}") tester.stop_server() if __name__ == "__main__": main()