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),但凡是能实际测试的功能,项目依然坚持配合手动测试。原因有三:
- 某些缺陷类型只有真人操作才能暴露——例如悬停态(hover state)的布局抖动、弹出菜单的“过于粘滞”(点击别处不消失)、多窗口会话下的实时事件推送等;
- 手动测试能帮助开发者加深对系统的理解——在逐项点击与按键的过程中,会自然思考某个功能现有的语义(semantics),这对正在开发该功能的开发者尤其有价值;
- 测试即学习——QA 过程本身就是对新功能最直观的验收。
本文假设读者已经能够搭建本地开发服务器并在浏览器中打开 Zulip,同时具备基本的 Zulip 使用常识。开发环境的搭建方式可参考 docs/development/setup-recommended.md 与 docs/development/overview.md。
二、测试账号体系与基本原则
2.1 使用莎士比亚角色账号
手动测试建议以Cordelia作为主测试用户,Hamlet作为她的主要对话对象,涉及管理员功能时使用Iago。如需验证“Cordelia 收不到不属于她的消息”这类隔离性场景,则把消息发给Othello或Prospero。
这些角色并非文档虚构,而是 Zulip 开发环境内置的示例用户。后端测试基础设施在 zerver/lib/test_classes.py 中通过example_user_map定义了整套账号:
| 用户名 | 邮箱(开发环境) | 典型用途 |
|---|---|---|
| hamlet | hamlet@zulip.com | 常规非管理员用户,主对话对象 |
| cordelia | cordelia@zulip.com | 主测试用户 |
| iago | iago@zulip.com | 管理员账号,用于管理功能 |
| prospero | prospero@zulip.com | 隔离性验证用旁观用户 |
| othello | othello@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.code与CODE_TO_QWERTY_CHAR映射(web/src/hotkey.ts)把西里尔等布局下的物理按键换算成 QWERTY 等价字符,因此俄语、中文等输入法环境下快捷键依然可用;macOS 下按住Cmd+Shift时浏览器会报告未加 Shift 的 key,同一映射也能正确处理(web/src/hotkey.ts)。测试时若发现快捷键“不响应”,可以优先怀疑是e.key与e.code解析路径的分支问题。
3.2 从消息视图窄化(Narrowing)
窄化指切换到消息的不同视图,可以通过热键或鼠标完成:
- 热键路径:
a→ 进入 Combined feed(综合消息流)视图;s→ 窄化到当前选中消息所在的频道(先在消息区选中消息,再到左侧边栏确认筛选结果);S→ 窄化到当前消息的主题(同样到侧边栏确认);v→ 跳转到私信(direct messages)视图。
- 点击收件人栏(recipient bar):分别测试窄化到频道、窄化到主题、窄化到与单个用户的私信、窄化到群组私信。
- 点击 Zulip logo:窄化到某主题后点击 logo,确认进入了 Recent conversations(最近会话)视图。
四、消息框(Messagebox)测试
消息框测试重点是全部键盘快捷键与点击处理器的联动,以及三种视觉形态的渲染:
- 含发送者信息的消息;
- 不含发送者信息的消息(连续消息中仅第一条显示发送者);
/me动作消息。
4.1 三种形态的操作流程
- 含发送者形态:窄化到新主题发送一条消息(此时会显示发送者姓名)→ 编辑该消息,
EDITED标记应出现在发送者姓名旁。 - 不含发送者形态:再发一条消息(不再显示发送者)→ 编辑它,
EDITED标记应出现在左侧头像所在的列。 /me形态:发送/me test message,消息应并排在发送者姓名旁显示;编辑后EDITED标记出现在消息本体旁边。
4.2 点击处理器与热键
对上述三种形态逐一验证以下交互:
| 交互 | 操作 |
|---|---|
| 发送者浮层(Sender popover) | 点击含发送者消息的头像和姓名;对所有消息按u打开发送者浮层 |
| 消息回复 | 点击消息本体回复;r或Return回复;>引用消息;@提及并回复 |
| 表情回应(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 高强度编辑演练
按以下脚本依次操作,覆盖“改单条、改多条、全改”三种粒度:
- 向主题
original发一条消息; - 编辑该消息内容;
- 再向
original频道发两条消息; - 开始编辑一条消息,然后取消编辑;
- 把第一条消息的主题改为
change1(仅此一条); - 窄化回
original,再发一条消息; - 把最后两条消息的主题改为
change2; - 窄化回
original,再发两条消息; - 编辑第 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 在切换视图后仍能收到新消息:
- 给 Cordelia/Othello 发私信(群组私信);
- 给 Cordelia 发私信;
- 给 Othello 发私信;
- 发到
Verona/foo; - 发到
Verona/bar; - 发到
Denmark/foo; - 发到
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-Enter或Cmd-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;
- 清除过滤条件;
- 用
A和D热键循环切换频道(注意大小写区分: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甚至不应知道其存在。
具体反向用例:
- 未邀请 Cordelia 的公开频道:
- 验证 Cordelia 能在自己的设置中看到该频道;
- 验证 Cordelia无法向该频道编写消息;
- Hamlet 发消息后,验证 Cordelia什么都看不到。
- 先订阅 Cordelia、再由 Iago 用管理页撤销订阅的公开频道:
- 验证频道先出现在 Cordelia 左侧边栏、随后消失;
- 尝试用
channel:foo之类的“偷偷摸摸的搜索”访问该频道。
- 未邀请 Cordelia 的私密频道:
- 验证 Cordelia无法向该频道编写消息。
十一、搜索(Search)测试
主要任务是玩转搜索建议(autocomplete)。选中某个建议后,验证消息视图与搜索条件一致、左侧边栏反映当前窄化状态。若某个搜索合法地返回空结果,可让 Hamlet 发一条匹配消息后再看。
11.1 应支持自动补全的搜索
channel:designchannel:Verona topic:Verona1channel:Verona keyword(频道 + 关键词)sent by me@-mentions(提及我的消息)starred messages(已加星标消息)messages sent by Hamletdirect messages with Hamletdirect 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
- 在文本框中输入
public1,点击Create new channel; - 选择People must be invited,验证此时无法勾选Announce new channel in #[announcement channel](私有频道不能广播);
- 改回Anyone can join使其公开;
- 勾选 Hamlet;
- 点击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)测试
大部分快捷键已在前述任务中覆盖,这里做专项收尾:
- 按
?打开键盘帮助对话框; - 校对对话框中的拼写错误;
- 关闭对话框;
- 通过齿轮菜单重新打开键盘帮助;
- 挑一个不常用的快捷键,实验其用法(可对照 web/src/hotkey.ts 中的完整快捷键映射)。
十五、杂项菜单(Miscellaneous menu options)
确保以下选项能打开正确的帮助页面:
- 校对并抽查:Message formatting(消息格式)、Search filters(搜索过滤器);
- 确认帮助在新浏览器标签页中打开:Desktop and mobile apps、Integrations、API documentation。
十六、邀请用户与新手教程(Inviting users / tutorial)
- 用好友列表下方的邀请链接邀请
ignore@zulip.com,但不做后续操作(验证“已发送邀请但未完成”的状态); - 用齿轮菜单完整邀请
foo@zulip.com; - 到开发控制台(development console)获取
foo@zulip.com的登录链接——这是开发环境特有的取号方式; - 走一遍完整的注册(signup)流程;
- 跟随新手教程(tutorial);
- 用齿轮菜单登出;
- 重新以 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),仅供参考