test_outline_check.py 9.8 KB

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