Zulip 手动测试(Manual QA)完整指南:从开发环境搭建到全功能回归验证
2026/9/12 23:20:07 网站建设 项目流程

Zulip 手动测试(Manual QA)完整指南:从开发环境搭建到全功能回归验证

【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip

导读

本文基于 Zulip 官方测试文档,系统讲解如何对 Zulip 服务端与 Web 应用开展手动测试(Manual testing / Manual QA)。手动测试与自动化测试互补,特别适合捕捉安全/权限缺陷、界面显示瑕疵以及多用户交互场景下的语义问题。读完本文,你将掌握:Zulip 测试账号体系的使用方式、从消息视图到频道权限的十大功能域测试清单、每个功能的键盘快捷键与鼠标操作路径,以及如何组织多人并行 QA 任务。所有快捷键均可对照仓库中 web/src/hotkey.ts 的前端实现逐一验证。

一、为什么还需要手动测试

Zulip 项目对自动化测试有很高的要求(后端测试分布在 zerver/tests 下 150 余个 Python 测试文件中,前端也有 web/tests 与 e2e 测试 web/e2e-tests),但凡是能实际测试的功能,项目依然坚持配合手动测试。原因有三:

  1. 某些缺陷类型只有真人操作才能暴露——例如悬停态(hover state)的布局抖动、弹出菜单的“过于粘滞”(点击别处不消失)、多窗口会话下的实时事件推送等;
  2. 手动测试能帮助开发者加深对系统的理解——在逐项点击与按键的过程中,会自然思考某个功能现有的语义(semantics),这对正在开发该功能的开发者尤其有价值;
  3. 测试即学习——QA 过程本身就是对新功能最直观的验收。

本文假设读者已经能够搭建本地开发服务器并在浏览器中打开 Zulip,同时具备基本的 Zulip 使用常识。开发环境的搭建方式可参考 docs/development/setup-recommended.md 与 docs/development/overview.md。

二、测试账号体系与基本原则

2.1 使用莎士比亚角色账号

手动测试建议以Cordelia作为主测试用户,Hamlet作为她的主要对话对象,涉及管理员功能时使用Iago。如需验证“Cordelia 收不到不属于她的消息”这类隔离性场景,则把消息发给OthelloProspero

这些角色并非文档虚构,而是 Zulip 开发环境内置的示例用户。后端测试基础设施在 zerver/lib/test_classes.py 中通过example_user_map定义了整套账号:

用户名邮箱(开发环境)典型用途
hamlethamlet@zulip.com常规非管理员用户,主对话对象
cordeliacordelia@zulip.com主测试用户
iagoiago@zulip.com管理员账号,用于管理功能
prosperoprospero@zulip.com隔离性验证用旁观用户
othelloothello@zulip.com隔离性验证用旁观用户
aaron / ZOE / polonius 等zulip.com 域其他场景角色

测试代码中约定“非管理员优先用 hamlet,管理员用 iago”(见 zerver/lib/test_classes.py 附近注释),手动测试沿用同一约定可让代码与 QA 行为保持一致。多用户并行测试时,可以用浏览器隐身窗口分别登录不同账号,模拟真实的多客户端会话。

2.2 手动测试的五个基本准则

  • 优先抓安全/权限类 bug:这是手动测试价值最高的产出,例如越权读频道、越权发消息、被移除订阅后仍能通过旁门左道看到频道内容;
  • 不要急于求成:重点观察小细节,如显示错位(display glitches)、提示文案错误、焦点位置错误;
  • 始终多账号测试:单账号无法暴露同步、权限与未读数问题;
  • 保持控制台常开:打开浏览器开发者工具的 Inspector Console,随时关注 warning 与 error 输出;
  • 有条理地收集 bug 信息:可以先自己汇总笔记,再统一整理成 ticket,避免边测边写导致遗漏。

2.3 多人分工

本文其余部分按功能域分组(消息视图、消息框、消息编辑、窄化、消息编写、弹出菜单、侧边栏过滤、频道权限、搜索、频道设置、用户设置、键盘快捷键、杂项菜单、邀请用户/教程)。多人同时测试时,可直接按这些章节划分 QA 任务。

三、消息视图(Message view)测试

消息视图大多在测试其他功能时顺带覆盖,这里只需专项验证几件事。

3.1 导航快捷键

逐一尝试以下导航热键:

快捷键功能实现位置
Up/k上移消息web/src/list_cursor.ts
Down/j下移消息同上
PgUp/K大幅上移同上
PgDn/J/Spacebar大幅下移同上
End(macOS 为fn+右箭头跳到末尾
鼠标滚轮快速滚动

快捷键映射统一由 web/src/hotkey.ts 的get_keydown_hotkey(web/src/hotkey.ts)解析。值得注意的是,该函数对非 QWERTY 键盘布局做了兼容:通过e.codeCODE_TO_QWERTY_CHAR映射(web/src/hotkey.ts)把西里尔等布局下的物理按键换算成 QWERTY 等价字符,因此俄语、中文等输入法环境下快捷键依然可用;macOS 下按住Cmd+Shift时浏览器会报告未加 Shift 的 key,同一映射也能正确处理(web/src/hotkey.ts)。测试时若发现快捷键“不响应”,可以优先怀疑是e.keye.code解析路径的分支问题。

3.2 从消息视图窄化(Narrowing)

窄化指切换到消息的不同视图,可以通过热键或鼠标完成:

  • 热键路径
    • a→ 进入 Combined feed(综合消息流)视图;
    • s→ 窄化到当前选中消息所在的频道(先在消息区选中消息,再到左侧边栏确认筛选结果);
    • S→ 窄化到当前消息的主题(同样到侧边栏确认);
    • v→ 跳转到私信(direct messages)视图。
  • 点击收件人栏(recipient bar):分别测试窄化到频道、窄化到主题、窄化到与单个用户的私信、窄化到群组私信。
  • 点击 Zulip logo:窄化到某主题后点击 logo,确认进入了 Recent conversations(最近会话)视图。

四、消息框(Messagebox)测试

消息框测试重点是全部键盘快捷键与点击处理器的联动,以及三种视觉形态的渲染:

  1. 含发送者信息的消息;
  2. 不含发送者信息的消息(连续消息中仅第一条显示发送者);
  3. /me动作消息。

4.1 三种形态的操作流程

  • 含发送者形态:窄化到新主题发送一条消息(此时会显示发送者姓名)→ 编辑该消息,EDITED标记应出现在发送者姓名旁。
  • 不含发送者形态:再发一条消息(不再显示发送者)→ 编辑它,EDITED标记应出现在左侧头像所在的列。
  • /me形态:发送/me test message,消息应并排在发送者姓名旁显示;编辑后EDITED标记出现在消息本体旁边。

4.2 点击处理器与热键

对上述三种形态逐一验证以下交互:

交互操作
发送者浮层(Sender popover)点击含发送者消息的头像和姓名;对所有消息按u打开发送者浮层
消息回复点击消息本体回复;rReturn回复;>引用消息;@提及并回复
表情回应(Reactions)点击表情按钮打开菜单;按:打开表情菜单;对消息添加回应
Chevron 菜单点击 chevron 打开菜单;按i打开同一菜单
消息编辑点击“编辑/查看源码”按钮;按i+Return编辑或查看源码;在“查看源码”里点击“copy and close”,验证Copied!标签的定位是否正确
星标消息点击右列星标按钮;按Ctrl + S星标消息
长消息折叠发送长消息,确认出现Show more按钮;点击more/collapse链接;按i可无视消息长度直接折叠/展开
显示图片v显示线程中所有图片
静音主题M静音当前主题(观察左侧边栏主题被静音后的样式变化)

最后,拖动浏览器窗口改变屏幕尺寸,检查消息框在不同分辨率下的表现是否正常。

五、消息编辑(Message editing)测试

这一环节主要锻炼**主题变更(topic changes)**相关逻辑,因为主题迁移涉及多消息批量更新与窄化视图的实时刷新。

5.1 高强度编辑演练

按以下脚本依次操作,覆盖“改单条、改多条、全改”三种粒度:

  1. 向主题original发一条消息;
  2. 编辑该消息内容;
  3. 再向original频道发两条消息;
  4. 开始编辑一条消息,然后取消编辑;
  5. 把第一条消息的主题改为change1(仅此一条);
  6. 窄化回original,再发一条消息;
  7. 最后两条消息的主题改为change2
  8. 窄化回original,再发两条消息;
  9. 编辑第 2 条消息的主题,选择“将所有消息改到change3”。

每一步都注意观察:窄化回原主题后消息是否从原视图消失、是否在新主题下出现、未读数是否随之变化。

5.2 UI 入口点

  • i后用方向键选择编辑选项(弹出菜单键盘导航);
  • 用鼠标操作同样的弹出菜单;
  • 点击铅笔图标进入编辑模式。

六、窄化(Narrowing)回归测试

Zulip 用“窄化”指代打开消息的不同视图:点击侧边栏选项、收件人栏、或使用搜索。此环节的核心观察点是未读数(unread counts),其次是消息是否出现在消息面板中,最后确认 Cordelia 的视图里不会出现窄化范围之外的消息

重要前提:确认 Cordelia 已订阅Verona未订阅 Denmark。若环境不同,请改用其他频道组合。(Verona等测试频道在 zerver/tests/test_channel_permissions.py 等测试中也有使用,与开发环境内置频道一致。)

6.1 由 Hamlet 发送的消息矩阵

每种消息请重复发送数次,便于 Cordelia 在切换视图后仍能收到新消息:

  1. 给 Cordelia/Othello 发私信(群组私信);
  2. 给 Cordelia 发私信;
  3. 给 Othello 发私信;
  4. 发到Verona/foo
  5. 发到Verona/bar
  6. 发到Denmark/foo
  7. 发到Denmark/foo并 @提及 Cordelia。

6.2 由 Cordelia 循环的视图矩阵

对上面每一类消息,Cordelia 都要依次经过以下视图(每次窄化后由 Hamlet 发送新消息):

  • Combined feed 视图;
  • 私信流(Direct message feed)视图;
  • 与 Hamlet 的私信视图;
  • 与 Hamlet 和 Othello 的群组私信视图;
  • Verona 视图;
  • Verona/bar视图;
  • Verona/foo视图;
  • Denmark 视图;
  • Denmark/foo视图。

7 种消息 × 9 个视图约56 个用例。如果每个用例能在约 30 秒内完成,整个过程约 30 分钟(假设无 bug 打断)。要点是:对未订阅的 Denmark,Cordelia 不应看到任何消息、未读数与频道入口

七、消息编写(Composing messages)测试

Zulip 的 Markdown 处理器已有较完善的自动化测试,因此手动测试聚焦交互层:自动填充的内容、焦点位置、草稿恢复等。

7.1 热键

快捷键行为
r回复频道消息
r回复私信
R回复私信的发送者本人(原作者)
R回复私信频道消息的作者
c编写新的频道消息
x编写新的私信

7.2 按钮入口

  • 窄化到频道后点击New topic
  • 窄化到私信流后点击New topic
  • 窄化到频道后点击New direct message
  • 窄化到私信流后点击New direct message

每一条都要检查:打开编写框后收件人是否正确预填、焦点是否落在正文。

7.3 主题行为

  • 向无主题的频道发消息(观察是否使用默认主题);
  • 向新主题发消息;
  • 利用主题自动补全(autocomplete)发消息;
  • 手动输入一个已存在的主题发消息。

7.4 格式化功能

  • 点击A 图标打开 Markdown 帮助;
  • 点击眼睛图标进入预览模式,并直接从预览模式发送;
  • 发送前在预览与编辑模式之间来回切换;
  • @提及 Hamlet 并给他发消息;
  • 输入#**devel**频道链接语法发给 Hamlet,然后点击该链接验证跳转;
  • 创建无序列表;
  • 用表情图标在表情选择器中查找并插入表情。

7.5 附件

  • 用回形针图标发送带附件的消息;
  • 一次发送多个附件;
  • 从剪贴板粘贴图片;
  • 从桌面拖拽图片上传。

7.6 草稿

  • 开始编写后点击编写框外部(草稿自动保存);
  • restore drafts恢复草稿;
  • 开始编写后按Esc放弃消息,再恢复草稿;
  • 开始编写频道消息后用编写框内的x 图标放弃,再恢复;
  • 点击New direct message后恢复草稿(此时应出现“你现在发送到的是一个频道”的提示类行为,验证草稿与收件人状态的交互)。

7.7 点击发送模式(Click to send)

  • 关闭 Enter-to-send
    • Tab+Enter发送两段式消息(Tab 用于插入换行);
    • Ctrl-EnterCmd-Enter发送两段式消息。
  • 开启 Enter-to-send
    • 直接按Enter发送。

八、弹出菜单(Popover menus)测试

目标是把所有弹出菜单完整过一遍。核心技巧:偶尔点击现有弹出菜单之外的 UI 区域,检查菜单是否“太粘滞”(点击外部后仍未关闭)。同时留意一些操作带来的“跳跃感”后果——例如在当前视图静音一条消息后,该消息会从视图中消失。

8.1 频道侧边栏菜单

(悬停频道过滤器时点击省略号...

  • Channel settings:确认能跳转到对应设置页;
  • Narrow:跳转后让 Hamlet 发消息验证;
  • Pin/unpin:两者都测,观察侧边栏排序;
  • Compose:向该频道发一条消息;
  • Mark as read:先滚动回去,再让 Hamlet 发消息验证未读数;
  • Mute/unmute:两者都测;
  • Unsubscribe:退订后到齿轮菜单的 Channel settings 里重新订阅;
  • Choose custom color:随意调整频道颜色。

8.2 主题侧边栏菜单

(悬停主题时点击省略号)

  • Narrow:让 Hamlet 发消息验证;
  • Mute/unmute:两者都测;
  • Mark as read:滚动回去后让 Hamlet 发消息。

8.3 消息面板左侧菜单(点击人名)

  • 验证邮箱;
  • 验证消息发送日期;
  • Send a direct message(确认编写框被正确填充);
  • Narrow to direct messages with(与某人的私信);
  • Narrow to direct messages sent by(某人发送的私信)。

8.4 消息面板右侧菜单(悬停时点击 chevron)

  • i热键打开菜单;
  • 编辑自己发送的消息(用方向键在弹出菜单中导航);
  • 查看他人消息的View Source(确认他人消息不可编辑);
  • Reply(发消息验证);
  • Collapse/uncollapse(两者都测);
  • Mute/unmute(两者都测,同时观察左侧边栏);
  • Link to this conversation(复制会话链接)。

8.5 好友列表菜单(悬停用户时点击省略号)

  • Narrow to direct messages with
  • Narrow to message sent by
  • Compose a message to

九、侧边栏过滤(Sidebar filtering)测试

本环节验证左侧边栏的频道搜索过滤与好友列表过滤,速度较快。若 Cordelia 尚未订阅 Denmark,请先订阅。

9.1 频道过滤

  • w打开频道搜索框;
  • 输入d过滤(应筛出 Denmark / devel 等含 d 的频道);
  • 对 Denmark 执行 Pin/unpin;
  • 清除过滤条件;
  • AD热键循环切换频道(注意大小写区分:D需配合 Shift);
  • 再次过滤后点击页面其他位置,验证过滤框关闭行为。

9.2 好友列表过滤

  • q打开好友列表搜索框;
  • 分别过滤 Hamlet、Prospero、Othello;
  • 过滤 Hamlet 时登录/登出 Hamlet,观察列表实时变化;
  • 过滤 Othello 时登录/登出 Hamlet;
  • 不过滤时登录/登出 Hamlet;
  • 再次过滤后点击其他位置,验证关闭行为。

十、频道权限(Channel permissions)测试

这是最重要的测试类别——绝不能出现用户能读取无权限频道消息的 bug。总流程:由 Hamlet 创建频道,再验证 Cordelia 对这些频道的可见性。

10.1 正向测试(Positive tests)

  • Hamlet 创建公开频道并订阅 Cordelia,向频道发消息,Cordelia 应能正常收发;
  • Hamlet 创建未含 Cordelia 的公开频道
    • Hamlet 发消息;
    • Cordelia 随后自行订阅该频道;
    • 验证 Cordelia能看到此前的历史消息
    • Cordelia 再发一条消息。
  • Hamlet 创建邀请 Cordelia 的私密频道,测试两人的双向对话。

10.2 反向测试(Negative tests)

反向测试要“挖得更深”,尝试为 Cordelia 寻找访问频道的后门

  • 绕过自动补全直接向该频道编写消息(可尝试手动输入频道名);
  • 在搜索中用channel:foo语法窄化到该频道;
  • 进入频道设置页,检查频道是否出现在列表中。

公开频道:Cordelia 知道其存在是可以接受的,且可以随后订阅。对私密频道:在被邀请之前,Cordelia甚至不应知道其存在

具体反向用例:

  1. 未邀请 Cordelia 的公开频道
    • 验证 Cordelia 能在自己的设置中看到该频道;
    • 验证 Cordelia无法向该频道编写消息;
    • Hamlet 发消息后,验证 Cordelia什么都看不到
  2. 先订阅 Cordelia、再由 Iago 用管理页撤销订阅的公开频道
    • 验证频道先出现在 Cordelia 左侧边栏、随后消失;
    • 尝试用channel:foo之类的“偷偷摸摸的搜索”访问该频道。
  3. 未邀请 Cordelia 的私密频道
    • 验证 Cordelia无法向该频道编写消息。

十一、搜索(Search)测试

主要任务是玩转搜索建议(autocomplete)。选中某个建议后,验证消息视图与搜索条件一致、左侧边栏反映当前窄化状态。若某个搜索合法地返回空结果,可让 Hamlet 发一条匹配消息后再看。

11.1 应支持自动补全的搜索

  • channel:design
  • channel:Verona topic:Verona1
  • channel:Verona keyword(频道 + 关键词)
  • sent by me
  • @-mentions(提及我的消息)
  • starred messages(已加星标消息)
  • messages sent by Hamlet
  • direct messages with Hamlet
  • direct messages with Hamlet matching keyword "foo"

11.2 不出现自动补全的搜索

  • -channel:Verona(排除 Verona 频道)
  • channel:Verona channel:devel(应返回空结果——同一查询同时指定两个频道)

11.3 杂项操作

  • /开始搜索;
  • 点击x 图标清除搜索;
  • Esc清除搜索。

十二、频道设置(Channel settings)测试

12.1 UI 入口点

测试进入频道设置的各种入口:

  • 左侧边栏的小齿轮菜单,过滤到devel
  • 左侧边栏devel旁的弹出菜单;
  • 好友列表上方的齿轮菜单,过滤到devel
  • 齿轮菜单中直接点击devel
  • 齿轮菜单中点击devel旁的 chevron 菜单(文档作者也备注:截至写作时不确定为何还保留该 chevron——测试时可一并关注其必要性)。

12.2 创建公开频道 public1 并添加 Hamlet

  1. 在文本框中输入public1,点击Create new channel
  2. 选择People must be invited,验证此时无法勾选Announce new channel in #[announcement channel](私有频道不能广播);
  3. 改回Anyone can join使其公开;
  4. 勾选 Hamlet;
  5. 点击Create

12.3 订阅/退订同步

  • 以 Hamlet 登录,进入他的频道设置;
  • 由 Cordelia 在频道设置页用对勾取消订阅public1
  • 验证 Hamlet 能看到 Cordelia 已退订(订阅人数应减少);
  • Cordelia 重新订阅public1
  • 验证 Hamlet 能看到该变化。

12.4 Create Channel 对话框选项矩阵

以 Cordelia 身份创建频道 s1~s6,覆盖各种选项组合:

频道组合要点
s1任何人可加入 + 广播 + 用过滤功能添加 Hamlet
s2必须被邀请才能加入
s3任何人可加入 + 不广播
s4全部勾选 → 再全部取消 → 只邀请 Hamlet
s5邀请除 Hamlet 外的所有人
s6先以公开方式创建且不订阅任何人,然后通过频道选项里的Add按钮添加 Hamlet

12.5 频道级选项

  • 使用devel频道发消息;
  • Mute 和 unmute,并让 Hamlet 发消息验证效果;
  • 开关通知(notifications on/off),让 Hamlet 发消息验证;
  • Pin 和 unpin,观察左侧边栏;
  • 修改频道颜色,然后查看左侧边栏和 All messages 视图中的效果;
  • 在主频道视图中验证频道订阅人数显示是否正确。

十三、用户设置(User settings)测试

在齿轮菜单中选择Settings修改用户级设置,以下任务以 Cordelia 身份执行。

13.1 Your account

  • 修改全名(Hamlet 应能看到名字变化);
  • 自定义头像;
  • Deactivate account停用账号(然后以 Iago 登录重新激活 Cordelia——验证管理员的账号恢复能力)。

13.2 Preferences

注意:文档特别提示,目前这些偏好需要刷新页面才能生效,测试时要留意这一现状。

  • 默认语言改为西班牙语;
  • 24 小时制,然后再改回 AM/PM。

13.3 Notifications

频道消息通知:

  • 在用户级关闭通知 → 新建频道 → Hamlet 发消息(应无通知);
  • 在用户级打开通知 → 新建频道 → Hamlet 发消息(应有通知)→ 关闭该频道通知 → Hamlet 再发消息(应无通知)。

私信与 @提及通知:

  • 测试Desktop/Audible(桌面/声音)选项;
  • 其余选项当前可暂不关注。

13.4 Bots / API key

  • 创建一个使用通用头像的 bot,给它发私信;
  • 创建一个自定义头像的 bot,给它发私信;
  • 修改自己的 API key。

13.5 Alert words(提醒词)

  • 创建一个提醒词;
  • 让 Hamlet 发送包含该提醒词的消息(验证高亮与通知)。

13.6 Zulip labs(实验功能)

  • 打开auto-scroll to new messages(自动滚动到新消息),让 Hamlet 发消息验证;
  • 开关Enable desktop notifications for new channels(文档备注:该选项可能很快会被移除,测试时请留意)。

十四、键盘快捷键(Keyboard shortcuts)测试

大部分快捷键已在前述任务中覆盖,这里做专项收尾:

  1. ?打开键盘帮助对话框;
  2. 校对对话框中的拼写错误
  3. 关闭对话框;
  4. 通过齿轮菜单重新打开键盘帮助;
  5. 挑一个不常用的快捷键,实验其用法(可对照 web/src/hotkey.ts 中的完整快捷键映射)。

十五、杂项菜单(Miscellaneous menu options)

确保以下选项能打开正确的帮助页面:

  • 校对并抽查:Message formatting(消息格式)、Search filters(搜索过滤器);
  • 确认帮助在新浏览器标签页中打开:Desktop and mobile apps、Integrations、API documentation。

十六、邀请用户与新手教程(Inviting users / tutorial)

  1. 用好友列表下方的邀请链接邀请ignore@zulip.com,但不做后续操作(验证“已发送邀请但未完成”的状态);
  2. 用齿轮菜单完整邀请foo@zulip.com
  3. 到开发控制台(development console)获取foo@zulip.com的登录链接——这是开发环境特有的取号方式;
  4. 走一遍完整的注册(signup)流程;
  5. 跟随新手教程(tutorial);
  6. 用齿轮菜单登出;
  7. 重新以 Cordelia 登录。文档承认:这一步对生产代码的 QA 意义有限,因为登录流程是为开发环境定制的(开发环境支持直接点击登录链接,无需密码)。

十七、尚未覆盖:设置/管理端(To be continued...)

本文档尚未覆盖设置与组织管理选项。测试设置系统时主要关注三点:

  • 验证设置变更能同步到其他用户(例如 Cordelia 改名后 Hamlet 立即看到);
  • 验证操作出错时会出现错误提示且文案正确;
  • 对组织级设置,验证只读模式下(即未登录管理员账号时)展示是否正确——普通用户应只能查看、不能修改管理员专属项。

附录:手动测试与自动化测试的分工

  • 自动化已覆盖:Markdown 渲染(见 zerver/tests 下的消息相关测试)、频道权限逻辑(zerver/tests/test_channel_permissions.py)、提醒词(zerver/tests/test_alert_words.py)等纯逻辑层;
  • 手动重点覆盖:跨用户实时同步、焦点与自动填充、弹出菜单粘滞性、渲染细节、快捷键与点击路径的联动,以及安全/权限的越权探测
  • 关键源码索引:快捷键解析与分发在 web/src/hotkey.ts,其中get_keydown_hotkey(web/src/hotkey.ts)统一处理多键盘布局与 macOS 修饰键问题;测试用户账号定义在 zerver/lib/test_classes.py;前端自动化测试位于 web/tests,端到端测试位于 web/e2e-tests,手动测试正是对这些自动化测试的兜底与补充。

按本文的分组清单逐项执行,即可建立一套覆盖 Zulip 核心功能域的手动回归体系;多人协作时,直接把各章节分配给不同测试者,就能在约半小时内完成一轮完整的 56 用例窄化矩阵与全功能抽查。

【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询