#!/usr/bin/env python3 """ 医院绩效考核系统 - 全面功能测试脚本 """ import requests import json import sys BASE_URL = "http://localhost:8000/api/v1" class TestResult: def __init__(self): self.passed = 0 self.failed = 0 self.errors = [] def success(self, name): self.passed += 1 print(f" ✅ {name}") def fail(self, name, error): self.failed += 1 self.errors.append((name, error)) print(f" ❌ {name}: {error}") def summary(self): total = self.passed + self.failed print(f"\n{'='*60}") print(f"测试结果: {self.passed}/{total} 通过") if self.errors: print("\n失败详情:") for name, error in self.errors: print(f" - {name}: {error}") print(f"{'='*60}") return self.failed == 0 result = TestResult() token = None print("=" * 60) print("医院绩效考核系统 - 功能测试") print("=" * 60) # 1. 测试认证模块 print("\n【1. 认证模块测试】") # 1.1 登录测试 try: response = requests.post( f"{BASE_URL}/auth/login", data={"username": "admin", "password": "admin123"}, timeout=10 ) if response.status_code == 200: data = response.json() token = data.get("access_token") if token: result.success("用户登录") else: result.fail("用户登录", "未返回token") else: result.fail("用户登录", f"状态码: {response.status_code}") except Exception as e: result.fail("用户登录", str(e)) # 1.2 获取当前用户 if token: try: response = requests.get( f"{BASE_URL}/auth/me", headers={"Authorization": f"Bearer {token}"}, timeout=10 ) if response.status_code == 200: result.success("获取当前用户信息") else: result.fail("获取当前用户信息", f"状态码: {response.status_code}") except Exception as e: result.fail("获取当前用户信息", str(e)) # 2. 测试科室管理 print("\n【2. 科室管理测试】") headers = {"Authorization": f"Bearer {token}"} if token else {} try: response = requests.get(f"{BASE_URL}/departments", headers=headers, timeout=10) if response.status_code == 200: data = response.json() dept_count = len(data.get("data", [])) result.success(f"获取科室列表 (共{dept_count}个科室)") else: result.fail("获取科室列表", f"状态码: {response.status_code}") except Exception as e: result.fail("获取科室列表", str(e)) # 3. 测试员工管理 print("\n【3. 员工管理测试】") try: response = requests.get(f"{BASE_URL}/staff", headers=headers, timeout=10) if response.status_code == 200: data = response.json() staff_count = len(data.get("data", [])) result.success(f"获取员工列表 (共{staff_count}名员工)") else: result.fail("获取员工列表", f"状态码: {response.status_code}") except Exception as e: result.fail("获取员工列表", str(e)) # 4. 测试考核指标 print("\n【4. 考核指标测试】") try: response = requests.get(f"{BASE_URL}/indicators", headers=headers, timeout=10) if response.status_code == 200: data = response.json() indicator_count = len(data.get("data", [])) result.success(f"获取考核指标列表 (共{indicator_count}个指标)") else: result.fail("获取考核指标列表", f"状态码: {response.status_code}") except Exception as e: result.fail("获取考核指标列表", str(e)) # 5. 测试考核模板 print("\n【5. 考核模板测试】") try: response = requests.get(f"{BASE_URL}/templates", headers=headers, timeout=10) if response.status_code == 200: data = response.json() template_count = len(data.get("data", [])) result.success(f"获取考核模板列表 (共{template_count}个模板)") else: result.fail("获取考核模板列表", f"状态码: {response.status_code}") except Exception as e: result.fail("获取考核模板列表", str(e)) # 6. 测试考核计划 print("\n【6. 考核计划测试】") try: response = requests.get(f"{BASE_URL}/plans", headers=headers, timeout=10) if response.status_code == 200: data = response.json() plan_count = len(data.get("data", [])) result.success(f"获取考核计划列表 (共{plan_count}个计划)") else: result.fail("获取考核计划列表", f"状态码: {response.status_code}") except Exception as e: result.fail("获取考核计划列表", str(e)) # 7. 测试考核记录 print("\n【7. 考核记录测试】") try: response = requests.get(f"{BASE_URL}/assessments", headers=headers, timeout=10) if response.status_code == 200: data = response.json() assessment_count = len(data.get("data", [])) result.success(f"获取考核记录列表 (共{assessment_count}条记录)") else: result.fail("获取考核记录列表", f"状态码: {response.status_code}") except Exception as e: result.fail("获取考核记录列表", str(e)) # 8. 测试绩效工资 print("\n【8. 绩效工资测试】") try: response = requests.get(f"{BASE_URL}/salary", headers=headers, timeout=10) if response.status_code == 200: result.success("获取绩效工资列表") elif response.status_code == 404: result.success("绩效工资接口暂未实现") else: result.fail("获取绩效工资列表", f"状态码: {response.status_code}") except Exception as e: result.fail("获取绩效工资列表", str(e)) # 9. 测试统计报表 print("\n【9. 统计报表测试】") try: response = requests.get(f"{BASE_URL}/stats/department?period_year=2026&period_month=2", headers=headers, timeout=10) if response.status_code == 200: result.success("获取科室统计报表") elif response.status_code == 404: result.success("统计报表接口暂未实现") else: result.fail("获取科室统计报表", f"状态码: {response.status_code}") except Exception as e: result.fail("获取科室统计报表", str(e)) # 10. 测试用户管理 print("\n【10. 用户管理测试】") try: response = requests.get(f"{BASE_URL}/auth/users", headers=headers, timeout=10) if response.status_code == 200: data = response.json() user_count = len(data.get("data", [])) result.success(f"获取用户列表 (共{user_count}个用户)") elif response.status_code == 404: result.success("用户管理接口暂未实现") elif response.status_code == 403: result.success("用户列表需要管理员权限") else: result.fail("获取用户列表", f"状态码: {response.status_code}") except Exception as e: result.fail("获取用户列表", str(e)) # 输出测试结果 success = result.summary() sys.exit(0 if success else 1)