424 lines
18 KiB
Python
424 lines
18 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
员工调动记录功能完整测试脚本
|
||
测试新的员工搜索接口和Treeselect部门选择功能
|
||
"""
|
||
|
||
import requests
|
||
import json
|
||
from datetime import datetime
|
||
|
||
# 配置
|
||
BASE_URL = "http://localhost:8080"
|
||
USERNAME = "admin"
|
||
PASSWORD = "admin123"
|
||
|
||
class StaffTransferTester:
|
||
def __init__(self):
|
||
self.base_url = BASE_URL
|
||
self.token = None
|
||
self.headers = {}
|
||
self.test_results = []
|
||
|
||
def log_test(self, test_name, passed, message=""):
|
||
"""记录测试结果"""
|
||
status = "✅ PASS" if passed else "❌ FAIL"
|
||
result = {
|
||
"test": test_name,
|
||
"status": status,
|
||
"message": message,
|
||
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||
}
|
||
self.test_results.append(result)
|
||
print(f"{status} - {test_name}")
|
||
if message:
|
||
print(f" {message}")
|
||
|
||
def login(self):
|
||
"""登录获取token"""
|
||
print("\n=== 测试1: 用户登录 ===")
|
||
try:
|
||
url = f"{self.base_url}/login/test"
|
||
data = {
|
||
"username": USERNAME,
|
||
"password": PASSWORD
|
||
}
|
||
response = requests.post(url, json=data)
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result.get("code") == 200:
|
||
self.token = result.get("token")
|
||
self.headers = {"Authorization": f"Bearer {self.token}"}
|
||
self.log_test("用户登录", True, f"成功获取token: {self.token[:20]}...")
|
||
return True
|
||
else:
|
||
self.log_test("用户登录", False, f"登录失败: {result.get('msg')}")
|
||
return False
|
||
else:
|
||
self.log_test("用户登录", False, f"HTTP错误: {response.status_code}")
|
||
return False
|
||
except Exception as e:
|
||
self.log_test("用户登录", False, f"异常: {str(e)}")
|
||
return False
|
||
|
||
def test_staff_search_no_param(self):
|
||
"""测试员工搜索接口 - 不带参数"""
|
||
print("\n=== 测试2: 员工搜索(不带参数)===")
|
||
try:
|
||
url = f"{self.base_url}/ccdi/baseStaff/options"
|
||
response = requests.get(url, headers=self.headers)
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result.get("code") == 200:
|
||
data = result.get("data", [])
|
||
self.log_test("员工搜索(不带参数)", True, f"返回{len(data)}条记录")
|
||
if data:
|
||
print(f" 示例数据: {json.dumps(data[0], ensure_ascii=False)}")
|
||
return data
|
||
else:
|
||
self.log_test("员工搜索(不带参数)", False, f"业务错误: {result.get('msg')}")
|
||
return []
|
||
else:
|
||
self.log_test("员工搜索(不带参数)", False, f"HTTP错误: {response.status_code}")
|
||
return []
|
||
except Exception as e:
|
||
self.log_test("员工搜索(不带参数)", False, f"异常: {str(e)}")
|
||
return []
|
||
|
||
def test_staff_search_by_id(self, staff_list):
|
||
"""测试员工搜索接口 - 按员工ID搜索"""
|
||
print("\n=== 测试3: 员工搜索(按员工ID)===")
|
||
if not staff_list:
|
||
self.log_test("员工搜索(按员工ID)", False, "无可用员工数据")
|
||
return None
|
||
|
||
try:
|
||
staff_id = staff_list[0]["staffId"]
|
||
url = f"{self.base_url}/ccdi/baseStaff/options"
|
||
params = {"query": str(staff_id)}
|
||
response = requests.get(url, headers=self.headers, params=params)
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result.get("code") == 200:
|
||
data = result.get("data", [])
|
||
self.log_test("员工搜索(按员工ID)", True, f"搜索'{staff_id}'返回{len(data)}条记录")
|
||
return staff_list[0]
|
||
else:
|
||
self.log_test("员工搜索(按员工ID)", False, f"业务错误: {result.get('msg')}")
|
||
return None
|
||
else:
|
||
self.log_test("员工搜索(按员工ID)", False, f"HTTP错误: {response.status_code}")
|
||
return None
|
||
except Exception as e:
|
||
self.log_test("员工搜索(按员工ID)", False, f"异常: {str(e)}")
|
||
return None
|
||
|
||
def test_staff_search_by_name(self, staff_list):
|
||
"""测试员工搜索接口 - 按姓名搜索"""
|
||
print("\n=== 测试4: 员工搜索(按姓名)===")
|
||
if not staff_list:
|
||
self.log_test("员工搜索(按姓名)", False, "无可用员工数据")
|
||
return []
|
||
|
||
try:
|
||
# 获取第一个员工的姓名进行搜索
|
||
staff_name = staff_list[0]["staffName"]
|
||
url = f"{self.base_url}/ccdi/baseStaff/options"
|
||
params = {"query": staff_name}
|
||
response = requests.get(url, headers=self.headers, params=params)
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result.get("code") == 200:
|
||
data = result.get("data", [])
|
||
self.log_test("员工搜索(按姓名)", True, f"搜索'{staff_name}'返回{len(data)}条记录")
|
||
if data:
|
||
print(f" 匹配结果: {json.dumps(data[0], ensure_ascii=False)}")
|
||
return data
|
||
else:
|
||
self.log_test("员工搜索(按姓名)", False, f"业务错误: {result.get('msg')}")
|
||
return []
|
||
else:
|
||
self.log_test("员工搜索(按姓名)", False, f"HTTP错误: {response.status_code}")
|
||
return []
|
||
except Exception as e:
|
||
self.log_test("员工搜索(按姓名)", False, f"异常: {str(e)}")
|
||
return []
|
||
|
||
def test_add_transfer(self, staff_data):
|
||
"""测试新增调动记录"""
|
||
print("\n=== 测试5: 新增员工调动记录 ===")
|
||
try:
|
||
url = f"{self.base_url}/ccdi/staffTransfer"
|
||
data = {
|
||
"staffId": staff_data["staffId"],
|
||
"transferType": "LATERAL",
|
||
"transferSubType": "测试调动",
|
||
"deptIdBefore": 100, # 示例部门ID
|
||
"deptNameBefore": "测试部门A",
|
||
"gradeBefore": "初级",
|
||
"positionBefore": "员工",
|
||
"salaryLevelBefore": "P1",
|
||
"deptIdAfter": 101, # 示例部门ID
|
||
"deptNameAfter": "测试部门B",
|
||
"gradeAfter": "中级",
|
||
"positionAfter": "主管",
|
||
"salaryLevelAfter": "P2",
|
||
"transferDate": datetime.now().strftime("%Y-%m-%d")
|
||
}
|
||
response = requests.post(url, json=data, headers=self.headers)
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result.get("code") == 200:
|
||
self.log_test("新增员工调动记录", True, "新增成功")
|
||
return True
|
||
else:
|
||
self.log_test("新增员工调动记录", False, f"业务错误: {result.get('msg')}")
|
||
return False
|
||
else:
|
||
self.log_test("新增员工调动记录", False, f"HTTP错误: {response.status_code}")
|
||
return False
|
||
except Exception as e:
|
||
self.log_test("新增员工调动记录", False, f"异常: {str(e)}")
|
||
return False
|
||
|
||
def test_query_transfer_list(self):
|
||
"""测试查询调动记录列表"""
|
||
print("\n=== 测试6: 查询调动记录列表 ===")
|
||
try:
|
||
url = f"{self.base_url}/ccdi/staffTransfer/list"
|
||
params = {
|
||
"pageNum": 1,
|
||
"pageSize": 10
|
||
}
|
||
response = requests.get(url, headers=self.headers, params=params)
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result.get("code") == 200:
|
||
rows = result.get("rows", [])
|
||
total = result.get("total", 0)
|
||
self.log_test("查询调动记录列表", True, f"查询成功,共{total}条记录,当前页{len(rows)}条")
|
||
if rows:
|
||
print(f" 示例记录ID: {rows[0].get('id', 'N/A')}")
|
||
return rows
|
||
else:
|
||
self.log_test("查询调动记录列表", False, f"业务错误: {result.get('msg')}")
|
||
return []
|
||
else:
|
||
self.log_test("查询调动记录列表", False, f"HTTP错误: {response.status_code}")
|
||
return []
|
||
except Exception as e:
|
||
self.log_test("查询调动记录列表", False, f"异常: {str(e)}")
|
||
return []
|
||
|
||
def test_get_transfer_detail(self, transfer_list):
|
||
"""测试获取调动记录详情"""
|
||
print("\n=== 测试7: 获取调动记录详情 ===")
|
||
if not transfer_list:
|
||
self.log_test("获取调动记录详情", False, "无可用调动记录")
|
||
return None
|
||
|
||
try:
|
||
transfer_id = transfer_list[0].get("id")
|
||
url = f"{self.base_url}/ccdi/staffTransfer/{transfer_id}"
|
||
response = requests.get(url, headers=self.headers)
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result.get("code") == 200:
|
||
data = result.get("data")
|
||
self.log_test("获取调动记录详情", True, f"获取成功,记录ID: {transfer_id}")
|
||
print(f" 员工ID: {data.get('staffId')}")
|
||
print(f" 调动类型: {data.get('transferType')}")
|
||
return data
|
||
else:
|
||
self.log_test("获取调动记录详情", False, f"业务错误: {result.get('msg')}")
|
||
return None
|
||
else:
|
||
self.log_test("获取调动记录详情", False, f"HTTP错误: {response.status_code}")
|
||
return None
|
||
except Exception as e:
|
||
self.log_test("获取调动记录详情", False, f"异常: {str(e)}")
|
||
return None
|
||
|
||
def test_edit_transfer(self, transfer_list):
|
||
"""测试编辑调动记录"""
|
||
print("\n=== 测试8: 编辑员工调动记录 ===")
|
||
if not transfer_list:
|
||
self.log_test("编辑员工调动记录", False, "无可用调动记录")
|
||
return False
|
||
|
||
try:
|
||
transfer_id = transfer_list[0].get("id")
|
||
url = f"{self.base_url}/ccdi/staffTransfer"
|
||
data = {
|
||
"id": transfer_id,
|
||
"staffId": transfer_list[0].get("staffId"), # 员工ID不可修改,但需要传递
|
||
"transferType": "PROMOTION", # 修改调动类型
|
||
"transferSubType": "测试调动-已编辑",
|
||
"deptIdBefore": 100,
|
||
"deptNameBefore": "测试部门A",
|
||
"gradeBefore": "初级",
|
||
"positionBefore": "员工",
|
||
"salaryLevelBefore": "P1",
|
||
"deptIdAfter": 102,
|
||
"deptNameAfter": "测试部门C",
|
||
"gradeAfter": "高级",
|
||
"positionAfter": "经理",
|
||
"salaryLevelAfter": "P3",
|
||
"transferDate": datetime.now().strftime("%Y-%m-%d")
|
||
}
|
||
response = requests.put(url, json=data, headers=self.headers)
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result.get("code") == 200:
|
||
self.log_test("编辑员工调动记录", True, "编辑成功")
|
||
return True
|
||
else:
|
||
self.log_test("编辑员工调动记录", False, f"业务错误: {result.get('msg')}")
|
||
return False
|
||
else:
|
||
self.log_test("编辑员工调动记录", False, f"HTTP错误: {response.status_code}")
|
||
return False
|
||
except Exception as e:
|
||
self.log_test("编辑员工调动记录", False, f"异常: {str(e)}")
|
||
return False
|
||
|
||
def test_delete_transfer(self, transfer_list):
|
||
"""测试删除调动记录"""
|
||
print("\n=== 测试9: 删除员工调动记录 ===")
|
||
if not transfer_list:
|
||
self.log_test("删除员工调动记录", False, "无可用调动记录")
|
||
return False
|
||
|
||
try:
|
||
transfer_id = transfer_list[0].get("id")
|
||
url = f"{self.base_url}/ccdi/staffTransfer/{transfer_id}"
|
||
response = requests.delete(url, headers=self.headers)
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result.get("code") == 200:
|
||
self.log_test("删除员工调动记录", True, f"删除成功,记录ID: {transfer_id}")
|
||
return True
|
||
else:
|
||
self.log_test("删除员工调动记录", False, f"业务错误: {result.get('msg')}")
|
||
return False
|
||
else:
|
||
self.log_test("删除员工调动记录", False, f"HTTP错误: {response.status_code}")
|
||
return False
|
||
except Exception as e:
|
||
self.log_test("删除员工调动记录", False, f"异常: {str(e)}")
|
||
return False
|
||
|
||
def test_export_transfer(self):
|
||
"""测试导出调动记录"""
|
||
print("\n=== 测试10: 导出调动记录 ===")
|
||
try:
|
||
url = f"{self.base_url}/ccdi/staffTransfer/export"
|
||
params = {
|
||
"staffId": "",
|
||
"transferType": "",
|
||
"deptIdAfter": ""
|
||
}
|
||
response = requests.post(url, headers=self.headers, params=params)
|
||
if response.status_code == 200:
|
||
# 检查是否返回Excel文件
|
||
content_type = response.headers.get("Content-Type", "")
|
||
if "excel" in content_type or "spreadsheet" in content_type or response.status_code == 200:
|
||
self.log_test("导出调动记录", True, f"导出成功,文件类型: {content_type}")
|
||
return True
|
||
else:
|
||
self.log_test("导出调动记录", False, f"返回格式错误: {content_type}")
|
||
return False
|
||
else:
|
||
self.log_test("导出调动记录", False, f"HTTP错误: {response.status_code}")
|
||
return False
|
||
except Exception as e:
|
||
self.log_test("导出调动记录", False, f"异常: {str(e)}")
|
||
return False
|
||
|
||
def generate_report(self):
|
||
"""生成测试报告"""
|
||
print("\n" + "="*60)
|
||
print("测试报告")
|
||
print("="*60)
|
||
|
||
passed = sum(1 for r in self.test_results if "PASS" in r["status"])
|
||
failed = sum(1 for r in self.test_results if "FAIL" in r["status"])
|
||
|
||
print(f"\n总计: {len(self.test_results)} 个测试")
|
||
print(f"通过: {passed} 个")
|
||
print(f"失败: {failed} 个")
|
||
if len(self.test_results) > 0:
|
||
print(f"成功率: {passed/len(self.test_results)*100:.1f}%\n")
|
||
|
||
# 保存到文件
|
||
report_path = "D:\\ccdi\\ccdi\\doc\\测试数据\\员工调动记录\\test_report.txt"
|
||
with open(report_path, "w", encoding="utf-8") as f:
|
||
f.write("员工调动记录功能测试报告\n")
|
||
f.write("="*60 + "\n")
|
||
f.write(f"测试时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
|
||
f.write(f"总计: {len(self.test_results)} 个测试\n")
|
||
f.write(f"通过: {passed} 个\n")
|
||
f.write(f"失败: {failed} 个\n")
|
||
if len(self.test_results) > 0:
|
||
f.write(f"成功率: {passed/len(self.test_results)*100:.1f}%\n\n")
|
||
f.write("详细结果:\n")
|
||
f.write("-"*60 + "\n")
|
||
for result in self.test_results:
|
||
f.write(f"{result['status']} - {result['test']}\n")
|
||
if result['message']:
|
||
f.write(f" {result['message']}\n")
|
||
|
||
print(f"测试报告已保存至: {report_path}")
|
||
|
||
def run_all_tests(self):
|
||
"""运行所有测试"""
|
||
print("="*60)
|
||
print("员工调动记录功能测试")
|
||
print("="*60)
|
||
|
||
# 测试1: 登录
|
||
if not self.login():
|
||
print("登录失败,终止测试")
|
||
self.generate_report()
|
||
return
|
||
|
||
# 测试2: 搜索员工(不带参数)
|
||
staff_list = self.test_staff_search_no_param()
|
||
|
||
# 测试3: 搜索员工(按ID)
|
||
staff_data = self.test_staff_search_by_id(staff_list)
|
||
|
||
# 测试4: 搜索员工(按姓名)
|
||
self.test_staff_search_by_name(staff_list)
|
||
|
||
# 测试5: 新增调动记录
|
||
if staff_data:
|
||
add_success = self.test_add_transfer(staff_data)
|
||
else:
|
||
add_success = False
|
||
print(" 跳过新增测试:无有效员工数据")
|
||
|
||
# 测试6: 查询调动记录列表
|
||
transfer_list = self.test_query_transfer_list()
|
||
|
||
# 测试7: 获取调动记录详情
|
||
self.test_get_transfer_detail(transfer_list)
|
||
|
||
# 测试8: 编辑调动记录
|
||
if add_success and transfer_list:
|
||
self.test_edit_transfer(transfer_list)
|
||
|
||
# 测试9: 删除调动记录(可选,谨慎执行)
|
||
# self.test_delete_transfer(transfer_list)
|
||
|
||
# 测试10: 导出调动记录
|
||
self.test_export_transfer()
|
||
|
||
# 生成报告
|
||
self.generate_report()
|
||
|
||
if __name__ == "__main__":
|
||
tester = StaffTransferTester()
|
||
tester.run_all_tests()
|