123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #!/usr/bin/env python3
- """
- Custom React Agent API 测试脚本
- 测试基本的API功能,包括:
- 1. 健康检查
- 2. 普通问答
- 3. SQL查询
- 4. 错误处理
- 运行前请确保API服务已启动:
- python api.py
- """
- import asyncio
- import aiohttp
- import json
- import sys
- from typing import Dict, Any
- API_BASE_URL = "http://localhost:8000"
- class APITester:
- """API测试类"""
-
- def __init__(self, base_url: str = API_BASE_URL):
- self.base_url = base_url
- self.session = None
-
- async def __aenter__(self):
- self.session = aiohttp.ClientSession()
- return self
-
- async def __aexit__(self, exc_type, exc_val, exc_tb):
- if self.session:
- await self.session.close()
-
- async def test_health_check(self) -> bool:
- """测试健康检查"""
- print("🔍 测试健康检查...")
- try:
- async with self.session.get(f"{self.base_url}/health") as response:
- if response.status == 200:
- data = await response.json()
- print(f" ✅ 健康检查通过: {data}")
- return True
- else:
- print(f" ❌ 健康检查失败: HTTP {response.status}")
- return False
- except Exception as e:
- print(f" ❌ 健康检查异常: {e}")
- return False
-
- async def test_chat_api(self, question: str, user_id: str = "test_user",
- thread_id: str = None) -> Dict[str, Any]:
- """测试聊天API"""
- print(f"\n💬 测试问题: {question}")
-
- payload = {
- "question": question,
- "user_id": user_id
- }
- if thread_id:
- payload["thread_id"] = thread_id
-
- try:
- async with self.session.post(
- f"{self.base_url}/api/chat",
- json=payload,
- headers={"Content-Type": "application/json"}
- ) as response:
-
- response_data = await response.json()
-
- print(f" 📊 HTTP状态: {response.status}")
- print(f" 📋 响应代码: {response_data.get('code')}")
- print(f" 🎯 成功状态: {response_data.get('success')}")
-
- if response_data.get('success'):
- data = response_data.get('data', {})
- print(f" 💡 回答: {data.get('response', '')[:100]}...")
-
- if 'sql' in data:
- print(f" 🗄️ SQL: {data['sql'][:100]}...")
-
- if 'records' in data:
- records = data['records']
- print(f" 📈 数据行数: {records.get('total_row_count', 0)}")
-
- meta = data.get('react_agent_meta', {})
- print(f" 🔧 使用工具: {meta.get('tools_used', [])}")
- print(f" 🆔 会话ID: {meta.get('thread_id', '')}")
-
- return response_data
- else:
- error = response_data.get('error', '未知错误')
- print(f" ❌ 请求失败: {error}")
- return response_data
-
- except Exception as e:
- print(f" ❌ 请求异常: {e}")
- return {"success": False, "error": str(e)}
-
- async def run_test_suite(self):
- """运行完整的测试套件"""
- print("🚀 开始API测试套件")
- print("=" * 50)
-
- # 1. 健康检查
- health_ok = await self.test_health_check()
- if not health_ok:
- print("❌ 健康检查失败,停止测试")
- return
-
- # 2. 普通问答测试
- await self.test_chat_api("你好,你是谁?")
-
- # 3. SQL查询测试(假设有相关数据)
- result1 = await self.test_chat_api("请查询服务区的收入情况")
-
- # 4. 上下文对话测试
- thread_id = None
- if result1.get('success'):
- thread_id = result1.get('data', {}).get('react_agent_meta', {}).get('thread_id')
-
- if thread_id:
- await self.test_chat_api("请详细解释一下", thread_id=thread_id)
-
- # 5. 错误处理测试
- await self.test_chat_api("") # 空问题
- await self.test_chat_api("a" * 3000) # 超长问题
-
- print("\n" + "=" * 50)
- print("✅ 测试套件完成")
- async def main():
- """主函数"""
- print("Custom React Agent API 测试工具")
- print("请确保API服务已在 http://localhost:8000 启动")
- print()
-
- # 检查是否要运行特定测试
- if len(sys.argv) > 1:
- question = " ".join(sys.argv[1:])
- async with APITester() as tester:
- await tester.test_chat_api(question)
- else:
- # 运行完整测试套件
- async with APITester() as tester:
- await tester.run_test_suite()
- if __name__ == "__main__":
- asyncio.run(main())
|