Files
loan-pricing/run-api-tests.py
2026-01-20 11:20:39 +08:00

263 lines
8.1 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
利率定价流程 API 测试脚本
使用 Python 避免 Windows 环境下的编码问题
"""
import requests
import json
from datetime import datetime
BASE_URL = "http://localhost:8080"
TOKEN = ""
# 颜色代码
class Colors:
GREEN = '\033[0;32m'
RED = '\033[0;31m'
YELLOW = '\033[1;33m'
BLUE = '\033[0;34m'
NC = '\033[0m'
def print_header(text):
print(f"{Colors.BLUE}{'='*40}{Colors.NC}")
print(f"{Colors.BLUE}{text:^40}{Colors.NC}")
print(f"{Colors.BLUE}{'='*40}{Colors.NC}")
print()
def get_token():
"""获取测试 Token"""
print(f"{Colors.YELLOW}[步骤 1] 获取测试 Token{Colors.NC}")
print("-" * 35)
response = requests.post(
f"{BASE_URL}/login/test",
json={"username": "admin", "password": "admin123"}
)
result = response.json()
if result.get("code") == 200:
token = result.get("token")
print(f"{Colors.GREEN}✓ 登录成功{Colors.NC}")
print(f"Token: {token[:50]}...")
print()
return token
else:
print(f"{Colors.RED}✗ 登录失败{Colors.NC}")
print(f"响应: {result}")
exit(1)
def test_api(method, url, data, description, expected_code=200):
"""执行 API 测试"""
global TOTAL_TESTS, PASSED_TESTS, FAILED_TESTS, TEST_RESULTS
TOTAL_TESTS += 1
print(f"[{TOTAL_TESTS}] 测试: {description} ... ", end="", flush=True)
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json; charset=utf-8"
}
try:
if method == "GET":
response = requests.get(f"{BASE_URL}{url}", headers=headers)
else:
response = requests.post(f"{BASE_URL}{url}", headers=headers, json=data)
result = response.json()
actual_code = result.get("code")
if actual_code == expected_code:
print(f"{Colors.GREEN}✓ 通过{Colors.NC}")
PASSED_TESTS += 1
TEST_RESULTS.append(f"{description}")
else:
print(f"{Colors.RED}✗ 失败 (期望: {expected_code}, 实际: {actual_code}){Colors.NC}")
FAILED_TESTS += 1
TEST_RESULTS.append(f"{description} - 期望码: {expected_code}, 实际: {actual_code}")
print(f" 响应: {json.dumps(result, ensure_ascii=False)[:200]}")
except Exception as e:
print(f"{Colors.RED}✗ 异常: {str(e)}{Colors.NC}")
FAILED_TESTS += 1
TEST_RESULTS.append(f"{description} - 异常: {str(e)}")
def main():
global TOTAL_TESTS, PASSED_TESTS, FAILED_TESTS, TEST_RESULTS
TOTAL_TESTS = 0
PASSED_TESTS = 0
FAILED_TESTS = 0
TEST_RESULTS = []
print_header("利率定价流程 API 测试套件")
# 获取 Token
TOKEN = get_token()
# 执行测试
print(f"{Colors.YELLOW}[步骤 2] 执行测试用例{Colors.NC}")
print("-" * 35)
print()
print(f"{Colors.BLUE}【功能测试】{Colors.NC}")
# 测试 1: 个人客户信用贷款
test_api("POST", "/loanPricing/workflow/create", {
"orgCode": "931000",
"runType": "1",
"custIsn": "CUST20250119001",
"custType": "个人",
"guarType": "信用",
"midPerQuickPay": "true",
"midPerEleDdc": "false",
"midEntEleDdc": "false",
"midEntWaterDdc": "false",
"applyAmt": "50000",
"isCleanEnt": "false",
"hasSettleAcct": "true",
"isManufacturing": "false",
"isAgriGuar": "false",
"isTaxA": "false",
"isAgriLeading": "false",
"loanPurpose": "consumer",
"bizProof": "true",
"collType": "一类",
"collThirdParty": "false",
"loanRate": "4.35",
"custName": "张三",
"idType": "身份证",
"isInclusiveFinance": "true"
}, "发起流程-个人客户信用贷款")
# 测试 2: 企业客户抵押贷款
test_api("POST", "/loanPricing/workflow/create", {
"orgCode": "931000",
"runType": "1",
"custIsn": "CUST20250119002",
"custType": "企业",
"guarType": "抵押",
"applyAmt": "500000",
"isCleanEnt": "true",
"hasSettleAcct": "true",
"isManufacturing": "true",
"isTaxA": "true",
"loanPurpose": "business",
"collType": "一线",
"collThirdParty": "false",
"loanRate": "3.85",
"custName": "测试科技有限公司",
"idType": "统一社会信用代码",
"isInclusiveFinance": "true"
}, "发起流程-企业客户抵押贷款")
# 测试 3: 农业担保贷款
test_api("POST", "/loanPricing/workflow/create", {
"orgCode": "931000",
"runType": "1",
"custIsn": "CUST20250119003",
"custType": "企业",
"guarType": "保证",
"applyAmt": "300000",
"isAgriGuar": "true",
"isAgriLeading": "true",
"loanPurpose": "business",
"loanRate": "4.15",
"custName": "绿源农业合作社",
"idType": "统一社会信用代码",
"isInclusiveFinance": "true"
}, "发起流程-农业担保贷款")
# 测试 4: 个人质押贷款
test_api("POST", "/loanPricing/workflow/create", {
"orgCode": "931000",
"runType": "1",
"custIsn": "CUST20250119004",
"custType": "个人",
"guarType": "质押",
"applyAmt": "100000",
"loanPurpose": "consumer",
"collType": "二类",
"loanRate": "4.25",
"custName": "李四",
"idType": "身份证",
"isInclusiveFinance": "false"
}, "发起流程-个人客户质押贷款")
# 测试 5: 查询列表
test_api("GET", "/loanPricing/workflow/list?pageNum=1&pageSize=10", None, "查询流程列表-默认分页")
print()
print(f"{Colors.BLUE}【异常测试】{Colors.NC}")
# 测试 11: 客户内码为空
test_api("POST", "/loanPricing/workflow/create", {
"custType": "个人",
"guarType": "信用",
"applyAmt": "50000",
"loanRate": "4.35"
}, "异常测试-客户内码为空", 500)
# 测试 12: 贷款利率为空
test_api("POST", "/loanPricing/workflow/create", {
"custIsn": "TEST001",
"custType": "个人",
"guarType": "信用",
"applyAmt": "50000"
}, "异常测试-贷款利率为空", 500)
# 测试 13: 查询不存在的流程
test_api("GET", "/loanPricing/workflow/NOTEXIST123", None, "异常测试-查询不存在的流程", 500)
# 生成报告
print()
print(f"{Colors.YELLOW}[步骤 3] 测试结果统计{Colors.NC}")
print("-" * 35)
print()
pass_rate = int(PASSED_TESTS * 100 / TOTAL_TESTS) if TOTAL_TESTS > 0 else 0
print(f"总测试数: {TOTAL_TESTS}")
print(f"通过: {Colors.GREEN}{PASSED_TESTS}{Colors.NC}")
print(f"失败: {Colors.RED}{FAILED_TESTS}{Colors.NC}")
print(f"通过率: {pass_rate}%")
print()
print("详细测试结果:")
print("-" * 35)
for result in TEST_RESULTS:
if result.startswith(""):
print(f"{Colors.GREEN}{result}{Colors.NC}")
else:
print(f"{Colors.RED}{result}{Colors.NC}")
# 保存报告
report_file = f"api-test-report-{datetime.now().strftime('%Y%m%d%H%M%S')}.txt"
with open(report_file, "w", encoding="utf-8") as f:
f.write("利率定价流程 API 测试报告\n")
f.write("=" * 36 + "\n\n")
f.write(f"测试时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
f.write(f"测试环境: {BASE_URL}\n")
f.write(f"测试账号: admin\n\n")
f.write("测试统计\n")
f.write("-" * 10 + "\n")
f.write(f"总测试数: {TOTAL_TESTS}\n")
f.write(f"通过数: {PASSED_TESTS}\n")
f.write(f"失败数: {FAILED_TESTS}\n")
f.write(f"通过率: {pass_rate}%\n\n")
f.write("测试用例详情\n")
f.write("-" * 14 + "\n")
for result in TEST_RESULTS:
f.write(result + "\n")
print()
print(f"测试报告已保存到: {report_file}")
print_header("测试完成")
return 0 if FAILED_TESTS == 0 else 1
if __name__ == "__main__":
exit(main())