#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 批量锁定当月工资接口测试脚本 使用Python内置库,无需额外依赖 """ import urllib.request import urllib.parse import json import sys BASE_URL = "http://localhost:2011" # 服务列表 SERVICES = [ ("lqsalary", "健康师"), ("lqtechteachersalary", "科技部老师"), ("lqassistantsalary", "店助"), ("lqstoremanagersalary", "店长"), ("lqdirectorsalary", "主任"), ("lqmajorprojectteachersalary", "大项目老师"), ("lqmajorprojectdirectorsalary", "大项目主管"), ("lqtechgeneralmanagersalary", "科技部总经理"), ("lqbusinessunitmanagersalary", "事业部总经理"), ] def get_token(): """获取登录token""" try: url = f"{BASE_URL}/api/oauth/Login" data = urllib.parse.urlencode({ "account": "admin", "password": "e10adc3949ba59abbe56e057f20f883e" }).encode('utf-8') req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/x-www-form-urlencoded"}) with urllib.request.urlopen(req, timeout=10) as response: result = json.loads(response.read().decode('utf-8')) if result.get("code") == 200 and "data" in result and "token" in result["data"]: return result["data"]["token"] print(f"❌ 获取token失败") return None except urllib.error.URLError as e: print(f"❌ 无法连接到服务器: {BASE_URL}") print(f" 错误: {str(e)}") print(" 请确保服务已启动") return None except Exception as e: print(f"❌ 获取token时发生错误: {str(e)}") return None def test_lock_by_month(service_name, service_desc, year, month, is_locked, token): """测试批量锁定当月工资接口""" url = f"{BASE_URL}/api/Extend/{service_name}/lock-by-month" payload = { "year": year, "month": month, "isLocked": is_locked } try: data = json.dumps(payload).encode('utf-8') req = urllib.request.Request( url, data=data, headers={ "Authorization": token, "Content-Type": "application/json" } ) with urllib.request.urlopen(req, timeout=30) as response: result_data = json.loads(response.read().decode('utf-8')) result = { "service": service_desc, "service_name": service_name, "status_code": response.status, "success": False, "message": "", "data": None, "error": None } if response.status == 200: if result_data.get("code") == 200 or result_data.get("success") == True: result["success"] = True if "data" in result_data: result["data"] = result_data["data"] else: result["data"] = result_data result["message"] = result["data"].get("message", "操作成功") if isinstance(result["data"], dict) else str(result["data"]) else: result["error"] = result_data.get("msg", "未知错误") return result except urllib.error.HTTPError as e: try: error_data = json.loads(e.read().decode('utf-8')) error_msg = error_data.get("msg", f"HTTP {e.code}") except: error_msg = f"HTTP {e.code}" return { "service": service_desc, "service_name": service_name, "success": False, "error": error_msg } except urllib.error.URLError as e: return { "service": service_desc, "service_name": service_name, "success": False, "error": f"连接错误: {str(e)}" } except Exception as e: return { "service": service_desc, "service_name": service_name, "success": False, "error": str(e) } def main(): print("=" * 60) print("批量锁定当月工资接口测试") print("=" * 60) print() # 获取token print("正在获取token...") token = get_token() if not token: print("\n❌ 无法获取token,测试终止") print("\n提示:请确保服务已启动,并且登录接口正常") sys.exit(1) print("✅ 成功获取token") print() # 测试参数 YEAR = 2025 MONTH = 12 # 测试用例1:批量锁定 print("=" * 60) print("测试用例1:批量锁定当月所有工资") print(f"测试月份: {YEAR}年{MONTH}月") print("=" * 60) print() success_count = 0 fail_count = 0 results = [] for service_name, service_desc in SERVICES: print(f"测试服务: {service_desc} ({service_name})") result = test_lock_by_month(service_name, service_desc, YEAR, MONTH, True, token) results.append(result) if result["success"]: print(f" ✅ 接口调用成功") if isinstance(result["data"], dict): print(f" - 消息: {result['message']}") print(f" - 总数: {result['data'].get('total', 0)}") print(f" - 锁定: {result['data'].get('locked', 0)}") print(f" - 跳过: {result['data'].get('skipped', 0)}") print(f" - 已是锁定状态: {result['data'].get('alreadyLocked', 0)}") else: print(f" - 响应: {result['message']}") success_count += 1 else: print(f" ❌ 接口调用失败") print(f" - 错误: {result.get('error', '未知错误')}") fail_count += 1 print() # 测试用例2:批量解锁(只测试第一个服务) print("=" * 60) print("测试用例2:批量解锁当月所有工资(示例)") print("=" * 60) print() first_service_name, first_service_desc = SERVICES[0] print(f"测试服务: {first_service_desc} ({first_service_name})") unlock_result = test_lock_by_month(first_service_name, first_service_desc, YEAR, MONTH, False, token) if unlock_result["success"]: print(f" ✅ 接口调用成功") if isinstance(unlock_result["data"], dict): print(f" - 消息: {unlock_result['message']}") print(f" - 总数: {unlock_result['data'].get('total', 0)}") print(f" - 解锁: {unlock_result['data'].get('unlocked', 0)}") print(f" - 跳过: {unlock_result['data'].get('skipped', 0)}") else: print(f" ❌ 接口调用失败") print(f" - 错误: {unlock_result.get('error', '未知错误')}") print() # 测试用例3:参数验证 print("=" * 60) print("测试用例3:参数验证(错误年份)") print("=" * 60) print() print(f"测试服务: {first_service_desc} ({first_service_name})") invalid_result = test_lock_by_month(first_service_name, first_service_desc, 0, MONTH, True, token) if not invalid_result["success"]: print(f" ✅ 参数验证正常") print(f" - 错误信息: {invalid_result.get('error', '参数验证失败')}") else: print(f" ❌ 参数验证异常(应该拒绝无效参数)") print() # 测试总结 print("=" * 60) print("测试总结") print("=" * 60) print(f"总计: {success_count}/{len(SERVICES)} 个服务接口测试通过") print() if success_count == len(SERVICES): print("🎉 所有接口测试通过!") return 0 else: print(f"⚠️ 有 {fail_count} 个接口测试失败") print("\n失败的接口:") for result in results: if not result["success"]: print(f" - {result['service']} ({result['service_name']}): {result.get('error', '未知错误')}") return 1 if __name__ == "__main__": sys.exit(main())