test_training_data_apis.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 训练数据管理API测试脚本
  5. 用于测试新增的训练数据管理接口
  6. """
  7. import requests
  8. import json
  9. import sys
  10. # API基础URL
  11. BASE_URL = "http://localhost:8084"
  12. API_PREFIX = "/api/v0/training_data"
  13. def test_api(method: str, endpoint: str, data=None, expected_status=200):
  14. """测试API的通用函数"""
  15. url = f"{BASE_URL}{API_PREFIX}{endpoint}"
  16. try:
  17. if method == "GET":
  18. response = requests.get(url)
  19. elif method == "POST":
  20. response = requests.post(url, json=data, headers={'Content-Type': 'application/json'})
  21. elif method == "DELETE":
  22. response = requests.delete(url, json=data, headers={'Content-Type': 'application/json'})
  23. else:
  24. print(f"❌ 不支持的HTTP方法: {method}")
  25. return False
  26. print(f"📤 {method} {endpoint}")
  27. if data:
  28. print(f"📋 请求数据: {json.dumps(data, ensure_ascii=False, indent=2)}")
  29. print(f"📥 状态码: {response.status_code}")
  30. if response.status_code == expected_status:
  31. print("✅ 状态码正确")
  32. else:
  33. print(f"⚠️ 期望状态码: {expected_status}, 实际状态码: {response.status_code}")
  34. try:
  35. response_json = response.json()
  36. print(f"📄 响应: {json.dumps(response_json, ensure_ascii=False, indent=2)}")
  37. return True
  38. except:
  39. print(f"📄 响应: {response.text}")
  40. return False
  41. except requests.ConnectionError:
  42. print(f"❌ 连接失败: 请确保服务器运行在 {BASE_URL}")
  43. return False
  44. except Exception as e:
  45. print(f"❌ 请求失败: {str(e)}")
  46. return False
  47. def main():
  48. """主测试函数"""
  49. print("🚀 开始测试训练数据管理API...")
  50. print(f"🔗 服务器地址: {BASE_URL}")
  51. print("="*60)
  52. # 1. 测试统计API (GET)
  53. print("\n📊 测试统计API")
  54. test_api("GET", "/stats")
  55. # 2. 测试查询API (POST) - 基础查询
  56. print("\n🔍 测试查询API - 基础查询")
  57. test_api("POST", "/query", {
  58. "page": 1,
  59. "page_size": 10
  60. })
  61. # 3. 测试查询API (POST) - 带筛选
  62. print("\n🔍 测试查询API - 带筛选")
  63. test_api("POST", "/query", {
  64. "page": 1,
  65. "page_size": 5,
  66. "training_data_type": "sql",
  67. "search_keyword": "用户"
  68. })
  69. # 4. 测试创建API (POST) - 单条SQL记录
  70. print("\n➕ 测试创建API - 单条SQL记录")
  71. test_api("POST", "/create", {
  72. "data": {
  73. "training_data_type": "sql",
  74. "question": "查询所有测试用户",
  75. "sql": "SELECT * FROM users WHERE status = 'test'"
  76. }
  77. })
  78. # 5. 测试创建API (POST) - 批量记录
  79. print("\n➕ 测试创建API - 批量记录")
  80. test_api("POST", "/create", {
  81. "data": [
  82. {
  83. "training_data_type": "documentation",
  84. "content": "这是一个测试文档,用于说明用户表的结构和用途。"
  85. },
  86. {
  87. "training_data_type": "ddl",
  88. "ddl": "CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(100));"
  89. }
  90. ]
  91. })
  92. # 6. 测试创建API (POST) - SQL语法错误
  93. print("\n➕ 测试创建API - SQL语法错误")
  94. test_api("POST", "/create", {
  95. "data": {
  96. "training_data_type": "sql",
  97. "question": "测试错误SQL",
  98. "sql": "INVALID SQL SYNTAX"
  99. }
  100. }, expected_status=200) # 批量操作中的错误仍返回200,但results中会有错误信息
  101. # 6.1. 测试创建API (POST) - 危险SQL操作检查
  102. print("\n➕ 测试创建API - 危险SQL操作检查")
  103. test_api("POST", "/create", {
  104. "data": [
  105. {
  106. "training_data_type": "sql",
  107. "question": "测试UPDATE操作",
  108. "sql": "UPDATE users SET status = 'inactive' WHERE id = 1"
  109. },
  110. {
  111. "training_data_type": "sql",
  112. "question": "测试DELETE操作",
  113. "sql": "DELETE FROM users WHERE id = 1"
  114. },
  115. {
  116. "training_data_type": "sql",
  117. "question": "测试DROP操作",
  118. "sql": "DROP TABLE test_table"
  119. }
  120. ]
  121. }, expected_status=200) # 批量操作返回200,但会有错误信息
  122. # 7. 测试删除API (POST) - 不存在的ID
  123. print("\n🗑️ 测试删除API - 不存在的ID")
  124. test_api("POST", "/delete", {
  125. "ids": ["non-existent-id-1", "non-existent-id-2"],
  126. "confirm": True
  127. })
  128. # 8. 测试删除API (POST) - 缺少确认
  129. print("\n🗑️ 测试删除API - 缺少确认")
  130. test_api("POST", "/delete", {
  131. "ids": ["test-id"],
  132. "confirm": False
  133. }, expected_status=400)
  134. # 9. 测试参数验证 - 页码错误
  135. print("\n⚠️ 测试参数验证 - 页码错误")
  136. test_api("POST", "/query", {
  137. "page": 0,
  138. "page_size": 10
  139. }, expected_status=400)
  140. # 10. 测试参数验证 - 页面大小错误
  141. print("\n⚠️ 测试参数验证 - 页面大小错误")
  142. test_api("POST", "/query", {
  143. "page": 1,
  144. "page_size": 150
  145. }, expected_status=400)
  146. print(f"\n{'='*60}")
  147. print("🎯 测试完成!")
  148. print("\n📝 说明:")
  149. print("- ✅ 表示API响应正常")
  150. print("- ⚠️ 表示状态码不符合预期")
  151. print("- ❌ 表示连接或请求失败")
  152. print("\n💡 提示:")
  153. print("- 首次运行时可能没有训练数据,这是正常的")
  154. print("- 创建操作成功后,再次查询可以看到新增的数据")
  155. print("- 删除不存在的ID会返回成功,但failed_count会显示失败数量")
  156. if __name__ == "__main__":
  157. main()