gen_test_case.py 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """生成实验室安全智能监测与管控中心大屏测试用例 XLS 文件"""
  4. import xlwt
  5. import os
  6. # ─────────────────────────────────────────────────────────────────────────────
  7. # 测试用例数据:(模块名, 测试场景, 测试类型, 前置条件, 测试操作, 预期结果, 优先级, 设计方法)
  8. # 使用单引号,避免内部双引号冲突
  9. # ─────────────────────────────────────────────────────────────────────────────
  10. TEST_CASES = [
  11. # ━━ 一、顶部导航栏 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  12. ('顶部导航栏', '实时时钟格式与每秒刷新', '正常场景',
  13. '系统正常运行,网络连接正常,页面已完整加载',
  14. '观察顶部导航栏左侧时钟区域',
  15. '以 HH:MM:SS 格式正确显示(如 17:19:36),每秒刷新一次且无闪烁',
  16. 'P0', '场景法'),
  17. ('顶部导航栏', '日期与星期显示正确性', '正常场景',
  18. '系统正常运行,页面已完整加载',
  19. '对比左侧日期星期与系统本地时间',
  20. '日期与星期与系统本地时间完全一致',
  21. 'P1', '等价类划分'),
  22. ('顶部导航栏', '中间区域LOGO与标题水平居中对齐', '正常场景',
  23. '系统正常运行,页面已完整加载',
  24. '检查中间区域:LOGO图标、单位名称、竖向分隔线、大标题的排列与对齐',
  25. '四项元素水平居中对齐,无错位、无溢出',
  26. 'P1', '场景法'),
  27. ('顶部导航栏', '右侧天气信息三项同行显示', '正常场景',
  28. '系统正常运行,网络连接正常',
  29. '观察右侧天气区域显示内容',
  30. '正常显示城市/天气状况、温度、AQI,三项同行排列',
  31. 'P1', '等价类划分'),
  32. ('顶部导航栏', 'border-beam动态流动效果渲染', '正常场景',
  33. '系统正常运行,页面已完整加载',
  34. '观察导航栏边框动效',
  35. '路径沿边框连续流动,效果正常渲染',
  36. 'P2', '场景法'),
  37. ('顶部导航栏', '网络断开时天气区域兜底展示', '异常场景',
  38. '系统正常运行,页面已加载;断开网络连接',
  39. '断网后观察右侧天气区域',
  40. '显示 -- 或暂无数据兜底,无空白区域或 JS 报错',
  41. 'P0', '错误推测法'),
  42. ('顶部导航栏', '系统时区配置错误时时钟仍读取本地时间', '异常场景',
  43. '将操作系统时区配置为非本地时区',
  44. '观察时钟显示值',
  45. '时钟仍读取本地时间,不出现 UTC 偏移显示',
  46. 'P1', '错误推测法'),
  47. ('顶部导航栏', '跨日00:00:00日期星期同步切换', '边界场景',
  48. '系统持续运行至接近午夜',
  49. '在 00:00:00 前后观察日期与星期变化',
  50. '日期与星期同步切换,不出现跨日延迟',
  51. 'P0', '边界值分析'),
  52. ('顶部导航栏', '跨年元旦零点年份正确切换', '边界场景',
  53. '系统运行至 12 月 31 日 23:59:59',
  54. '观察 00:00:00 时刻年份变化',
  55. '年份正确切换至新年',
  56. 'P1', '边界值分析'),
  57. ('顶部导航栏', '标题字符串极长时中间区域不溢出', '边界场景',
  58. '系统正常运行,页面已加载',
  59. '将标题设为超长字符串,观察中间区域布局',
  60. '中间区域不溢出至左右两侧,布局完整',
  61. 'P2', '边界值分析'),
  62. # ━━ 二、实验室基本情况统计 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  63. ('实验室基本情况统计', 'SVG圆弧仪表图形正确渲染圆心数字一致', '正常场景',
  64. '系统正常运行,数据接口正常返回',
  65. '观察左侧 SVG 仪表图形区域(占 40%)',
  66. '圆弧仪表图形正确渲染,圆心显示 128 间,与接口数据一致',
  67. 'P0', '场景法'),
  68. ('实验室基本情况统计', '分级比例色条顺序与宽度正确', '正常场景',
  69. '系统正常运行,数据接口正常返回',
  70. '观察仪表图下方分级色条',
  71. 'I~IV 级依次显示红橙黄蓝四色,色块宽度与各级数量占比一致',
  72. 'P1', '等价类划分'),
  73. ('实验室基本情况统计', '环形图各扇区颜色与标注完整性', '正常场景',
  74. '系统正常运行,数据接口正常返回',
  75. '观察右侧(60%)环形图及外侧引线标注',
  76. '各扇区颜色与分级色规一致,外侧引线标注级别名称、数量(间)、百分比三项齐全',
  77. 'P0', '场景法'),
  78. ('实验室基本情况统计', '环形图圆心总数与仪表图数字保持一致', '正常场景',
  79. '系统正常运行,数据接口正常返回',
  80. '对比环形图圆心数字与左侧仪表图数字',
  81. '两者均显示 128,保持一致',
  82. 'P0', '等价类划分'),
  83. ('实验室基本情况统计', '状态徽章三栏数量之和等于实验室总数', '正常场景',
  84. '系统正常运行,数据接口正常返回',
  85. '查看下部三栏使用、异常、空闲数量,计算总和',
  86. '使用数+异常数+空闲数=实验室总数(128),逻辑自洽',
  87. 'P0', '场景法'),
  88. ('实验室基本情况统计', '某分级数量为0时扇区不渲染无孤立标签', '异常场景',
  89. '系统正常运行,某分级数量后台配置为 0',
  90. '观察环形图对应扇区及引线标注',
  91. '对应扇区不渲染,不出现 0间/0% 孤立标签',
  92. 'P1', '错误推测法'),
  93. ('实验室基本情况统计', '数据接口超时图表降级显示暂无数据', '异常场景',
  94. '模拟数据接口超时或报错',
  95. '观察图表区域响应',
  96. '图表区域显示暂无数据占位块,不触发 JS 异常',
  97. 'P0', '错误推测法'),
  98. ('实验室基本情况统计', '所有实验室属同一分级时环形图渲染完整圆形', '边界场景',
  99. '后台配置所有实验室归属同一分级',
  100. '观察环形图渲染结果',
  101. '环形图渲染为完整圆形,无多余间隔',
  102. 'P1', '边界值分析'),
  103. ('实验室基本情况统计', '实验室总数为1时图表渲染不塌陷', '边界场景',
  104. '后台配置实验室总数为 1',
  105. '观察 SVG 仪表图与环形图渲染',
  106. '两图均正常渲染,不出现布局塌陷',
  107. 'P2', '边界值分析'),
  108. # ━━ 三、实验室安全分级统计 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  109. ('实验室安全分级统计', '堆叠柱状图图例颜色与图形一一对应', '正常场景',
  110. '系统正常运行,数据接口正常返回',
  111. '观察图例区域',
  112. '显示 I~IV 级,颜色红橙黄蓝与图形颜色一一对应',
  113. 'P1', '场景法'),
  114. ('实验室安全分级统计', '默认一屏显示6个柱子X轴含名称与总数', '正常场景',
  115. '系统正常运行,X 轴数据>=6 个',
  116. '观察初始加载时 X 轴柱子数量',
  117. '一屏展示 6 个柱子,X 轴每柱下方同时显示二级单位名称及实验室总数',
  118. 'P0', '场景法'),
  119. ('实验室安全分级统计', '超过6个数据时每5秒自动向左滚动1个单位', '正常场景',
  120. '系统正常运行,X 轴数据>6 个',
  121. '等待 5 秒观察图表滚动行为',
  122. '每隔 5 秒自动向左滚动 1 个 X 轴单位,动画流畅',
  123. 'P0', '场景法'),
  124. ('实验室安全分级统计', '滚动到最后数据后自动循环从第一个开始', '正常场景',
  125. '系统正常运行,X 轴数据>6 个,已滚动至最后一个',
  126. '等待下次滚动',
  127. '自动循环从第一个数据重新开始',
  128. 'P1', '场景法'),
  129. ('实验室安全分级统计', 'X轴标签过长时自动截断省略号悬停可见完整', '异常场景',
  130. '后台配置某二级单位名称字符数超长',
  131. '观察 X 轴标签显示与悬停效果',
  132. '标签自动截断并显示省略号,悬停可见完整名称,不遮挡相邻柱子',
  133. 'P1', '错误推测法'),
  134. ('实验室安全分级统计', '某单位实验室总数为0时柱子高度为0', '异常场景',
  135. '后台配置某二级单位实验室总数为 0',
  136. '观察对应柱子渲染及 X 轴总数显示',
  137. '对应柱子不渲染或高度为 0,X 轴总数显示 0',
  138. 'P1', '错误推测法'),
  139. ('实验室安全分级统计', 'X轴数据恰好6个时不触发自动滚动', '边界场景',
  140. '后台配置 X 轴数据恰好为 6 个',
  141. '等待超过 5 秒观察是否滚动',
  142. '不触发自动滚动,图表静态展示',
  143. 'P1', '边界值分析'),
  144. ('实验室安全分级统计', 'X轴数据为1个时单柱居中不触发滚动', '边界场景',
  145. '后台配置 X 轴数据仅 1 个',
  146. '观察图表展示',
  147. '单柱居中显示,不触发滚动',
  148. 'P2', '边界值分析'),
  149. ('实验室安全分级统计', 'X轴数据为7个时滚动1步即循环', '边界场景',
  150. '后台配置 X 轴数据为 7 个',
  151. '等待滚动并观察循环行为',
  152. '滚动仅 1 步即循环,展示正常',
  153. 'P2', '边界值分析'),
  154. # ━━ 四、实验室进入人数统计及走势 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  155. ('实验室进入人数统计及走势', '翻牌器同行显示今日总进入与当前实验人数', '正常场景',
  156. '系统正常运行,数据接口正常返回',
  157. '观察翻牌器区域布局与数值',
  158. '今日总进入人数与当前正在实验人数在同一行显示,字号突出',
  159. 'P0', '场景法'),
  160. ('实验室进入人数统计及走势', '数据更新时翻牌器触发逐位滚动动效', '正常场景',
  161. '系统正常运行,等待数据更新',
  162. '触发数据更新,观察翻牌动效',
  163. '翻牌器从旧数值逐位滚动至新数值,动画正确触发',
  164. 'P1', '场景法'),
  165. ('实验室进入人数统计及走势', '折线图展示0到24点9个时段两条折线颜色区分', '正常场景',
  166. '系统正常运行,数据接口正常返回',
  167. '观察折线图区域',
  168. '正确展示 0~24 点 9 个分隔时段的进入人数与当前实验人数两条折线,颜色区分明确,图例正确',
  169. 'P0', '场景法'),
  170. ('实验室进入人数统计及走势', '今日进入人数为0时翻牌器显示0不出现NaN', '异常场景',
  171. '后台配置今日进入人数为 0',
  172. '观察翻牌器显示',
  173. '翻牌器显示 0,不出现空白或 NaN',
  174. 'P0', '错误推测法'),
  175. ('实验室进入人数统计及走势', '当前实验人数异常超出总进入人数时标红警示', '异常场景',
  176. '后台配置当前实验人数大于今日总进入人数',
  177. '观察异常数值旁的警示展示',
  178. '对应数值旁标红警示,提示数据异常',
  179. 'P1', '错误推测法'),
  180. ('实验室进入人数统计及走势', '23:59时折线图最后时段数据无断档', '边界场景',
  181. '系统运行至 23:59',
  182. '观察折线图最后时段数据',
  183. '最后时段数据正确填入,不出现数据断档',
  184. 'P1', '边界值分析'),
  185. ('实验室进入人数统计及走势', '人数位数增加时翻牌器自动扩展不截断', '边界场景',
  186. '后台配置人数从 3 位数跳变为 4 位数',
  187. '观察翻牌器位数变化',
  188. '翻牌器自动扩展位数,不出现数字截断',
  189. 'P1', '边界值分析'),
  190. # ━━ 五、智能环境感知应用设备统计 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  191. ('智能环境感知应用设备统计', '顶部各类设备图标在线离线数量正确标注', '正常场景',
  192. '系统正常运行,数据接口正常返回',
  193. '观察顶部各类设备图标旁标注数量',
  194. '每类图标旁分别标注在线数量与离线数量',
  195. 'P0', '场景法'),
  196. ('智能环境感知应用设备统计', '速度仪表盘在线率展示与指针位置对应', '正常场景',
  197. '系统正常运行,数据接口正常返回',
  198. '观察左侧速度仪表盘图表',
  199. '正确渲染设备在线率百分比(示例 94.5%),指针位置与数值对应',
  200. 'P0', '场景法'),
  201. ('智能环境感知应用设备统计', '右侧3加2布局五类设备总数正确显示', '正常场景',
  202. '系统正常运行,数据接口正常返回',
  203. '观察右侧 3+2 布局区域',
  204. '上 3 下 2 居中对齐,五类设备总数均正确显示',
  205. 'P1', '场景法'),
  206. ('智能环境感知应用设备统计', '设备在线率计算值与展示值一致', '正常场景',
  207. '系统正常运行,数据接口正常返回',
  208. '计算在线率=在线数 除以(在线数+离线数),与展示值对比',
  209. '展示值与计算值完全一致',
  210. 'P0', '等价类划分'),
  211. ('智能环境感知应用设备统计', '所有设备均离线时在线率显示0%指针最低', '异常场景',
  212. '后台配置所有设备均离线',
  213. '观察在线率显示和仪表盘指针',
  214. '在线率显示 0%,指针指向最低档位,不出现 NaN 或空白',
  215. 'P0', '错误推测法'),
  216. ('智能环境感知应用设备统计', '某类设备数量为0时图标标注显示0布局不塌陷', '异常场景',
  217. '后台配置某类设备数量为 0',
  218. '观察对应图标数量标注与布局',
  219. '标注显示 0,布局不塌陷',
  220. 'P1', '错误推测法'),
  221. ('智能环境感知应用设备统计', '在线率恰好50%时仪表盘指针居中', '边界场景',
  222. '后台配置在线数等于离线数',
  223. '观察仪表盘指针位置',
  224. '指针指向表盘正中位置',
  225. 'P2', '边界值分析'),
  226. ('智能环境感知应用设备统计', '设备总数为1且在线时在线率显示100%满格', '边界场景',
  227. '后台配置设备总数为 1 且在线',
  228. '观察在线率显示和仪表盘',
  229. '在线率显示 100%,仪表盘满格',
  230. 'P2', '边界值分析'),
  231. # ━━ 六、实验室设备分类及使用统计 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  232. ('实验室设备分类及使用统计', '环形图设备分类分布及图例四项完整', '正常场景',
  233. '系统正常运行,数据接口正常返回',
  234. '观察上部环形图及右侧图例',
  235. '各分类分布正确,右侧图例含圆形色块、名称、数量(台)、占比四项完整',
  236. 'P0', '场景法'),
  237. ('实验室设备分类及使用统计', '三统计卡片数值格式正确使用率含百分号', '正常场景',
  238. '系统正常运行,数据接口正常返回',
  239. '观察下部上方三网格统计卡片',
  240. '设备总数、使用总时长、设备使用率数值格式正确(使用率含 % 单位)',
  241. 'P0', '等价类划分'),
  242. ('实验室设备分类及使用统计', '设备使用率计算逻辑验证', '正常场景',
  243. '系统正常运行,数据接口正常返回',
  244. '计算设备使用率=使用数 除以(使用数+空闲数),与展示值对比',
  245. '展示值与计算值一致',
  246. 'P0', '等价类划分'),
  247. ('实验室设备分类及使用统计', '左侧饼图标题青色发光字体样式视觉紧贴顶部', '正常场景',
  248. '系统正常运行,数据接口正常返回',
  249. '观察左侧设备状态统计饼图标题样式',
  250. '标题居中,青色发光字体,字间距 3px,底部有细分隔线,视觉紧贴饼图顶部',
  251. 'P1', '场景法'),
  252. ('实验室设备分类及使用统计', '左侧饼图三类扇区外侧引线标注无侧边图例', '正常场景',
  253. '系统正常运行,数据接口正常返回',
  254. '观察左侧饼图(正常、维修、报废)',
  255. '扇区外侧引线标注名称+数量+占比,无侧边图例',
  256. 'P0', '场景法'),
  257. ('实验室设备分类及使用统计', '右侧饼图使用状态两类引线标注正确', '正常场景',
  258. '系统正常运行,数据接口正常返回',
  259. '观察右侧使用状态统计饼图(使用、空闲)',
  260. '扇区外侧引线标注正确,无侧边图例',
  261. 'P0', '场景法'),
  262. ('实验室设备分类及使用统计', '设备数量逻辑自洽双等式验证', '正常场景',
  263. '系统正常运行,数据接口正常返回',
  264. '验证:正常+维修+报废=设备总数;使用数+空闲数=正常状态数',
  265. '两个逻辑等式均成立',
  266. 'P0', '等价类划分'),
  267. ('实验室设备分类及使用统计', '某分类设备数量为0时图表不出现NaN或标注漂移', '异常场景',
  268. '后台配置某分类设备数量为 0',
  269. '观察环形图和饼图对应扇区',
  270. '对应扇区不渲染,不出现 NaN 或零值引线标注漂移',
  271. 'P1', '错误推测法'),
  272. ('实验室设备分类及使用统计', '设备使用率100%时右侧饼图空闲扇区为0不渲染错误', '异常场景',
  273. '后台配置设备使用率为 100%',
  274. '观察右侧饼图空闲扇区',
  275. '空闲扇区为 0,不出现渲染错误',
  276. 'P1', '错误推测法'),
  277. ('实验室设备分类及使用统计', '只有1种设备分类时环形图渲染完整圆形', '边界场景',
  278. '后台配置只有 1 种设备分类',
  279. '观察环形图渲染',
  280. '渲染为完整圆形',
  281. 'P2', '边界值分析'),
  282. ('实验室设备分类及使用统计', '设备总数为0时统计卡片显示0饼图显示暂无数据', '边界场景',
  283. '后台配置设备总数为 0',
  284. '观察三统计卡片和两饼图',
  285. '三卡片均显示 0,两饼图区域显示暂无数据',
  286. 'P1', '边界值分析'),
  287. # ━━ 七、化学品库存动态统计 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  288. ('化学品库存动态统计', '饼图两类化学品外侧引线标注三项完整', '正常场景',
  289. '系统正常运行,数据接口正常返回',
  290. '观察饼图两扇区及外侧引线标注',
  291. '管控与非管控两类扇区外侧引线标注分类名称+数量(L)+占比,无侧边图例',
  292. 'P0', '场景法'),
  293. ('化学品库存动态统计', '右侧统计区四项数据完整且配色正确', '正常场景',
  294. '系统正常运行,数据接口正常返回',
  295. '观察右侧统计区各项展示',
  296. '正确展示总量(L)、管控类总量及占比、非管控类总量及占比、总类目数,配色与 SVG 进度环均正确',
  297. 'P0', '场景法'),
  298. ('化学品库存动态统计', '管控类红色系配色SVG进度环与占比一致', '正常场景',
  299. '系统正常运行,数据接口正常返回',
  300. '观察管控类统计区配色和 SVG 进度环',
  301. '使用红色系配色,SVG 圆弧进度环进度与占比一致',
  302. 'P1', '场景法'),
  303. ('化学品库存动态统计', '管控类加非管控类等于存量总量逻辑自洽', '正常场景',
  304. '系统正常运行,数据接口正常返回',
  305. '验证:管控类数量+非管控类数量=存量化学品总量',
  306. '逻辑等式成立',
  307. 'P0', '等价类划分'),
  308. ('化学品库存动态统计', '管控类化学品数量为0时饼图不渲染进度环归零', '异常场景',
  309. '后台配置管控类化学品数量为 0',
  310. '观察饼图扇区、SVG 进度环及占比',
  311. '饼图该扇区不渲染,SVG 进度环进度为 0,占比显示 0%',
  312. 'P0', '错误推测法'),
  313. ('化学品库存动态统计', '数据接口异常时统计区显示占位SVG进度环归零', '异常场景',
  314. '模拟数据接口异常',
  315. '观察右侧各统计项和 SVG 进度环',
  316. '各统计项显示 -- 占位,SVG 进度环归零',
  317. 'P0', '错误推测法'),
  318. ('化学品库存动态统计', '存量总量极大时自动换算不出现溢出截断', '边界场景',
  319. '后台配置存量总量超过 999999L',
  320. '观察右侧统计区数值显示',
  321. '自动换算或保留合理精度,不出现溢出截断',
  322. 'P1', '边界值分析'),
  323. ('化学品库存动态统计', '两类各占50%时饼图平分引线不重叠', '边界场景',
  324. '后台配置两类各占 50%',
  325. '观察饼图引线排列',
  326. '饼图平分且两侧引线不重叠',
  327. 'P2', '边界值分析'),
  328. # ━━ 八、实时监控 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  329. ('实时监控', '搜索框输入关键词树状图实时过滤', '正常场景',
  330. '系统正常运行,建筑树状图已加载',
  331. '在搜索框输入楼栋/楼层关键词',
  332. '树状图实时过滤展示匹配节点',
  333. 'P0', '场景法'),
  334. ('实时监控', '二级单位下拉筛选后对应节点高亮展开', '正常场景',
  335. '系统正常运行,建筑树状图已加载',
  336. '打开二级单位下拉框并选择某单位',
  337. '树状图对应单位节点高亮展开',
  338. 'P1', '场景法'),
  339. ('实时监控', '建筑树状图四级层级可独立展开折叠', '正常场景',
  340. '系统正常运行,建筑树状图已加载',
  341. '逐级点击院区→楼栋→楼层→房间节点展开/折叠',
  342. '四级层级正确展示,每级可独立展开/折叠',
  343. 'P0', '流程分析法'),
  344. ('实时监控', '点击楼层节点面包屑自动更新为三级路径', '正常场景',
  345. '系统正常运行,建筑树状图已加载',
  346. '点击某楼层节点',
  347. '右侧面包屑自动更新为:院区 > 楼栋名称 > 楼层名称',
  348. 'P0', '场景法'),
  349. ('实时监控', '右侧9宫格3x3排列16:9比例边框均匀', '正常场景',
  350. '系统正常运行,摄像头数据已加载',
  351. '观察右侧 9 宫格区域',
  352. '3x3 排列,16:9 比例,画面边框与间距均匀',
  353. 'P0', '场景法'),
  354. ('实时监控', '第一个摄像头显示智能标识和危险检测框', '正常场景',
  355. '系统正常运行,摄像头数据已加载',
  356. '观察左上角第一个摄像头画面',
  357. '显示智能摄像头标识,含危险行为检测框(矩形框标注),检测框随模拟数据更新位置',
  358. 'P1', '场景法'),
  359. ('实时监控', '翻页按钮切换摄像头组面包屑同步更新', '正常场景',
  360. '系统正常运行,摄像头总数>9',
  361. '点击上一页/下一页翻页按钮',
  362. '切换至对应组(每组 9 个),面包屑与摄像头信息同步更新',
  363. 'P0', '场景法'),
  364. ('实时监控', '搜索无匹配时树状图显示无匹配结果提示', '异常场景',
  365. '系统正常运行,建筑树状图已加载',
  366. '输入无匹配的搜索关键词',
  367. '树状图显示无匹配结果提示,不出现空白区域',
  368. 'P1', '错误推测法'),
  369. ('实时监控', '某摄像头Canvas加载失败时对应格子显示信号丢失', '异常场景',
  370. '系统正常运行,模拟某摄像头加载失败',
  371. '观察对应格子显示',
  372. '显示信号丢失占位,不影响其他 8 个格子正常显示',
  373. 'P0', '错误推测法'),
  374. ('实时监控', '当前楼层无摄像头时9宫格全部显示暂无信号', '异常场景',
  375. '选择无摄像头的楼层',
  376. '观察 9 宫格区域',
  377. '9 宫格全部显示暂无信号占位格',
  378. 'P1', '错误推测法'),
  379. ('实时监控', '搜索框清空后树状图恢复完整展示', '异常场景',
  380. '搜索框已有内容',
  381. '清空搜索框',
  382. '树状图恢复完整展示',
  383. 'P1', '场景法'),
  384. ('实时监控', '树状图仅1个根节点时折叠展开按钮不显示或置灰', '边界场景',
  385. '后台配置树状图仅 1 个根节点',
  386. '观察折叠/展开按钮状态',
  387. '折叠/展开按钮不显示或置灰',
  388. 'P2', '边界值分析'),
  389. ('实时监控', '摄像头总数恰好9个时下一页按钮置灰', '边界场景',
  390. '后台配置摄像头总数为 9',
  391. '观察翻页按钮状态',
  392. '下一页按钮置灰不可点击',
  393. 'P1', '边界值分析'),
  394. ('实时监控', '摄像头总数10个时第2页仅显示1个画面其余占位', '边界场景',
  395. '后台配置摄像头总数为 10',
  396. '翻至第 2 页观察画面数量',
  397. '第 2 页仅显示 1 个画面,其余 8 个格子显示占位',
  398. 'P1', '边界值分析'),
  399. ('实时监控', '摄像头总数0个时9宫格全占位翻页按钮均置灰', '边界场景',
  400. '后台配置摄像头总数为 0',
  401. '观察 9 宫格和翻页按钮',
  402. '9 宫格全部显示占位,翻页按钮均置灰',
  403. 'P1', '边界值分析'),
  404. # ━━ 九、实验环境安全智能感知 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  405. ('实验环境安全智能感知', '实验室条目由下向上自动滚动流畅无卡顿', '正常场景',
  406. '系统正常运行,实验室条目已加载',
  407. '观察条目列表滚动行为',
  408. '由下向上自动滚动,流畅无卡顿',
  409. 'P0', '场景法'),
  410. ('实验环境安全智能感知', '每个条目完整显示名称单位传感器图标实时数值', '正常场景',
  411. '系统正常运行,数据接口正常返回',
  412. '观察每个实验室条目内容',
  413. '正确显示实验室名称(房号)-二级单位、传感器图标组、实时数值(温度、湿度、TVOC、CO2、O2等)',
  414. 'P0', '场景法'),
  415. ('实验环境安全智能感知', '传感器超阈值时条目红色高亮并显示报警图标', '正常场景',
  416. '系统正常运行,某传感器数据后台配置超出阈值',
  417. '观察对应实验室条目显示',
  418. '条目整体触发红色渐变高亮效果,对应数值旁显示报警图标',
  419. 'P0', '场景法'),
  420. ('实验环境安全智能感知', '异常条目触发全屏预警弹窗自动弹出', '正常场景',
  421. '系统正常运行,传感器数据超出阈值',
  422. '观察是否弹出全屏预警弹窗',
  423. '全屏预警弹窗自动弹出',
  424. 'P0', '场景法'),
  425. ('实验环境安全智能感知', '传感器全部离线时数值显示横杠不触发误报警', '异常场景',
  426. '后台配置某实验室传感器全部离线',
  427. '观察该条目各传感器数值与报警图标',
  428. '各传感器数值显示 --,不触发误报警,不渲染报警图标',
  429. 'P0', '错误推测法'),
  430. ('实验环境安全智能感知', '数据刷新超时时页面不卡死数值保持最后有效数据', '异常场景',
  431. '模拟数据刷新超时',
  432. '观察页面响应和数值显示',
  433. '页面不卡死,数值保持最后一次有效数据并显示更新时间戳',
  434. 'P0', '错误推测法'),
  435. ('实验环境安全智能感知', '条目超100条时滚动帧率不低于30FPS', '边界场景',
  436. '后台配置实验室条目数量超过 100 条',
  437. '观察滚动帧率',
  438. '滚动性能不出现明显卡顿(FPS 不低于 30)',
  439. 'P1', '边界值分析'),
  440. ('实验环境安全智能感知', '传感器数值恰好等于阈值时明确触发或不触发报警', '边界场景',
  441. '后台配置传感器数值恰好等于阈值',
  442. '观察是否触发报警',
  443. '明确触发或不触发报警,验证临界值判断逻辑(>= 还是 >)',
  444. 'P0', '边界值分析'),
  445. ('实验环境安全智能感知', '滚动至最后一条后列表循环回第一条无空白帧', '边界场景',
  446. '系统正常运行,条目列表持续滚动',
  447. '等待列表滚动至最后一条后观察',
  448. '列表循环从第一条重新开始,不出现空白帧',
  449. 'P1', '边界值分析'),
  450. # ━━ 十、实验室实时风险预警 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  451. ('实验室实时风险预警', '预警列表按时间倒序轮播最新在最顶部', '正常场景',
  452. '系统正常运行,本月有预警记录',
  453. '观察预警列表排序',
  454. '按时间倒序轮播,最新一条始终在最顶部',
  455. 'P0', '场景法'),
  456. ('实验室实时风险预警', '应急风险预警条目含警报标识琥珀色字体及三项信息', '正常场景',
  457. '系统正常运行,有应急风险预警记录',
  458. '观察应急风险预警条目',
  459. '含应急标识,字体颜色琥珀/橙色高亮,包含实验室名称、异常传感器名称及值、预警时间',
  460. 'P0', '场景法'),
  461. ('实验室实时风险预警', '危化品违规带离预警含危化品标识及正确信息', '正常场景',
  462. '系统正常运行,有危化品违规带离记录',
  463. '观察危化品违规带离预警条目',
  464. '含危化品标识,包含实验室名称、违规带离描述、预警时间',
  465. 'P0', '场景法'),
  466. ('实验室实时风险预警', '两类计数器数值与列表条数完全一致', '正常场景',
  467. '系统正常运行,有预警记录',
  468. '统计列表中两类预警数量,对比标题栏计数器',
  469. '两类计数器数值与列表中对应类型历史通知条数完全一致',
  470. 'P0', '等价类划分'),
  471. ('实验室实时风险预警', '本月无预警记录时列表显示占位两类计数器显示0', '异常场景',
  472. '后台配置本月无任何预警记录',
  473. '观察列表和计数器',
  474. '列表显示暂无预警记录,两类计数器均显示 0',
  475. 'P0', '错误推测法'),
  476. ('实验室实时风险预警', '预警超1000条时滚动不卡顿不影响其他模块', '异常场景',
  477. '后台配置预警通知数量超过 1000 条',
  478. '观察滚动性能和其他模块渲染',
  479. '滚动不出现性能卡顿,不影响其他模块正常渲染',
  480. 'P1', '错误推测法'),
  481. ('实验室实时风险预警', '同一实验室同一秒触发两类预警各自独立计数', '边界场景',
  482. '模拟同一实验室同一秒内触发两类预警',
  483. '观察两条通知显示与计数器',
  484. '两条通知独立显示,时间戳一致但均正确计入各自计数器',
  485. 'P1', '边界值分析'),
  486. ('实验室实时风险预警', '跨月数据排序正确不混入当月计数', '边界场景',
  487. '系统运行至月底最后一秒',
  488. '观察跨月前后通知排序和计数',
  489. '跨月数据不混入当月计数,排序正确',
  490. 'P1', '边界值分析'),
  491. # ━━ 十一、全屏预警弹窗 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  492. ('全屏预警弹窗', '传感器超阈值时弹窗自动弹出覆盖视口z-index最高', '正常场景',
  493. '系统正常运行,传感器数据超出阈值',
  494. '观察全屏预警弹窗是否弹出',
  495. '弹窗自动弹出,覆盖整个视口,z-index 高于所有大屏内容层',
  496. 'P0', '场景法'),
  497. ('全屏预警弹窗', '弹窗整体呈科幻红色报警样式与大屏形成对比', '正常场景',
  498. '系统正常运行,弹窗已触发',
  499. '观察弹窗整体视觉风格',
  500. '红色渐变、闪烁光效,与深蓝大屏形成强对比',
  501. 'P1', '场景法'),
  502. ('全屏预警弹窗', '弹窗左侧Canvas900x700右侧正确显示异常详情', '正常场景',
  503. '系统正常运行,弹窗已触发',
  504. '观察弹窗左侧 Canvas 区域和右侧信息',
  505. '左侧 Canvas 模拟区域 900x700px,对应触发预警实验室;右侧正确显示实验室名称、异常传感器名称、当前值、超限阈值',
  506. 'P0', '场景法'),
  507. ('全屏预警弹窗', '底部三按钮完整显示颜色样式正确', '正常场景',
  508. '系统正常运行,弹窗已触发',
  509. '观察底部三个按钮',
  510. '稍后处理(灰色)、确认处理(蓝色)、应急疏散(琥珀色)均完整显示',
  511. 'P0', '场景法'),
  512. ('全屏预警弹窗', '点击确认处理弹窗关闭预警标记已处理不再重复弹出', '正常场景',
  513. '弹窗已触发',
  514. '点击确认处理按钮',
  515. '弹窗关闭,对应预警条目标记为已处理,不再触发同一条预警弹窗',
  516. 'P0', '场景法'),
  517. ('全屏预警弹窗', '点击稍后处理弹窗关闭预警保持未处理可二次触发', '正常场景',
  518. '弹窗已触发',
  519. '点击稍后处理按钮',
  520. '弹窗关闭,预警条目状态保持未处理,可二次触发',
  521. 'P0', '场景法'),
  522. ('全屏预警弹窗', '点击应急疏散按钮弹出疏散弹窗预警弹窗保留底层', '正常场景',
  523. '弹窗已触发',
  524. '点击应急疏散按钮',
  525. '应急疏散全屏弹窗弹出(z-index 更高),当前预警弹窗保留在底层',
  526. 'P0', '场景法'),
  527. ('全屏预警弹窗', '多实验室同时触发预警时弹窗按顺序逐一弹出', '异常场景',
  528. '模拟多个实验室同时触发预警',
  529. '观察弹窗弹出行为',
  530. '弹窗按优先级或时间顺序逐一弹出,不出现多窗口叠加错乱',
  531. 'P0', '错误推测法'),
  532. ('全屏预警弹窗', '弹窗Canvas加载失败时左侧显示占位右侧不受影响', '异常场景',
  533. '弹窗已触发,模拟左侧 Canvas 加载失败',
  534. '观察左侧区域和右侧详情',
  535. '左侧显示摄像头信号丢失占位,右侧详情不受影响',
  536. 'P1', '错误推测法'),
  537. ('全屏预警弹窗', '弹窗期间传感器恢复正常时弹窗不自动关闭需手动', '边界场景',
  538. '弹窗已触发,传感器数据快速恢复正常',
  539. '观察弹窗是否自动关闭',
  540. '弹窗不自动关闭,需用户手动操作',
  541. 'P1', '边界值分析'),
  542. ('全屏预警弹窗', '弹窗未处理时同实验室再次触发不重复弹出防抖', '边界场景',
  543. '弹窗已触发且未处理',
  544. '同一实验室再次触发相同预警',
  545. '不重复弹出新弹窗(防抖机制)',
  546. 'P0', '边界值分析'),
  547. # ━━ 十二、应急疏散弹窗 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  548. ('应急疏散弹窗', '弹窗全屏弹出层级高于预警弹窗进场动画流畅', '正常场景',
  549. '全屏预警弹窗已触发',
  550. '点击应急疏散按钮,观察应急疏散弹窗弹出',
  551. '弹窗全屏弹出,z-index 高于预警弹窗,两层弹窗同时可见互不遮挡,进场动画流畅',
  552. 'P0', '场景法'),
  553. ('应急疏散弹窗', '关闭按钮仅关闭疏散弹窗底层预警弹窗保持完整', '正常场景',
  554. '应急疏散弹窗已打开',
  555. '点击右上角关闭按钮',
  556. '仅关闭应急疏散弹窗,底层全屏预警弹窗保持完整可见',
  557. 'P0', '场景法'),
  558. ('应急疏散弹窗', 'SVG平面图告警房间红色边框高亮与预警信息一致', '正常场景',
  559. '应急疏散弹窗已打开',
  560. '观察左侧 SVG 平面图,对比告警房间与预警弹窗中实验室信息',
  561. 'SVG 深蓝科幻风格正确渲染,告警房间红色边框高亮,编号与预警信息一致',
  562. 'P0', '场景法'),
  563. ('应急疏散弹窗', '疏散路线蓝色边框集合点标记虚线箭头指向出口', '正常场景',
  564. '应急疏散弹窗已打开',
  565. '观察 SVG 平面图中蓝色边框房间、集合点圆形标记、蓝色虚线箭头',
  566. '疏散路线关键房间蓝色边框,集合点圆形标记位置合理,蓝色虚线箭头指向两端紧急出口,方向清晰',
  567. 'P0', '场景法'),
  568. ('应急疏散弹窗', 'SVG右上方图例颜色语义与图形一致', '正常场景',
  569. '应急疏散弹窗已打开',
  570. '观察 SVG 右上方应急疏散路线图图例',
  571. '红色=告警房间、蓝色=疏散路线的颜色语义与图形一致',
  572. 'P1', '等价类划分'),
  573. ('应急疏散弹窗', '右侧3路监控占位区等宽等高16:9含楼层标签', '正常场景',
  574. '应急疏散弹窗已打开',
  575. '观察右侧 3 路视频监控区域',
  576. '纵向排列 3 路,高宽比 16:9,各路等宽等高,含楼层分区标签,Canvas 模拟画面有动态内容',
  577. 'P1', '场景法'),
  578. ('应急疏散弹窗', '底部告警指标明细格式指标名称当前值阈值', '正常场景',
  579. '应急疏散弹窗已打开',
  580. '观察底部左侧告警指标明细',
  581. '按「指标名称|当前值|阈值」逐行展示,数值与预警弹窗完全一致',
  582. 'P0', '等价类划分'),
  583. ('应急疏散弹窗', '播放设备选择展开列表选中后按钮文字更新', '正常场景',
  584. '应急疏散弹窗已打开,有可用播放设备',
  585. '点击播放设备选择按钮,选择某设备',
  586. '展开显示全部设备名称,选择后按钮文字更新为已选设备名称并高亮',
  587. 'P0', '场景法'),
  588. ('应急疏散弹窗', '喊话内容发送后输入框清空发送按钮短暂禁用2秒', '正常场景',
  589. '应急疏散弹窗已打开,已选择播放设备',
  590. '输入喊话内容后点击发送',
  591. '内容成功提交,输入框自动清空,发送按钮短暂禁用约 2 秒防重复提交,恢复后可再次发送',
  592. 'P0', '场景法'),
  593. ('应急疏散弹窗', '执行疏散按钮点击后置灰显示已下达并写入日志', '正常场景',
  594. '应急疏散弹窗已打开',
  595. '点击执行疏散按钮',
  596. '疏散指令成功下达,按钮立即置灰,界面显示疏散指令已下达,操作记录含时间和人员信息正确写入系统日志',
  597. 'P0', '场景法'),
  598. ('应急疏散弹窗', '稍后处理按钮关闭疏散弹窗焦点返回预警弹窗', '正常场景',
  599. '应急疏散弹窗已打开',
  600. '点击底部稍后处理按钮',
  601. '应急疏散弹窗关闭,焦点返回至底层全屏预警弹窗',
  602. 'P0', '场景法'),
  603. ('应急疏散弹窗', '喊话内容为空时点击发送不提交空请求', '异常场景',
  604. '应急疏散弹窗已打开,喊话输入框为空',
  605. '点击发送按钮',
  606. '按钮不可点击或显示请输入喊话内容提示,不提交空请求',
  607. 'P0', '错误推测法'),
  608. ('应急疏散弹窗', '播放设备列表为空时设备按钮置灰发送禁用', '异常场景',
  609. '后台配置无可用播放设备',
  610. '观察设备选择按钮和发送按钮状态',
  611. '设备选择按钮置灰显示无可用设备,发送按钮同步禁用',
  612. 'P0', '错误推测法'),
  613. ('应急疏散弹窗', '喊话发送网络失败时输入内容不丢失并提示重试', '异常场景',
  614. '应急疏散弹窗已打开,模拟网络请求失败',
  615. '点击发送,网络失败',
  616. '按钮恢复可点击,显示发送失败请重试,输入内容不丢失',
  617. 'P0', '错误推测法'),
  618. ('应急疏散弹窗', 'SVG平面图资源加载失败时显示占位提示其他区域不受影响', '异常场景',
  619. '模拟 SVG 平面图资源加载失败',
  620. '观察左侧区域显示',
  621. '显示平面图加载失败占位提示,右侧监控区及底部操作栏功能不受影响',
  622. 'P1', '错误推测法'),
  623. ('应急疏散弹窗', '右侧某路监控Canvas失败时显示信号丢失其余正常', '异常场景',
  624. '模拟右侧某路 Canvas 加载失败',
  625. '观察对应监控路显示',
  626. '显示信号丢失占位,其余两路正常显示',
  627. 'P1', '错误推测法'),
  628. ('应急疏散弹窗', '执行疏散网络失败时按钮恢复可点击不记录无效日志', '异常场景',
  629. '点击执行疏散后模拟网络请求失败',
  630. '观察按钮状态和提示',
  631. '按钮恢复可点击,显示指令下达失败请重试,不记录无效疏散日志',
  632. 'P0', '错误推测法'),
  633. ('应急疏散弹窗', '喊话内容达到最大字符上限时边框标红并提示', '边界场景',
  634. '应急疏散弹窗已打开',
  635. '输入恰好达到最大字符上限的内容',
  636. '输入框停止接受新字符,边框标红,显示已达字符上限',
  637. 'P1', '边界值分析'),
  638. ('应急疏散弹窗', '喊话内容仅1个字符时点击发送正常提交', '边界场景',
  639. '应急疏散弹窗已打开',
  640. '输入 1 个字符后点击发送',
  641. '正常提交,不因字数过少被拦截',
  642. 'P2', '边界值分析'),
  643. ('应急疏散弹窗', '喊话内容含特殊字符提交后不出现XSS注入', '边界场景',
  644. '应急疏散弹窗已打开',
  645. '输入特殊字符如 & < > 单引号 等后提交',
  646. '提交后不出现 XSS 注入或显示异常',
  647. 'P0', '错误推测法'),
  648. ('应急疏散弹窗', '多房间告警时SVG所有告警房间均红色高亮', '边界场景',
  649. '模拟多个房间同时告警',
  650. '观察 SVG 平面图告警房间高亮情况',
  651. '所有告警房间均红色边框高亮,疏散路线覆盖所有告警位置',
  652. 'P0', '边界值分析'),
  653. ('应急疏散弹窗', '连续多次点击执行疏散防抖机制仅记录一次', '边界场景',
  654. '应急疏散弹窗已打开',
  655. '快速连续点击执行疏散按钮',
  656. '系统仅记录一次疏散操作,不重复下达指令',
  657. 'P0', '边界值分析'),
  658. ('应急疏散弹窗', '关闭后再次打开弹窗输入框清空设备选择恢复默认', '边界场景',
  659. '已打开并关闭应急疏散弹窗',
  660. '再次点击应急疏散打开弹窗',
  661. '弹窗重新正常打开,喊话输入框已清空,设备选择恢复默认',
  662. 'P1', '边界值分析'),
  663. ('应急疏散弹窗', '执行疏散后再次打开时执行疏散按钮恢复可点击', '边界场景',
  664. '已执行疏散并关闭弹窗',
  665. '再次打开应急疏散弹窗',
  666. '执行疏散按钮恢复可点击状态,不保留上次禁用状态',
  667. 'P1', '边界值分析'),
  668. ('应急疏散弹窗', '播放设备仅1台时自动选中无需手动操作', '边界场景',
  669. '后台配置播放设备仅 1 台',
  670. '打开应急疏散弹窗观察设备选择状态',
  671. '设备选择按钮自动选中该设备,无需手动选择',
  672. 'P2', '边界值分析'),
  673. ('应急疏散弹窗', '播放设备超10台时下拉列表支持滚动不溢出', '边界场景',
  674. '后台配置播放设备超过 10 台',
  675. '打开设备选择下拉列表',
  676. '支持滚动查看,不出现列表溢出遮挡',
  677. 'P2', '边界值分析'),
  678. ('应急疏散弹窗', '9600x2800分辨率下弹窗各区域布局比例正确', '边界场景',
  679. '在 9600x2800px 分辨率设备上',
  680. '观察弹窗各区域布局比例',
  681. 'SVG、监控、底部栏布局比例与设计稿一致,无溢出',
  682. 'P0', '场景法'),
  683. ('应急疏散弹窗', '低分辨率设备上弹窗内容可正常访问不遮挡按钮', '边界场景',
  684. '在低于 9600x2800px 的普通显示器上',
  685. '观察弹窗内容可访问性',
  686. '弹窗内容可正常访问,必要时出现内部滚动条,不遮挡操作按钮',
  687. 'P1', '场景法'),
  688. # ━━ 十三、整体页面与通用功能 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  689. ('整体页面与通用功能', '整体CSS Grid四列宽度比例2:1.5:4.5:2正确', '正常场景',
  690. '系统正常运行,页面已完整加载',
  691. '检查整体布局 CSS Grid 列宽比例',
  692. 'grid-template-columns: 2fr 1.5fr 4.5fr 2fr,四列宽度比例与设计稿一致',
  693. 'P0', '场景法'),
  694. ('整体页面与通用功能', '页面按9600x2800px固定像素显示不使用scale缩放', '正常场景',
  695. '系统正常运行,页面已完整加载',
  696. '在 9600x2800px 分辨率下查看页面',
  697. '按固定像素显示,不使用 transform:scale 缩放',
  698. 'P0', '场景法'),
  699. ('整体页面与通用功能', '初次进入页面自动触发Fullscreen API全屏', '正常场景',
  700. '使用支持 Fullscreen API 的浏览器首次打开页面',
  701. '观察页面是否自动全屏',
  702. '自动触发全屏显示(Fullscreen API)',
  703. 'P1', '场景法'),
  704. ('整体页面与通用功能', '所有模块border-beam动效与四角装饰线正常', '正常场景',
  705. '系统正常运行,页面已完整加载',
  706. '观察所有模块边框动效',
  707. '所有模块边框均有 border-beam 动态路径流动动效,各模块四角有科幻装饰线框',
  708. 'P1', '场景法'),
  709. ('整体页面与通用功能', '主色调变量全局渲染颜色一致', '正常场景',
  710. '系统正常运行,页面已完整加载',
  711. '检查主色调变量(--bg-deep、--blue、--cyan、--gold)全局使用情况',
  712. '颜色变量全局渲染一致',
  713. 'P1', '等价类划分'),
  714. ('整体页面与通用功能', '面板圆角15px边框颜色rgba统一', '正常场景',
  715. '系统正常运行,页面已完整加载',
  716. '检查各面板圆角和边框颜色',
  717. '面板圆角统一 15px,边框颜色统一 rgba(30,144,255,0.22)',
  718. 'P1', '等价类划分'),
  719. ('整体页面与通用功能', 'ECharts版本5.4.3图表渲染无控制台版本兼容警告', '正常场景',
  720. '系统正常运行,页面已完整加载',
  721. '打开浏览器控制台,观察 ECharts 相关日志',
  722. '图表基于 ECharts 5.4.3 API 渲染,无控制台版本兼容警告',
  723. 'P1', '场景法'),
  724. ('整体页面与通用功能', '页面为单一HTML内联CSS无构建依赖双击可运行', '正常场景',
  725. '本地环境无 Web 服务器',
  726. '双击 HTML 文件在浏览器中打开',
  727. '页面可正常运行,内联 CSS+JavaScript,无需构建工具',
  728. 'P0', '场景法'),
  729. ('整体页面与通用功能', '浏览器不支持Fullscreen API时页面正常显示不报错', '异常场景',
  730. '使用不支持 Fullscreen API 的浏览器',
  731. '打开页面观察显示和错误',
  732. '页面正常显示,不出现白屏、黑屏或 JS 报错,提示用户手动全屏',
  733. 'P1', '错误推测法'),
  734. ('整体页面与通用功能', 'ECharts资源加载失败时对应图表区域显示占位块', '异常场景',
  735. '模拟 ECharts 资源加载失败',
  736. '观察图表区域响应',
  737. '对应图表区域显示图表加载失败占位块,不影响其他模块渲染',
  738. 'P0', '错误推测法'),
  739. ('整体页面与通用功能', '多动效同时运行时页面帧率保持流畅无卡顿', '异常场景',
  740. '系统正常运行,所有动效同时运行',
  741. '观察页面帧率和流畅度',
  742. '页面帧率保持流畅,无明显卡顿',
  743. 'P1', '错误推测法'),
  744. ('整体页面与通用功能', '9600x2800分辨率下各模块排版无错位内容无溢出', '边界场景',
  745. '在 9600x2800px 分辨率设备上',
  746. '检查各模块排版、内容和文字',
  747. '各模块排版无错位、内容无溢出、文字无截断',
  748. 'P0', '边界值分析'),
  749. ('整体页面与通用功能', '低分辨率下页面不强制缩放滚动条正常出现', '边界场景',
  750. '在低于 9600x2800px 分辨率设备上',
  751. '打开页面观察缩放和滚动条',
  752. '页面不强制缩放,滚动条正常出现,可浏览全部内容',
  753. 'P1', '边界值分析'),
  754. ('整体页面与通用功能', '页面持续运行8小时以上各实时模块无内存泄漏退化', '边界场景',
  755. '系统正常运行超过 8 小时',
  756. '持续观察各实时刷新模块性能',
  757. '时钟、传感器数据、预警通知等模块不出现因内存泄漏导致的性能退化',
  758. 'P0', '边界值分析'),
  759. ('整体页面与通用功能', '快速切换标签页再切回时动效与数据刷新自动恢复', '边界场景',
  760. '系统正常运行',
  761. '快速切换至其他标签页再切回',
  762. '所有实时动效与数据刷新自动恢复,不出现动画卡死',
  763. 'P1', '边界值分析'),
  764. ]
  765. def create_xls():
  766. wb = xlwt.Workbook(encoding='utf-8')
  767. ws = wb.add_sheet('测试用例')
  768. # ── 样式定义 ──────────────────────────────────────────────
  769. def make_style(bold=False, bg_colour=None,
  770. halign=xlwt.Alignment.HORZ_LEFT,
  771. font_colour=None, font_height=200):
  772. font = xlwt.Font()
  773. font.name = 'Microsoft YaHei'
  774. font.height = font_height
  775. font.bold = bold
  776. if font_colour is not None:
  777. font.colour_index = font_colour
  778. borders = xlwt.Borders()
  779. for attr in ('left', 'right', 'top', 'bottom'):
  780. setattr(borders, attr, xlwt.Borders.THIN)
  781. alignment = xlwt.Alignment()
  782. alignment.horz = halign
  783. alignment.vert = xlwt.Alignment.VERT_CENTER
  784. alignment.wrap = 1
  785. style = xlwt.XFStyle()
  786. style.font = font
  787. style.borders = borders
  788. style.alignment = alignment
  789. if bg_colour is not None:
  790. pattern = xlwt.Pattern()
  791. pattern.pattern = xlwt.Pattern.SOLID_PATTERN
  792. pattern.pattern_fore_colour = xlwt.Style.colour_map[bg_colour]
  793. style.pattern = pattern
  794. return style
  795. header_style = make_style(
  796. bold=True, bg_colour='dark_blue',
  797. halign=xlwt.Alignment.HORZ_CENTER,
  798. font_colour=xlwt.Style.colour_map['white'],
  799. font_height=220
  800. )
  801. CENTER = xlwt.Alignment.HORZ_CENTER
  802. styles = {
  803. '正常场景': {
  804. 'text': make_style(bg_colour='light_turquoise'),
  805. 'center': make_style(bg_colour='light_turquoise', halign=CENTER),
  806. },
  807. '异常场景': {
  808. 'text': make_style(bg_colour='rose'),
  809. 'center': make_style(bg_colour='rose', halign=CENTER),
  810. },
  811. '边界场景': {
  812. 'text': make_style(bg_colour='light_yellow'),
  813. 'center': make_style(bg_colour='light_yellow', halign=CENTER),
  814. },
  815. }
  816. # ── 表头 ──────────────────────────────────────────────────
  817. headers = [
  818. '用例编号', '模块名称', '测试场景', '测试类型',
  819. '前置条件', '测试操作', '预期结果', '优先级', '设计方法', '测试结果'
  820. ]
  821. col_widths = [4000, 5500, 9000, 3500, 10000, 12000, 14000, 2800, 4000, 3500]
  822. for col, (h, w) in enumerate(zip(headers, col_widths)):
  823. ws.write(0, col, h, header_style)
  824. ws.col(col).width = w
  825. ws.row(0).height_mismatch = True
  826. ws.row(0).height = 600
  827. # ── 模块编号映射 ──────────────────────────────────────────
  828. MODULE_INDEX = {
  829. '顶部导航栏': 1,
  830. '实验室基本情况统计': 2,
  831. '实验室安全分级统计': 3,
  832. '实验室进入人数统计及走势': 4,
  833. '智能环境感知应用设备统计': 5,
  834. '实验室设备分类及使用统计': 6,
  835. '化学品库存动态统计': 7,
  836. '实时监控': 8,
  837. '实验环境安全智能感知': 9,
  838. '实验室实时风险预警': 10,
  839. '全屏预警弹窗': 11,
  840. '应急疏散弹窗': 12,
  841. '整体页面与通用功能': 13,
  842. }
  843. module_counters = {}
  844. # ── 写入数据行 ─────────────────────────────────────────────
  845. for row_idx, case in enumerate(TEST_CASES, start=1):
  846. module, scenario, case_type, precond, operation, expected, priority, method = case
  847. mod_num = MODULE_INDEX.get(module, 0)
  848. module_counters[module] = module_counters.get(module, 0) + 1
  849. seq = module_counters[module]
  850. case_id = 'TC-%02d-%03d' % (mod_num, seq)
  851. st = styles.get(case_type, styles['正常场景'])
  852. s_text = st['text']
  853. s_center = st['center']
  854. ws.write(row_idx, 0, case_id, s_center)
  855. ws.write(row_idx, 1, module, s_text)
  856. ws.write(row_idx, 2, scenario, s_text)
  857. ws.write(row_idx, 3, case_type, s_center)
  858. ws.write(row_idx, 4, precond, s_text)
  859. ws.write(row_idx, 5, operation, s_text)
  860. ws.write(row_idx, 6, expected, s_text)
  861. ws.write(row_idx, 7, priority, s_center)
  862. ws.write(row_idx, 8, method, s_center)
  863. ws.write(row_idx, 9, '', s_center) # 测试结果留空
  864. ws.row(row_idx).height_mismatch = True
  865. ws.row(row_idx).height = 500
  866. # ── 冻结首行 ──────────────────────────────────────────────
  867. ws.set_panes_frozen(True)
  868. ws.set_horz_split_pos(1)
  869. # ── 保存 ──────────────────────────────────────────────────
  870. out_path = os.path.join(
  871. os.path.dirname(os.path.abspath(__file__)),
  872. 'test_case', 'test_case_new.xls'
  873. )
  874. wb.save(out_path)
  875. print('已生成:%s,共 %d 条测试用例' % (out_path, len(TEST_CASES)))
  876. if __name__ == '__main__':
  877. create_xls()