test_tools.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. """HelloAgents 自定义工具测试。"""
  2. import json
  3. from src.tools import (
  4. REQUIRED_REPORT_HEADINGS,
  5. ReportQualityTool,
  6. RequirementAuditTool,
  7. create_tool_registry,
  8. )
  9. def test_requirement_audit_returns_structured_coverage() -> None:
  10. response = json.loads(RequirementAuditTool().run(
  11. {
  12. "requirement_text": (
  13. "面向社区居民做报名功能,希望一个月上线,"
  14. "预计在线人数 100 人,并保存报名数据。"
  15. )
  16. }
  17. ))
  18. assert response["ok"] is True
  19. assert 0 < response["coverage_percent"] <= 100
  20. assert "目标用户" in response["covered_dimensions"]
  21. assert isinstance(response["clarifying_questions"], list)
  22. def test_requirement_audit_rejects_empty_input() -> None:
  23. response = json.loads(RequirementAuditTool().run({"requirement_text": " "}))
  24. assert response["ok"] is False
  25. assert response["error_code"] == "INVALID_PARAM"
  26. def test_requirement_audit_accepts_hello_agents_simple_input_alias() -> None:
  27. response = json.loads(
  28. RequirementAuditTool().run({"input": "面向居民做一个活动报名工具"})
  29. )
  30. assert response["ok"] is True
  31. assert "目标用户" in response["covered_dimensions"]
  32. def test_requirement_audit_marks_unknown_dimensions_missing() -> None:
  33. response = json.loads(
  34. RequirementAuditTool().run({"requirement_text": "做一个小程序"})
  35. )
  36. assert "验收标准" in response["missing_dimensions"]
  37. assert len(response["clarifying_questions"]) > 0
  38. def test_report_quality_scores_complete_report() -> None:
  39. report = "# 报告\n\n" + "\n\n".join(
  40. f"## {heading}\n\n待确认内容" for heading in REQUIRED_REPORT_HEADINGS
  41. )
  42. response = json.loads(ReportQualityTool().run({"report_text": report}))
  43. assert response["ok"] is True
  44. assert response["score"] == 100
  45. assert response["missing_headings"] == []
  46. def test_report_quality_reports_missing_headings() -> None:
  47. response = json.loads(
  48. ReportQualityTool().run(
  49. {"report_text": "# 报告\n\n## 1. 需求摘要\n\n只有摘要"}
  50. )
  51. )
  52. assert response["score"] < 100
  53. assert "8. 下一步行动" in response["missing_headings"]
  54. def test_report_quality_rejects_empty_input() -> None:
  55. response = json.loads(ReportQualityTool().run({"report_text": " "}))
  56. assert response["ok"] is False
  57. assert response["error_code"] == "INVALID_PARAM"
  58. def test_report_quality_does_not_reward_empty_pending_heading() -> None:
  59. report = "# 报告\n\n" + "\n\n".join(
  60. f"## {heading}" for heading in REQUIRED_REPORT_HEADINGS
  61. )
  62. response = json.loads(ReportQualityTool().run({"input": report}))
  63. assert response["score"] == 50
  64. assert response["has_pending_markers"] is False
  65. assert response["empty_headings"] == list(REQUIRED_REPORT_HEADINGS)
  66. def test_registry_contains_both_custom_tools() -> None:
  67. registry = create_tool_registry()
  68. assert registry.get_tool("requirement_audit") is not None
  69. assert registry.get_tool("report_quality_check") is not None