#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
高校学科评估 MCP 服务器测试脚本
"""
import asyncio
import json
async def test_mcp_tools():
"""测试 MCP 工具函数"""
# 导入 MCP 服务器模块
from mcp_server import (
search_university,
search_discipline,
filter_by_grade,
browse_by_province,
university_ranking,
discipline_ranking,
strong_disciplines,
grade_analysis,
get_statistics
)
print("=" * 60)
print("🧪 开始测试高校学科评估 MCP 服务器")
print("=" * 60)
# 测试 1: 高校搜索
print("\n🏫 测试 1: 高校专业搜索")
print("-" * 40)
try:
result = await search_university(university_name="清华", page=1, per_page=10)
data = json.loads(result)
if data.get('status') == 'success':
university_data = data.get('data', {})
print(f"高校: {university_data.get('university', 'N/A')}")
print(f"学科总数: {university_data.get('total_disciplines', 0)}")
print(f"分页: {university_data.get('page', 1)}/{university_data.get('total_pages', 1)}")
print(f"本页返回: {len(university_data.get('disciplines', []))} 条")
print("等级分布:")
for grade, count in university_data.get('grade_summary', {}).items():
print(f" - {grade}: {count}")
print("✅ 高校搜索测试通过")
else:
print(f"❌ 返回状态异常: {data.get('status')}")
except Exception as e:
print(f"❌ 高校搜索测试失败: {e}")
# 测试 2: 学科查询
print("\n📚 测试 2: 学科信息查询")
print("-" * 40)
try:
result = await search_discipline(discipline_name="计算机", page=1, per_page=10)
data = json.loads(result)
if data.get('status') == 'success':
discipline_data = data.get('data', {})
print(f"学科: {discipline_data.get('discipline', 'N/A')}")
print(f"开设高校数: {discipline_data.get('total_universities', 0)}")
print(f"分页: {discipline_data.get('page', 1)}/{discipline_data.get('total_pages', 1)}")
print(f"本页返回: {len(discipline_data.get('universities', []))} 条")
print("等级分布:")
for grade, count in discipline_data.get('grade_distribution', {}).items():
print(f" - {grade}: {count}")
print("前 3 所高校:")
for uni in discipline_data.get('universities', [])[:3]:
print(f" - {uni.get('university', 'N/A')} ({uni.get('grade', 'N/A')})")
print("✅ 学科查询测试通过")
else:
print(f"❌ 返回状态异常: {data.get('status')}")
except Exception as e:
print(f"❌ 学科查询测试失败: {e}")
# 测试 3: 等级筛选
print("\n🎯 测试 3: 等级筛选查询")
print("-" * 40)
try:
result = await filter_by_grade(grades=["A+", "A"], page=1, per_page=50)
data = json.loads(result)
if data.get('status') == 'success':
grade_data = data.get('data', {})
print(f"查询等级: {grade_data.get('grades', [])}")
print(f"总学科数: {grade_data.get('total_count', 0)}")
print(f"分页: {grade_data.get('page', 1)}/{grade_data.get('total_pages', 1)}")
print("按等级分类:")
for grade, count in grade_data.get('by_grade', {}).items():
print(f" - {grade}: {count}")
print(f"本页返回: {grade_data.get('returned_count', 0)} 条")
print("✅ 等级筛选测试通过")
else:
print(f"❌ 返回状态异常: {data.get('status')}")
except Exception as e:
print(f"❌ 等级筛选测试失败: {e}")
# 测试 3b: 等级筛选 - 小写参数测试
print("\n🎯 测试 3b: 等级筛选查询(小写参数)")
print("-" * 40)
try:
result = await filter_by_grade(grades=["a+", "a-"], page=2, per_page=50)
data = json.loads(result)
if data.get('status') == 'success':
grade_data = data.get('data', {})
print(f"查询等级(小写): a+, a- -> 规范化后: {grade_data.get('grades', [])}")
print(f"第 {grade_data.get('page', 1)} 页,共 {grade_data.get('total_pages', 1)} 页")
print(f"返回: {grade_data.get('returned_count', 0)} 条")
print("✅ 小写参数测试通过")
else:
print(f"❌ 返回状态异常: {data.get('status')}")
except Exception as e:
print(f"❌ 小写参数测试失败: {e}")
# 测试 4: 地区浏览
print("\n🗺️ 测试 4: 地区浏览")
print("-" * 40)
try:
result = await browse_by_province(province="北京")
data = json.loads(result)
if data.get('status') == 'success':
province_data = data.get('data', {})
print(f"省份: {province_data.get('province', 'N/A')}")
print(f"高校总数: {province_data.get('universities_count', 0)}")
print(f"学科总数: {province_data.get('total_disciplines', 0)}")
print("前 3 所高校:")
for uni in province_data.get('universities', [])[:3]:
print(f" - {uni.get('name', 'N/A')}: {uni.get('total_disciplines', 0)} 个学科")
print("✅ 地区浏览测试通过")
else:
print(f"❌ 返回状态异常: {data.get('status')}")
except Exception as e:
print(f"❌ 地区浏览测试失败: {e}")
# 测试 5: 高校排行
print("\n🏆 测试 5: 高校排行榜")
print("-" * 40)
try:
result = await university_ranking(rank_by="a_plus", limit=10)
data = json.loads(result)
if data.get('status') == 'success':
ranking_data = data.get('data', {})
print(f"排序方式: {ranking_data.get('rank_description', 'N/A')}")
print(f"高校总数: {ranking_data.get('total_universities', 0)}")
print("前 5 所高校:")
for uni in ranking_data.get('rankings', [])[:5]:
print(f" {uni.get('rank', 'N/A')}. {uni.get('university', 'N/A')} - A+ 数: {uni.get('a_plus_count', 0)}")
print("✅ 高校排行测试通过")
else:
print(f"❌ 返回状态异常: {data.get('status')}")
except Exception as e:
print(f"❌ 高校排行测试失败: {e}")
# 测试 6: 学科排行
print("\n📊 测试 6: 学科排行榜")
print("-" * 40)
try:
result = await discipline_ranking(rank_by="universities", limit=10)
data = json.loads(result)
if data.get('status') == 'success':
ranking_data = data.get('data', {})
print(f"排序方式: {ranking_data.get('rank_description', 'N/A')}")
print(f"学科总数: {ranking_data.get('total_disciplines', 0)}")
print("前 5 个学科:")
for disc in ranking_data.get('rankings', [])[:5]:
print(f" {disc.get('rank', 'N/A')}. {disc.get('discipline', 'N/A')} - 高校数: {disc.get('total_universities', 0)}")
print("✅ 学科排行测试通过")
else:
print(f"❌ 返回状态异常: {data.get('status')}")
except Exception as e:
print(f"❌ 学科排行测试失败: {e}")
# 测试 7: 强势学科分析
print("\n💪 测试 7: 强势学科分析")
print("-" * 40)
try:
result = await strong_disciplines(university="北京大学", grades=["A+", "A", "A-"])
data = json.loads(result)
if data.get('status') == 'success':
strong_data = data.get('data', {})
print(f"范围: {strong_data.get('scope', 'N/A')}")
print(f"强势学科总数: {strong_data.get('total_strong_disciplines', 0)}")
print("等级分布:")
for grade, count in strong_data.get('grade_counts', {}).items():
print(f" - {grade}: {count}")
print("前 3 个学科:")
for disc_group in strong_data.get('disciplines', [])[:3]:
print(f" {disc_group.get('grade', 'N/A')} 等级:")
for disc in disc_group.get('disciplines_list', [])[:3]:
print(f" - {disc}")
print("✅ 强势学科分析测试通过")
else:
print(f"❌ 返回状态异常: {data.get('status')}")
except Exception as e:
print(f"❌ 强势学科分析测试失败: {e}")
# 测试 8: 等级分析
print("\n📈 测试 8: 评估等级分析")
print("-" * 40)
try:
result = await grade_analysis()
data = json.loads(result)
if data.get('status') == 'success':
grade_data = data.get('data', {})
print(f"总学科数: {grade_data.get('total_disciplines', 0)}")
print("等级分布:")
for grade, dist in grade_data.get('grade_distribution', {}).items():
print(f" - {grade}: {dist.get('count', 0)} ({dist.get('percentage', 0)}%)")
print("✅ 等级分析测试通过")
else:
print(f"❌ 返回状态异常: {data.get('status')}")
except Exception as e:
print(f"❌ 等级分析测试失败: {e}")
# 测试 9: 统计信息
print("\n📊 测试 9: 获取统计信息")
print("-" * 40)
try:
result = await get_statistics(group_by="所在省")
data = json.loads(result)
if data.get('status') == 'success':
stats_data = data.get('data', {})
print(f"总记录数: {stats_data.get('total_records', 0)}")
print(f"总高校数: {stats_data.get('total_universities', 0)}")
print(f"总学科数: {stats_data.get('total_disciplines', 0)}")
print("前 5 个省份统计:")
for stat in stats_data.get('statistics', [])[:5]:
print(f" - {stat.get(list(stat.keys())[0], 'N/A')}: 高校 {stat.get('高校数', 0)}, 学科 {stat.get('学科数', 0)}")
print("✅ 统计信息测试通过")
else:
print(f"❌ 返回状态异常: {data.get('status')}")
except Exception as e:
print(f"❌ 统计信息测试失败: {e}")
# 测试 10: 参数验证 - 无效的排序方式
print("\n❌ 测试 10: 无效的排序方式验证")
print("-" * 40)
try:
result = await university_ranking(rank_by="invalid_sort", limit=10)
data = json.loads(result)
if data.get('status') == 'error':
error_info = data.get('data', {})
print(f"错误类型: {error_info.get('error', 'N/A')}")
print(f"有效选项: {error_info.get('valid_options', [])}")
print("✅ 参数验证测试通过 - 正确识别无效参数并返回有效选项")
else:
print(f"❌ 应该返回错误但返回了成功")
except Exception as e:
print(f"❌ 参数验证测试失败: {e}")
# 测试 11: 参数验证 - 无效的等级参数
print("\n❌ 测试 11: 无效的等级参数验证")
print("-" * 40)
try:
result = await filter_by_grade(grades=["X", "Y"], page=1, per_page=50)
data = json.loads(result)
if data.get('status') == 'error':
error_info = data.get('data', {})
print(f"错误类型: {error_info.get('error', 'N/A')}")
print(f"无效的参数: {error_info.get('invalid_grades', [])}")
print(f"有效的等级: {error_info.get('valid_grades', [])}")
print("✅ 等级参数验证测试通过 - 列出了所有有效选项")
else:
print(f"❌ 应该返回错误但返回了成功")
except Exception as e:
print(f"❌ 等级参数验证测试失败: {e}")
# 测试 12: 错误处理 - 学科查询异常信息
print("\n❌ 测试 12: 学科查询错误处理验证")
print("-" * 40)
try:
result = await search_discipline(discipline_name="", page=1, per_page=10)
data = json.loads(result)
if data.get('status') == 'error':
error_info = data.get('data', {})
print(f"错误类型: {error_info.get('error', 'N/A')}")
if 'hint' in error_info:
print(f"调试建议: {error_info.get('hint', 'N/A')}")
print("✅ 错误处理测试通过 - 返回了详细的错误信息")
else:
print(f"❌ 应该返回错误但返回了成功")
except Exception as e:
print(f"❌ 错误处理测试失败: {e}")
# 测试 13: 无结果查询 - 检查清晰的错误反馈
print("\n❌ 测试 13: 无结果查询反馈验证")
print("-" * 40)
try:
result = await search_discipline(discipline_name="不存在的学科xyz", page=1, per_page=10)
data = json.loads(result)
if data.get('status') == 'not_found':
error_info = data.get('data', {})
print(f"错误类型: {error_info.get('error', 'N/A')}")
print(f"友好提示: {error_info.get('hint', 'N/A')}")
if 'sample_disciplines' in error_info:
print(f"可用学科示例: {error_info.get('sample_disciplines', [])[:3]}")
print("✅ 无结果反馈测试通过 - 返回了清晰的错误信息和建议")
else:
print(f"❌ 应该返回not_found但返回了: {data.get('status')}")
except Exception as e:
print(f"❌ 无结果反馈测试失败: {e}")
# 测试 14: 分页参数验证
print("\n❌ 测试 14: 分页参数验证")
print("-" * 40)
try:
result = await search_university(university_name="清华", page=-1, per_page=10)
data = json.loads(result)
if data.get('status') == 'error':
error_info = data.get('data', {})
print(f"错误类型: {error_info.get('error', 'N/A')}")
print(f"提示: {error_info.get('hint', 'N/A')}")
print("✅ 分页参数验证通过 - 正确拒绝了无效参数")
else:
print(f"❌ 应该返回错误但返回了: {data.get('status')}")
except Exception as e:
print(f"❌ 分页参数验证失败: {e}")
print("\n" + "=" * 60)
print("🎉 所有测试完成!")
print("=" * 60)
if __name__ == "__main__":
asyncio.run(test_mcp_tools())