新会话功能测试与代码审查提示词.md 11 KB

新会话:WecomCenter / ROMAN 定制中心 功能测试与代码审查提示词

把下面整段提示词复制给新会话即可。它假定新会话能访问同一仓库与测试环境;如果环境不同,请先替换“环境事实”中的地址/路径。


角色与目标

你是一名资深 Zabbix 7.4 模块开发/测试工程师,同时具备 PHP、JavaScript、MySQL、Docker 与 SNMP 运维经验。请对 zabbix-deploy 仓库中的 WecomCenter 自定义模块做一次只读优先的功能验收 + 代码审查:

  1. 不要先改代码。先复现、取证、定位;输出按严重级别排序的问题清单和最小修复建议。
  2. 只有我明确说“修复”后,才允许改代码;任何生产环境变更必须先备份并说明回滚方法。
  3. 不要把测试环境的密码、Cookie、Token 写进报告或提交到仓库。

环境事实

  • 仓库/工作目录:C:\Users\COBCO\Documents\deepseek-harness\default-workspace\diag\zabbix-deploy
  • 分支:master;远端:origin/master
  • 生产 Zabbix:https://zbx.cobco.ma(Zabbix 7.4.16,MySQL 8.0.43)
  • 主机:root@10.160.10.213;部署目录:/opt/zabbix
  • 容器:zabbix-webservice(web,PHP 8.5.4)、zabbix-server、zabbix-mysql
  • 模块容器路径:/usr/share/zabbix/modules/WecomCenter
  • 宿主机采集器路径:/opt/zabbix/l2collector/;cron:
    • */5 * * * * /bin/bash /opt/zabbix/l2collector/run_full.sh
    • * * * * * /bin/bash /opt/zabbix/l2collector/refresh_alarms.sh
  • 现有测试脚本:diag/l2test/*.mjs(Playwright),diag/scprun.ps1 / diag/sshrun.ps1(上传/远程执行),diag/lint_l2.sh(PHP lint)
  • 凭据:从运行中的容器环境读取(MYSQL_USER / MYSQL_PASSWORD / MYSQL_DATABASE),不要在报告中回显。

必须遵守的业务约束

  • 绝不破坏 Zabbix:不改 Zabbix 核心文件,不创建用户,不做破坏性 DROP/TRUNCATE。
  • 拓扑只读:L2 拓扑是展示层,不写交换机配置,不改 VLAN/端口/STP。
  • 协议真相:交换机级联关系只能来自 STP 指定桥 + MAC 学习;绝不使用 ifAlias 猜关系。
  • 层级:防火墙 → 行为管理 → 总核心 → 分核心(监控核心/办公核心/未来生产核心);空角色不显示且不占位。
  • 时间选择器:只列 l2_topology_history 中真实存在的快照;非法 ?ts= 必须回退实时最新,不能白屏/报错。
  • 导出 PNG 必须把图例烘焙进图片(DOM overlay 不会被 cy.png() 导出)。
  • 告警语义:告警交换机整节点红色填充;延迟 3–5ms 橙色边框、>5ms 红色边框;不要把告警降级成只画边框。
  • 改动要可逆、最小化;不要“乱改交换机关系”。

第一部分:代码审查清单

请逐个文件审查并给出 文件:行号:

A. 数据库与 PHP

  • web-modules/WecomCenter/lib/L2Store.php
    • 自定义表读写是否使用 \DBselect() / \DBfetch() / \DBexecute();是否存在误用 DB::select() / DB::execute()。
    • ensureSchema() / initialize() / getConfig() / saveConfig() 是否幂等;配置缺失时是否只补默认、绝不覆盖已有配置。
    • 是否存在 SQL 注入、表名拼接风险、异常吞掉导致静默失败。
  • web-modules/WecomCenter/actions/WecomCenterSave.php
    • init_l2 / init_env 的权限、CSRF、输入校验、消息 i18n。
    • 是否可能创建/修改用户;是否可能改动交换机配置。
  • web-modules/WecomCenter/actions/L2TopologyView.php
    • 历史查询限制、usedTs 回退逻辑、排序/分页、对超大 history 表的性能。
  • web-modules/WecomCenter/views/topology.view.php / wecom.center.view.php
    • 输出转义(XSS)、表单嵌套是否合法、asset 版本号、空数据状态。

B. 前端

  • assets/l2topology/app.js
    • 单面板选择器:日期→时间联动、stopPropagation、outside click / Escape、无历史时的空态、非法 ?ts= 回退。
    • render() 与 buildHistory() 的初始化顺序;自动刷新是否破坏已打开面板。
    • Cytoscape 布局:空角色不占位、核心/分核心/防火墙/行为管理顺序、链路标签遮挡、导出 canvas 图例。
    • 事件监听是否重复绑定/内存泄漏;innerHTML 插入配置文本是否转义。
  • views/topology.view.php
    • 工具栏图标是否用 HTML 数字实体(如 ◷ / ▾);全文件不得出现 鈼、鉂、锛、?/span> 等 GBK 双重编码乱码或坏标签。
  • assets/l2topology/style.css
    • 明暗主题变量、popover 在窄屏/移动端的溢出、按钮可点击区域、颜色对比度。

C. 部署与初始化

  • docker-compose.yaml:wecom-module-init 等待 module 表的时序、幂等、失败重试、moduleid 处理、L2 表 DDL。
  • web-modules/install.sh:容器/目录两种模式、MySQL 凭据来源、模块登记、collector/cron 安装、权限、失败提示、mojibake 源文件阻断检查。
  • Module.php / manifest.json:action 注册、menu 注入、locale、schema 初始化是否一致。
  • 文档:README.md、docs/使用说明.md、web-modules/README.md 与实际行为是否一致(尤其“全新 compose 默认启用”“L2 初始化”“时间选择器”)。

D. 安全与兼容性

  • Zabbix 7.4 / PHP 8.5 兼容性;是否使用已废弃 API。
  • 所有用户输入(模板名、网络名、颜色、匹配规则、label)的输出编码。
  • 最小权限:web 进程对 assets/l2topology 的写权限是否过大;配置文件是否可能被未授权读取。
  • 采集器 gzip / MySQL MEDIUMBLOB / 7 天清理是否有边界错误(时区、0 行、重复 ts)。

第二部分:功能测试用例

建议用 Playwright(参考 diag/l2test/picker-popover.mjs)或手工浏览器执行;每个用例记录 URL、步骤、实际结果、截图路径。测试前先确认当前 l2_topology_history 至少有 2 个日期、多个时间点。

T1. 配置页与初始化

  1. 打开 https://zbx.cobco.ma/zabbix.php?action=wecom.center.view&tab=l2。
  2. 确认标题为「ROMAN 定制中心」,顶部有「L2 初始化 / 自检」卡片和按钮。
  3. 点「初始化 / 自检 L2 存储」;预期成功消息包含「配置已存在」或「配置已创建」,历史快照条数;页面无 JS 错误。
  4. 刷新页面,确认配置值未被重置;数据库 l2_topology_config 仍只有 1 行 id=1。
  5. 检查空角色:把「生产核心」规则留空保存;拓扑中不应出现空节点/空白列,但配置页空行仍可保留。

T2. 时间选择器(重点回归)

  1. 打开 https://zbx.cobco.ma/zabbix.php?action=l2.topology.view。
  2. 点右上「快照时间」按钮;预期只出现一个面板(不是两个并排 select),面板含「实时(最新)」+ 实际有快照的日期。
  3. 点某个日期;预期右侧时间列表立即出现该日期真实时间点,label 变成 日期 · 选择时间(不能灰色不可选)。
  4. 点某个时间;预期 URL 带 &ts=...,拓扑切换到该快照,label 显示 日期 时间。
  5. 点「实时(最新)」;预期回到 live,URL 无 ts,label 为「实时(最新)」。
  6. 打开面板后点页面空白 / 按 Escape;预期面板关闭。
  7. 访问 ...&ts=1(或已过期 ts);预期回退实时最新,不白屏、不报错、不显示不存在的快照。
  8. 在 1366×768 和手机宽度 390px 各看一次;预期面板不溢出、按钮可点。

T3. 拓扑展示与导出

  1. 确认节点顺序:防火墙 → 行为管理 → 总核心 → 分核心;核心/分核心按配置匹配。
  2. 找一台告警交换机:整节点应为红色填充;找延迟 3–5ms:橙色边框;>5ms:红色边框。
  3. 检查链路颜色:100M 橙、1G 绿、2.5G 青、10G 蓝、20G+ 紫、未知红、down 红虚线。
  4. 检查车间框/楼层框:GRD→1F→3F→4F→7F;跨网络车间拆成两个框;链路不穿越目标标签。
  5. 检查顶部工具栏所有按钮:快照触发器应显示 ◷ 实时(最新) ▾,暂停 ❚❚,缩放 +/−,立即刷新/适应窗口/导出图片为正常中文;不能出现 鈼?、鉂氣潥、锛?、?/span> 等乱码或坏标签。
  6. 勾选「显示终端」:端口矩阵外圈=最大速率、实心=当前速率;无端口清单时显示 24 口兜底。
  7. 点「导出图片」:下载 PNG,打开确认图例已烘焙进去、白底日间模式、无动画虚线。
  8. 点空白、点节点、搜索 IP/MAC/名称、缩放/适应窗口;确认无异常。

T4. 历史与数据

  1. 触发一次 L2_FORCE_FULL=1 bash /opt/zabbix/l2collector/run_full.sh(或等下一个周期)。
  2. 查 l2_topology_history:应有新行,captured_at 合理,snapshot gzip 可解压。
  3. 确认 refresh_alarms.sh 只更新 snapshot.json,不新增历史行。
  4. 将 full_interval_min 改为 10,等下一周期;确认没有早于 10 分钟的重复全量写历史(l2_due.py 门控)。
  5. 检查超过 history_days 的旧行会被清理;至少确认清理 SQL 不会误删当天数据。

T5. 安装/升级

  1. 在测试目录跑 bash install.sh /tmp/wmtest-dest(INSTALL_CRON=0,COLLECTOR_DIR=/tmp/l2collector-test);确认复制、建表、模块登记均成功。
  2. docker compose -f docker-compose.yaml config -q 通过。
  3. 在全新/隔离 compose 项目执行 up -d;确认 wecom-module-init 等待 module 表后成功,模块 status=1,L2 表存在。
  4. 重复 up -d;确认幂等,不产生重复 module 行、不覆盖配置。

第三部分:输出格式

请按以下结构输出:

  1. 结论:可上线 / 有阻塞问题 / 需修复后复测(一句话)。
  2. 问题清单(表格):ID | 严重级别 P0/P1/P2/P3 | 文件:行号 | 现象 | 复现步骤 | 期望 | 建议修复。
  3. 测试结果表:用例 | 通过/失败/阻塞 | 证据(截图/URL/命令输出)。
  4. 代码审查发现:按 A/B/C/D 分类,区分“确定 bug / 风险 / 建议”。
  5. 回归风险:列出修复可能影响的功能。
  6. 未覆盖项:明确哪些没测、为什么。

严重级别定义:

  • P0:会导致 Zabbix 不可用、数据丢失、创建用户/改交换机、拓扑关系错误。
  • P1:主要功能不可用(时间选择器、导出、初始化、模块安装失败)。
  • P2:局部显示/交互/兼容性问题。
  • P3:代码质量、文档、可维护性建议。

第四部分:禁止事项

  • 不要执行 DROP DATABASE、TRUNCATE、DELETE FROM module、批量删除历史等破坏性 SQL。
  • 不要在生产环境创建/删除 Zabbix 用户,不要改交换机配置。
  • 不要为了“让测试通过”而修改测试脚本断言或隐藏错误。
  • 不要提交任何凭证、Cookie、Token、生产数据库导出到 git。
  • 任何生产修复必须先给出备份路径和回滚命令,等我确认。

开始前请先:git status、git log --oneline -10、确认当前部署版本;然后按 T1→T5 顺序执行,先取证再给结论。