Files
hzdyjs/test/SQL语法错误修复验证.py
T
2025-07-16 18:11:31 +08:00

198 lines
6.1 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
学生信息管理SQL语法错误修复验证脚本
验证修复后的XML映射文件是否能正确处理查询请求
日期: 2025-01-15
修复内容: 解决 WHERE...AND ORDER BY 语法错误
第二次修复: 正确区分WHERE条件和ORDER BY子句的处理
"""
import requests
import json
import sys
from datetime import datetime
# 配置信息
BASE_URL = "http://localhost:8080"
LOGIN_URL = f"{BASE_URL}/auth/login"
STUDENT_LIST_URL = f"{BASE_URL}/xg-xx/studentInfo/list"
# 登录配置
LOGIN_DATA = {
"username": "admin",
"password": "admin123",
"clientId": "e5cd7e4891bf95d1d19206ce24a7b32e",
"grantType": "password"
}
# 请求头配置
HEADERS = {
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"referer": "http://localhost",
"clientid": "e5cd7e4891bf95d1d19206ce24a7b32e"
}
def print_test_header(title):
"""打印测试标题"""
print(f"\n{'='*60}")
print(f"🧪 {title}")
print(f"{'='*60}")
def print_result(success, message, details=None):
"""打印测试结果"""
status = "✅ 成功" if success else "❌ 失败"
print(f"{status}: {message}")
if details:
print(f"详情: {details}")
def login():
"""登录获取token"""
print_test_header("步骤1: 用户登录")
try:
response = requests.post(LOGIN_URL, json=LOGIN_DATA, headers=HEADERS, timeout=10)
print(f"登录请求状态码: {response.status_code}")
if response.status_code == 200:
data = response.json()
if data.get("code") == 200:
token = data.get("data", {}).get("access_token")
if token:
print_result(True, "登录成功", f"Token: {token[:20]}...")
return token
else:
print_result(False, "登录响应中没有token", data)
else:
print_result(False, "登录失败", data.get("msg", "未知错误"))
else:
print_result(False, f"登录请求失败", f"状态码: {response.status_code}")
except Exception as e:
print_result(False, "登录异常", str(e))
return None
def test_student_list_query(token, test_name, params=None):
"""测试学生列表查询"""
print_test_header(f"步骤2: {test_name}")
# 设置认证头
test_headers = HEADERS.copy()
test_headers["Authorization"] = f"Bearer {token}"
try:
# 发送查询请求
response = requests.get(
STUDENT_LIST_URL,
params=params or {},
headers=test_headers,
timeout=10
)
print(f"查询请求状态码: {response.status_code}")
print(f"查询参数: {params or '无'}")
if response.status_code == 200:
data = response.json()
if data.get("code") == 200:
rows = data.get("rows", [])
total = data.get("total", 0)
print_result(True, f"查询成功", f"返回 {len(rows)} 条记录,总计 {total} 条")
return True, data
else:
print_result(False, "查询失败", data.get("msg", "未知错误"))
return False, data
else:
print_result(False, f"查询请求失败", f"状态码: {response.status_code}")
try:
error_data = response.json()
print(f"错误详情: {error_data}")
except:
print(f"响应内容: {response.text[:200]}...")
return False, None
except Exception as e:
print_result(False, "查询异常", str(e))
return False, None
def main():
"""主函数"""
print("🔍 学生信息管理SQL语法错误修复验证")
print(f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"目标: 验证 WHERE...AND ORDER BY 语法错误修复")
print(f"修复版本: 第二次修复 - 正确区分WHERE条件和ORDER BY子句")
# 1. 登录获取token
token = login()
if not token:
print("\n❌ 登录失败,无法继续测试")
sys.exit(1)
# 2. 测试无查询条件的列表查询(最容易触发SQL语法错误)
success1, data1 = test_student_list_query(
token,
"无查询条件的列表查询(最容易触发SQL语法错误)",
{"pageNum": 1, "pageSize": 10}
)
# 3. 测试有查询条件的搜索
success2, data2 = test_student_list_query(
token,
"有查询条件的搜索",
{"pageNum": 1, "pageSize": 10, "name": "测试"}
)
# 4. 测试排序功能
success3, data3 = test_student_list_query(
token,
"排序功能测试",
{"pageNum": 1, "pageSize": 10, "orderByColumn": "create_time", "isAsc": "desc"}
)
# 5. 测试复合查询
success4, data4 = test_student_list_query(
token,
"复合查询测试",
{
"pageNum": 1,
"pageSize": 10,
"gender": "1",
"orderByColumn": "student_no",
"isAsc": "asc"
}
)
# 总结测试结果
print_test_header("测试结果总结")
tests = [
("无查询条件列表查询", success1),
("有查询条件搜索", success2),
("排序功能测试", success3),
("复合查询测试", success4)
]
passed = sum(1 for _, success in tests if success)
total = len(tests)
print(f"📊 测试统计: {passed}/{total} 通过")
for test_name, success in tests:
status = "✅" if success else "❌"
print(f"{status} {test_name}")
if passed == total:
print(f"\n🎉 所有测试通过!SQL语法错误修复成功!")
print("✅ WHERE...AND ORDER BY 语法错误已解决")
print("✅ 学生信息管理页面搜索功能恢复正常")
else:
print(f"\n⚠️ 部分测试失败,需要进一步排查问题")
return passed == total
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)