test_tools.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #!/usr/bin/env python3
  2. """
  3. 测试浏览器工具和终端工具的功能
  4. """
  5. import sys
  6. import os
  7. # 添加项目根目录到路径
  8. sys.path.insert(0, os.path.dirname(__file__))
  9. from src.tools.browser_tool import BrowserTool
  10. from src.tools.terminal_tool import TerminalTool
  11. from src.agents.config import TERMINAL_SECURITY_MODE
  12. def test_terminal_tool():
  13. """测试终端工具"""
  14. print("=" * 60)
  15. print("🧪 测试终端工具 (TerminalTool)")
  16. print("=" * 60)
  17. terminal = TerminalTool(security_mode=TERMINAL_SECURITY_MODE)
  18. print(f"安全模式: {TERMINAL_SECURITY_MODE}\n")
  19. # 测试用例
  20. test_cases = [
  21. {
  22. "name": "测试 pwd 命令",
  23. "input": "pwd",
  24. "expected": "应该返回当前工作目录"
  25. },
  26. {
  27. "name": "测试 ls 命令",
  28. "input": "ls",
  29. "expected": "应该列出当前目录文件"
  30. },
  31. {
  32. "name": "测试 echo 命令",
  33. "input": "echo Hello World",
  34. "expected": "应该输出 Hello World"
  35. },
  36. {
  37. "name": "测试 whoami 命令",
  38. "input": "whoami",
  39. "expected": "应该返回当前用户名"
  40. },
  41. {
  42. "name": "测试 date 命令",
  43. "input": "date",
  44. "expected": "应该返回当前日期时间"
  45. },
  46. {
  47. "name": "测试危险命令 (rm)",
  48. "input": "rm -rf /",
  49. "expected": "应该被安全拒绝"
  50. },
  51. {
  52. "name": "测试不在白名单的命令",
  53. "input": "python --version",
  54. "expected": "应该被拒绝(不在白名单)"
  55. }
  56. ]
  57. passed = 0
  58. failed = 0
  59. for i, test in enumerate(test_cases, 1):
  60. print(f"\n[{i}/{len(test_cases)}] {test['name']}")
  61. print(f"输入: {test['input']}")
  62. print(f"预期: {test['expected']}")
  63. try:
  64. result = terminal.run({"input": test['input']})
  65. print(f"结果: {result[:200]}...") # 只显示前200字符
  66. # 简单判断测试是否通过
  67. if "错误" in result or "拒绝" in result or "警告" in result:
  68. if "rm" in test['input'] or "python" in test['input']:
  69. print("✅ 测试通过(正确拒绝)")
  70. passed += 1
  71. else:
  72. print("❌ 测试失败(不应该被拒绝)")
  73. failed += 1
  74. else:
  75. if "rm" in test['input'] or "python" in test['input']:
  76. print("❌ 测试失败(应该被拒绝)")
  77. failed += 1
  78. else:
  79. print("✅ 测试通过")
  80. passed += 1
  81. except Exception as e:
  82. print(f"❌ 测试异常: {e}")
  83. failed += 1
  84. print("\n" + "=" * 60)
  85. print(f"终端工具测试结果: {passed} 通过, {failed} 失败")
  86. print("=" * 60)
  87. return passed, failed
  88. def test_browser_tool():
  89. """测试浏览器工具"""
  90. print("\n" + "=" * 60)
  91. print("🧪 测试浏览器工具 (BrowserTool)")
  92. print("=" * 60 + "\n")
  93. browser = BrowserTool()
  94. # 测试用例
  95. test_cases = [
  96. {
  97. "name": "测试简单搜索",
  98. "input": "Python",
  99. "expected": "应该返回搜索结果"
  100. },
  101. {
  102. "name": "测试中文搜索",
  103. "input": "人工智能",
  104. "expected": "应该返回中文搜索结果"
  105. },
  106. {
  107. "name": "测试空输入",
  108. "input": "",
  109. "expected": "应该返回错误提示"
  110. }
  111. ]
  112. passed = 0
  113. failed = 0
  114. for i, test in enumerate(test_cases, 1):
  115. print(f"\n[{i}/{len(test_cases)}] {test['name']}")
  116. print(f"输入: '{test['input']}'")
  117. print(f"预期: {test['expected']}")
  118. try:
  119. result = browser.run({"input": test['input']})
  120. if not test['input']:
  121. # 空输入测试
  122. if "错误" in result or "不能为空" in result:
  123. print("✅ 测试通过(正确检测到空输入)")
  124. passed += 1
  125. else:
  126. print("❌ 测试失败(应该检测到空输入)")
  127. failed += 1
  128. else:
  129. # 正常搜索测试
  130. if result and len(result) > 50 and ("错误" not in result or "失败" not in result):
  131. print(f"✅ 测试通过")
  132. print(f"结果预览: {result[:150]}...")
  133. passed += 1
  134. else:
  135. print(f"❌ 测试失败")
  136. print(f"结果: {result[:200]}")
  137. failed += 1
  138. except Exception as e:
  139. print(f"❌ 测试异常: {e}")
  140. import traceback
  141. traceback.print_exc()
  142. failed += 1
  143. print("\n" + "=" * 60)
  144. print(f"浏览器工具测试结果: {passed} 通过, {failed} 失败")
  145. print("=" * 60)
  146. return passed, failed
  147. def main():
  148. """主测试函数"""
  149. print("\n🚀 开始测试工具功能...\n")
  150. # 测试终端工具
  151. terminal_passed, terminal_failed = test_terminal_tool()
  152. # 测试浏览器工具
  153. browser_passed, browser_failed = test_browser_tool()
  154. # 总结
  155. print("\n" + "=" * 60)
  156. print("📊 测试总结")
  157. print("=" * 60)
  158. print(f"终端工具: {terminal_passed} 通过, {terminal_failed} 失败")
  159. print(f"浏览器工具: {browser_passed} 通过, {browser_failed} 失败")
  160. print(f"总计: {terminal_passed + browser_passed} 通过, {terminal_failed + browser_failed} 失败")
  161. print("=" * 60)
  162. if terminal_failed == 0 and browser_failed == 0:
  163. print("\n✅ 所有测试通过!工具可以正常使用。")
  164. return 0
  165. else:
  166. print("\n⚠️ 部分测试失败,请检查工具实现。")
  167. return 1
  168. if __name__ == "__main__":
  169. sys.exit(main())