test_delete_api.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. """
  2. 测试数据指标删除 API 接口
  3. """
  4. import requests
  5. import json
  6. # 配置
  7. BASE_URL = "http://localhost:5500"
  8. API_ENDPOINT = f"{BASE_URL}/api/data_metric/delete"
  9. def test_delete_metric(metric_id):
  10. """
  11. 测试删除指定ID的数据指标
  12. Args:
  13. metric_id: 指标节点ID
  14. """
  15. print(f"\n{'='*80}")
  16. print(f"测试删除数据指标: ID={metric_id}")
  17. print(f"{'='*80}")
  18. # 准备请求数据
  19. payload = {"id": metric_id}
  20. headers = {"Content-Type": "application/json"}
  21. try:
  22. # 发送删除请求
  23. print(f"\n发送请求: POST {API_ENDPOINT}")
  24. print(f"请求数据: {json.dumps(payload, ensure_ascii=False)}")
  25. response = requests.post(API_ENDPOINT, json=payload, headers=headers)
  26. print(f"\n响应状态码: {response.status_code}")
  27. print(f"响应内容:")
  28. # 解析响应
  29. result = response.json()
  30. print(json.dumps(result, ensure_ascii=False, indent=2))
  31. # 判断结果
  32. if result.get("code") == 200:
  33. print(f"\n✅ 删除成功!")
  34. print(f" 消息: {result['data']['message']}")
  35. return True
  36. else:
  37. print(f"\n❌ 删除失败!")
  38. print(f" 错误: {result.get('msg', '未知错误')}")
  39. return False
  40. except requests.exceptions.ConnectionError:
  41. print(f"\n❌ 连接失败: 无法连接到服务器 {BASE_URL}")
  42. print(f" 请确保 Flask 应用正在运行")
  43. return False
  44. except Exception as e:
  45. print(f"\n❌ 请求异常: {str(e)}")
  46. return False
  47. def test_invalid_cases():
  48. """测试各种异常情况"""
  49. print(f"\n{'='*80}")
  50. print("测试异常情况")
  51. print(f"{'='*80}")
  52. test_cases = [
  53. {
  54. "name": "缺少ID参数",
  55. "payload": {},
  56. "expected": "指标ID不能为空"
  57. },
  58. {
  59. "name": "无效的ID类型(字符串)",
  60. "payload": {"id": "invalid"},
  61. "expected": "指标ID必须为整数"
  62. },
  63. {
  64. "name": "不存在的节点ID",
  65. "payload": {"id": 999999},
  66. "expected": "数据指标节点不存在"
  67. }
  68. ]
  69. for i, test_case in enumerate(test_cases, 1):
  70. print(f"\n--- 测试 {i}: {test_case['name']} ---")
  71. try:
  72. response = requests.post(
  73. API_ENDPOINT,
  74. json=test_case['payload'],
  75. headers={"Content-Type": "application/json"}
  76. )
  77. result = response.json()
  78. print(f"请求数据: {json.dumps(test_case['payload'], ensure_ascii=False)}")
  79. print(f"响应: {json.dumps(result, ensure_ascii=False, indent=2)}")
  80. # 检查是否包含预期错误信息
  81. msg = str(result.get('msg', ''))
  82. if test_case['expected'] in msg:
  83. print(f"✅ 测试通过 - 返回了预期的错误信息")
  84. else:
  85. print(f"⚠️ 测试未完全匹配 - 预期包含: {test_case['expected']}")
  86. except Exception as e:
  87. print(f"❌ 测试异常: {str(e)}")
  88. def test_full_workflow():
  89. """测试完整的工作流:查询 -> 删除 -> 验证"""
  90. print(f"\n{'='*80}")
  91. print("完整工作流测试")
  92. print(f"{'='*80}")
  93. # 注意:这里需要先有一个真实的指标ID
  94. # 实际使用时,应该先创建一个测试指标,然后删除它
  95. print("\n提示: 完整工作流测试需要以下步骤:")
  96. print("1. 创建一个测试数据指标")
  97. print("2. 记录返回的指标ID")
  98. print("3. 使用该ID调用删除接口")
  99. print("4. 验证指标已被删除")
  100. print("\n当前示例仅演示删除步骤,请根据实际情况修改测试ID")
  101. def main():
  102. """主测试函数"""
  103. print(f"\n{'#'*80}")
  104. print("# 数据指标删除 API 测试")
  105. print(f"# 服务器: {BASE_URL}")
  106. print(f"# 接口: {API_ENDPOINT}")
  107. print(f"{'#'*80}")
  108. # 测试1: 尝试删除一个可能存在的节点
  109. # 注意:请根据实际情况修改这个ID
  110. test_metric_id = 1378
  111. print("\n⚠️ 注意: 请确保测试ID是可以被删除的测试数据!")
  112. print(f"⚠️ 当前测试ID: {test_metric_id}")
  113. user_input = input("\n是否继续测试删除操作? (y/n): ")
  114. if user_input.lower() == 'y':
  115. test_delete_metric(test_metric_id)
  116. else:
  117. print("已跳过删除测试")
  118. # 测试2: 测试异常情况
  119. test_invalid_cases()
  120. # 测试3: 完整工作流说明
  121. test_full_workflow()
  122. print(f"\n{'='*80}")
  123. print("测试完成!")
  124. print(f"{'='*80}\n")
  125. if __name__ == "__main__":
  126. try:
  127. main()
  128. except KeyboardInterrupt:
  129. print("\n\n测试被用户中断")
  130. except Exception as e:
  131. print(f"\n\n测试失败: {str(e)}")
  132. import traceback
  133. traceback.print_exc()