test_app.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. """
  2. 标准库匹配规则 - 实际调用测试
  3. 展示如何实际调用 StandardMatchingService 进行标准检查
  4. 使用说明:
  5. 1. MOCK_MODE = True: 使用模拟数据,无需数据库
  6. 2. MOCK_MODE = False: 使用真实数据库,需要确保 config/config.ini 配置正确
  7. """
  8. import sys
  9. import os
  10. # ==================== 配置区域 ====================
  11. # 设置为 True 使用 Mock 模式(无需数据库),False 使用真实数据库
  12. MOCK_MODE = False
  13. # ==================== 路径设置 ====================
  14. CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
  15. PROJECT_ROOT = os.path.dirname(os.path.dirname(CURRENT_DIR))
  16. sys.path.insert(0, PROJECT_ROOT)
  17. # 真实模式下需要修改工作目录以读取配置文件
  18. if not MOCK_MODE:
  19. os.chdir(PROJECT_ROOT)
  20. import asyncio
  21. import json
  22. from utils_test.standard_new_Test.standard_service import (
  23. StandardMatchingService,
  24. MatchResultCode
  25. )
  26. # ==================== 服务创建 ====================
  27. async def create_service():
  28. """创建并初始化服务实例"""
  29. if MOCK_MODE:
  30. print("[Mock 模式] 使用模拟数据,无需数据库连接")
  31. service = StandardMatchingService(db_pool=None)
  32. await service.initialize()
  33. return service
  34. else:
  35. print("[真实模式] 连接数据库并加载标准数据...")
  36. # 延迟导入,避免 Mock 模式下也需要安装依赖
  37. from foundation.database.base.sql.async_mysql_conn_pool import AsyncMySQLPool
  38. db_pool = AsyncMySQLPool()
  39. await db_pool.initialize()
  40. service = StandardMatchingService(db_pool=db_pool)
  41. await service.initialize()
  42. return service
  43. # ==================== 测试函数 ====================
  44. async def test_single_standard(service: StandardMatchingService):
  45. """测试单个标准检查"""
  46. print("\n" + "=" * 60)
  47. print("【测试1】单个标准检查")
  48. print("=" * 60)
  49. result = service.check_single(
  50. seq_no=1,
  51. standard_name="铁路桥涵设计规范",
  52. standard_number="TB 10002-2017"
  53. )
  54. print(f"\n序号: {result.seq_no}")
  55. print(f"原始标准: 《{result.original_name}》({result.original_number})")
  56. print(f"处理结果: {result.process_result}")
  57. print(f"状态码: {result.status_code}")
  58. print(f"结果消息: {result.final_result}")
  59. if result.substitute_number:
  60. print(f"替代标准: 《{result.substitute_name}》({result.substitute_number})")
  61. async def test_batch_check(service: StandardMatchingService):
  62. """测试批量标准检查 - 文档中的7个示例"""
  63. print("\n" + "=" * 60)
  64. print("【测试2】批量标准检查 - 文档中的7个示例")
  65. print("=" * 60)
  66. standards = [
  67. {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
  68. {"standard_name": "铁路工程抗震设计规范", "standard_number": "GB 50111-2006"},
  69. {"standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018"},
  70. {"standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2023"},
  71. {"standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016"},
  72. {"standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012"},
  73. {"standard_name": "电力高处作业防坠器", "standard_number": "DL/T 1147-2009"},
  74. # {"standard_name": "铁路桥涵设计", "standard_number": "TB 10002-2017"},
  75. # {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002"},
  76. # {"standard_name": "铁路桥涵设计", "standard_number": "TB 10002"},
  77. # {"standard_name": "《铁路桥涵设计规范》", "standard_number": " (TB 10002-2017)"},
  78. # {"standard_name": "《铁路桥涵设计规范》", "standard_number": "(TB 10002-2017)"},
  79. # {"standard_name": " 铁路桥涵设计规范 ", "standard_number": " TB 10002-2017 "},
  80. # {"standard_name": "铁路桥涵 设计规范", "standard_number": "TB 10002 -2017"},
  81. # {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002 -2017"},
  82. # {"standard_name": "铁路桥涵 设计规范", "standard_number": "TB 10002-2017"},
  83. ]
  84. results = service.check_standards(standards)
  85. print("\n检查结果汇总:")
  86. print("-" * 80)
  87. print(f"{'序号':<4} {'标准名称':<40} {'标准号':<20} {'状态':<12}")
  88. print("-" * 80)
  89. for r in results:
  90. print(f"{r.seq_no:<4} {r.original_name:<40} {r.original_number:<20} {r.status_code:<12}")
  91. print("\n" + "=" * 80)
  92. print("详细结果:")
  93. print("=" * 80)
  94. for r in results:
  95. print(f"\n【{r.seq_no}】{r.original_name}")
  96. print(f" 标准号: {r.original_number}")
  97. print(f" 状态: {r.process_result} ({r.status_code})")
  98. print(f" 结果: {r.final_result}")
  99. if r.substitute_number:
  100. print(f" ↳ 替代: 《{r.substitute_name}》({r.substitute_number})")
  101. async def test_various_cases(service: StandardMatchingService):
  102. """测试各种边界情况"""
  103. print("\n" + "=" * 60)
  104. print("【测试3】各种边界情况测试")
  105. print("=" * 60)
  106. test_cases = [
  107. {"name": "测试现行标准", "standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
  108. {"name": "测试被替代", "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016"},
  109. {"name": "测试废止无替代", "standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012"},
  110. {"name": "测试不匹配", "standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2023"},
  111. {"name": "测试不存在", "standard_name": "不存在的标准", "standard_number": "GB/T 99999-9999"},
  112. ]
  113. for case in test_cases:
  114. result = service.check_single(
  115. seq_no=1,
  116. standard_name=case["standard_name"],
  117. standard_number=case["standard_number"]
  118. )
  119. print(f"\n--- {case['name']} ---")
  120. print(f"输入: 《{result.original_name}》({result.original_number})")
  121. print(f"输出: [{result.status_code}] {result.final_result}")
  122. async def export_results_to_json(service: StandardMatchingService, filename: str = "standard_check_results.json"):
  123. """导出检查结果为JSON文件"""
  124. print("\n" + "=" * 60)
  125. print("【测试4】导出结果为JSON")
  126. print("=" * 60)
  127. standards = [
  128. {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
  129. {"standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018"},
  130. {"standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2023"},
  131. {"standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016"},
  132. ]
  133. results = service.check_standards(standards)
  134. output = []
  135. for r in results:
  136. output.append({
  137. "seq_no": r.seq_no,
  138. "original_name": r.original_name,
  139. "original_number": r.original_number,
  140. "substitute_name": r.substitute_name,
  141. "substitute_number": r.substitute_number,
  142. "process_result": r.process_result,
  143. "status_code": r.status_code,
  144. "final_result": r.final_result
  145. })
  146. with open(filename, "w", encoding="utf-8") as f:
  147. json.dump(output, f, ensure_ascii=False, indent=2)
  148. print(f"\n结果已导出到: {filename}")
  149. print(json.dumps(output, ensure_ascii=False, indent=2))
  150. # ==================== 主函数 ====================
  151. async def main():
  152. """主函数"""
  153. print("=" * 80)
  154. print("标准库匹配规则 - 实际调用测试(内存处理版本)")
  155. print("=" * 80)
  156. print(f"\n当前模式: {'Mock 测试模式(无需数据库)' if MOCK_MODE else '真实数据库模式'}")
  157. print("-" * 80)
  158. service = None
  159. try:
  160. # 创建并初始化服务
  161. service = await create_service()
  162. print(f"服务初始化成功! 数据已加载到内存\n")
  163. # 执行测试
  164. await test_single_standard(service)
  165. await test_batch_check(service)
  166. await test_various_cases(service)
  167. # await export_results_to_json(service) # 取消注释以测试JSON导出
  168. print("\n" + "=" * 80)
  169. print("所有测试执行完毕!")
  170. print("=" * 80)
  171. except Exception as e:
  172. print(f"\n错误: {e}")
  173. import traceback
  174. traceback.print_exc()
  175. if __name__ == "__main__":
  176. asyncio.run(main())