test_outline_check.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import asyncio
  4. import sys
  5. import os
  6. from pathlib import Path
  7. current_dir = Path(__file__).parent.absolute()
  8. project_root = current_dir.parent.parent
  9. os.chdir(str(project_root))
  10. from core.construction_review.component.ai_review_engine import AIReviewEngine
  11. class TestOutlineCheck:
  12. """大纲审查功能测试类"""
  13. def __init__(self):
  14. self.ai_review_engine = None
  15. def setup(self):
  16. """设置测试环境"""
  17. try:
  18. self.ai_review_engine = AIReviewEngine()
  19. print("AI审查引擎初始化成功")
  20. except Exception as e:
  21. print(f"AI审查引擎初始化失败: {str(e)}")
  22. def get_test_outline_data(self):
  23. """获取测试大纲数据"""
  24. return {
  25. "outline": {
  26. "chapters": [
  27. {
  28. "index": 1,
  29. "title": "第一章编制依据",
  30. "page": "5",
  31. "original": "第一章编制依据......5",
  32. "subsections": [
  33. {
  34. "title": "一、编制依据",
  35. "page": "5",
  36. "level": 2,
  37. "original": "一、编制依据......5"
  38. },
  39. {
  40. "title": "二、编制原则",
  41. "page": "7",
  42. "level": 2,
  43. "original": "二、编制原则......7"
  44. },
  45. {
  46. "title": "三、编制范围",
  47. "page": "7",
  48. "level": 2,
  49. "original": "三、编制范围......7"
  50. }
  51. ]
  52. },
  53. {
  54. "index": 2,
  55. "title": "第二章工程概况",
  56. "page": "9",
  57. "original": "第二章工程概况......9",
  58. "subsections": [
  59. {
  60. "title": "一、项目背景",
  61. "page": "9",
  62. "level": 2,
  63. "original": "一、项目背景......9"
  64. },
  65. {
  66. "title": "二、工程特点",
  67. "page": "10",
  68. "level": 2,
  69. "original": "二、工程特点......10"
  70. }
  71. ]
  72. },
  73. {
  74. "index": 3,
  75. "title": "第三章施工计划",
  76. "page": "15",
  77. "original": "第三章施工计划......15",
  78. "subsections": [
  79. {
  80. "title": "一、施工进度计划",
  81. "page": "15",
  82. "level": 2,
  83. "original": "一、施工进度计划......15"
  84. }
  85. ]
  86. }
  87. ],
  88. "total_chapters": 3
  89. }
  90. }
  91. def get_empty_outline_data(self):
  92. """获取空大纲测试数据"""
  93. return {
  94. "outline": {
  95. "chapters": [],
  96. "total_chapters": 0
  97. }
  98. }
  99. def get_malformed_outline_data(self):
  100. """获取格式错误的大纲测试数据"""
  101. return {
  102. "outline": {
  103. "chapters": [
  104. {
  105. "title": "第一章编制依据"
  106. # 缺少必要字段
  107. }
  108. ]
  109. }
  110. }
  111. async def test_outline_check_method(self):
  112. """测试outline_check方法的大纲提取功能"""
  113. print("\n=== 测试outline_check方法 ===")
  114. if not self.ai_review_engine:
  115. print("AI审查引擎未初始化,跳过测试")
  116. return False
  117. test_data = self.get_test_outline_data()
  118. print("输入大纲章节数量:", len(test_data.get('outline', {}).get('chapters', [])))
  119. try:
  120. # 调用outline_check方法
  121. result = await self.ai_review_engine.outline_check(
  122. trace_id_idx="test_outline_001",
  123. outline_content=test_data,
  124. state={},
  125. stage_name="大纲审查测试"
  126. )
  127. print("outline_check方法调用成功")
  128. print(f"返回结果类型: {type(result)}")
  129. # 检查返回结果并输出提取的大纲内容
  130. if result and isinstance(result, dict):
  131. print("返回结果的键:", list(result.keys()))
  132. # 输出整体大纲
  133. if 'overall_outline' in result:
  134. print("\n=== 整体大纲提取结果 ===")
  135. print(result['overall_outline'])
  136. print(f"整体大纲长度: {len(result['overall_outline'])}")
  137. # 输出详细大纲
  138. if 'detailed_outline' in result:
  139. print("\n=== 详细大纲提取结果 ===")
  140. print(result['overall_outline'])
  141. print(f"详细大纲长度: {len(result['detailed_outline'])}")
  142. # 输出审查结果信息
  143. if 'review_result' in result:
  144. print(f"\n=== 审查结果信息 ===")
  145. print(f"审查结果类型: {type(result['review_result'])}")
  146. if result['review_result']:
  147. print(f"审查结果键: {list(result['review_result'].keys()) if isinstance(result['review_result'], dict) else '非字典类型'}")
  148. else:
  149. print("审查结果为None")
  150. else:
  151. print("注意: 返回结果为None或非字典类型")
  152. print("PASS outline_check方法测试通过")
  153. return True
  154. except Exception as e:
  155. print(f"FAIL outline_check方法测试失败: {str(e)}")
  156. return False
  157. def test_outline_check_sync(self):
  158. """同步版本的outline_check测试"""
  159. print("\n=== 测试outline_check同步调用 ===")
  160. try:
  161. # 使用asyncio.run来运行异步方法
  162. result = asyncio.run(self.test_outline_check_method())
  163. return result
  164. except Exception as e:
  165. print(f"FAIL 同步调用测试失败: {str(e)}")
  166. return False
  167. def test_empty_outline(self):
  168. """测试空大纲处理"""
  169. print("\n=== 测试空大纲处理 ===")
  170. test_data = self.get_empty_outline_data()
  171. chapters = test_data.get('outline', {}).get('chapters', [])
  172. # 模拟提取逻辑
  173. overall_outline = ""
  174. for chapter in chapters:
  175. overall_outline += f"{chapter['title']} (页码: {chapter['page']})\n"
  176. detailed_outline = ""
  177. for chapter in chapters:
  178. detailed_outline += f"\n=== {chapter['title']} ===\n"
  179. detailed_outline += f"页码: {chapter['page']}\n"
  180. print("空大纲提取结果:")
  181. print(f"整体大纲长度: {len(overall_outline)}")
  182. print(f"详细大纲长度: {len(detailed_outline)}")
  183. success = len(overall_outline) == 0 and len(detailed_outline) == 0
  184. if success:
  185. print("PASS 空大纲处理测试通过")
  186. else:
  187. print("FAIL 空大纲处理测试失败")
  188. return success
  189. def test_malformed_outline(self):
  190. """测试格式错误大纲的处理"""
  191. print("\n=== 测试格式错误大纲处理 ===")
  192. test_data = self.get_malformed_outline_data()
  193. chapters = test_data.get('outline', {}).get('chapters', [])
  194. try:
  195. # 模拟提取逻辑,应该能处理缺失字段
  196. overall_outline = ""
  197. for chapter in chapters:
  198. title = chapter.get('title', '未知标题')
  199. page = chapter.get('page', '未知页码')
  200. overall_outline += f"{title} (页码: {page})\n"
  201. print("格式错误大纲处理结果:")
  202. print(overall_outline)
  203. print("PASS 格式错误大纲处理测试通过")
  204. return True
  205. except Exception as e:
  206. print(f"FAIL 格式错误大纲处理测试失败: {str(e)}")
  207. return False
  208. def run_all_tests(self):
  209. """运行所有测试"""
  210. print("开始大纲审查功能测试")
  211. print("=" * 50)
  212. # 设置测试环境
  213. self.setup()
  214. # 运行测试
  215. test_results = []
  216. # 主要测试:调用outline_check方法
  217. test_results.append(self.test_outline_check_sync())
  218. # 辅助测试:测试边界情况
  219. test_results.append(self.test_empty_outline())
  220. test_results.append(self.test_malformed_outline())
  221. # 统计测试结果
  222. passed = sum(test_results)
  223. total = len(test_results)
  224. print("\n" + "=" * 50)
  225. print(f"测试完成: {passed}/{total} 通过")
  226. if passed == total:
  227. print("PASS 所有测试通过")
  228. else:
  229. print(f"FAIL {total - passed} 个测试失败")
  230. return passed == total
  231. def main():
  232. """主函数"""
  233. tester = TestOutlineCheck()
  234. success = tester.run_all_tests()
  235. sys.exit(0 if success else 1)
  236. if __name__ == "__main__":
  237. main()