ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

电商帮助中心列表页用例设计:从分类搜索到分页缓存的全链路测试复盘

电商帮助中心列表页用例设计:从分类搜索到分页缓存的全链路测试复盘 接手这个模块的时候说实话我第一反应是一个帮助中心列表页能有多少测试点无非就是打开页面看几条常见问题、点进去看详情、再返回列表不出意外半小时就能把用例写完。等到真正动手拆解需求又埋进执行里跑了一轮才发现这个最简单的前台模块反而是用例设计里最容易翻车的地方——分类联动、搜索叠加、分页竞态、空态兜底、缓存一致性每一个点单独拎出来都能写出一串Bug。这篇文章就复盘一下我在电商项目里做前台帮助列表用例设计的完整过程。不是列一份checklist就完事而是把每一类用例背后的设计逻辑讲清楚包括我实际执行时踩过的坑。如果你正准备接手类似的电商前台模块或者想看看一个不那么起眼的功能到底该怎么把用例做扎实这篇可以给你一个完整的参考框架。1. 帮助列表模块的业务定位与需求拆解1.1 这个模块到底承担了什么职责在电商项目里帮助中心也就是前台帮助列表通常不是用户高频访问的页面但它的业务价值很明确承接用户自助解决问题的需求降低客服咨询压力。用户下单遇到问题、退款流程有疑问、发票怎么开第一反应往往不是电话找客服而是先去帮助中心搜一下。所以测试这个模块的时候不能只把它当成一个简单的列表页测。它背后连接着内容管理系统运营在后台维护问题条目、检索服务关键词匹配问题标题和正文、埋点系统统计用户搜索哪些问题没得到答案反哺客服话术和帮助文档优化。我跟产品对了几次需求之后把帮助列表拆成了三个核心链路访问链路用户从哪里进入帮助中心个人中心入口、订单异常页引导、结算页帮助链接检索链路通过分类浏览或关键词搜索找到目标问题详情链路点击问题标题查看正文未解决时触发转人工或留言需求文档里不可能把这些全写明白产品可能只给了前台帮助列表支持分类和搜索一句话。所以用例设计的第一步是先把逻辑链补齐而不是直接埋头写用例。1.2 需求澄清阶段我整理出的关键问题正式设计用例之前我会先列一张需求澄清表逐项跟产品和开发确认。这一步做好了后面的用例设计效率能高出一倍。待确认项业务/开发给出的口径对用例设计的影响列表排序规则按更新时间倒序热门问题标记优先展示需要设计时间倒序校验用例构造不同更新时间的测试数据分类Tab和搜索的关系搜索是全站范围不局限于当前分类分类切换不重置搜索词搜索时分类Tab置灰或保持选中分页方式首页返回20条上拉加载更多重点验证加载更多时的数据追加和去重逻辑无搜索结果时展示统一空态文案并推荐热门问题空态的展示条件和推荐规则需要单独设计用例问题详情返回后列表位置保留上次浏览位置需要设计路由缓存相关用例避免返回后回到第一页数据异常时列表展示失败兜底图支持点击重试覆盖接口超时、5xx、网络断开的场景这个表做出来之后我拿给开发做了一次评审当场就纠正了两个理解偏差一是分类Tab和搜索的关系原本我以为切换分类会清空搜索词实际上是搜索时隐藏分类Tab的方案二是返回列表位置保留开发原本设计的是每次进入都重新拉第一页产品确认要保留位置开发临时把详情页改成了原生页面跳转。这些如果等到用例执行时才发现返工成本就高了。2. 正向功能用例从列表展示到详情跳转的完整链路2.1 列表展示规则的细颗粒度用例正向用例的设计原则是先默认所有数据正常把主流程全部走到再去考虑异常。这部分看起来简单但颗粒度要拆得足够细。我按展示维度拆成了以下几组用例列表加载与默认状态进入帮助中心默认展示第一个分类下的问题列表选中态正确列表按问题更新时间倒序排列最新更新的问题排在最前面标记为热门的问题展示专题样式的标识且位置在非热门问题之前问题标题超长时列表页做单行截断处理不换行、不撑破布局列表图片懒加载快速滑动时无占位图闪烁分类Tab交互点击第二个分类列表内容切换为对应分类的问题Tab选中态同步连续快速点击不同分类请求按最后一次点击生效防止竞态当前选中分类的Tab颜色/字体加粗样式正确未选中的恢复默认分类数量超出屏幕宽度时Tab可横向滚动最后一个分类完整可见搜索交互搜索框输入关键字点击搜索按钮/回车展示搜索结果列表搜索命中问题标题和正文内容命中关键词在标题中高亮显示搜索结果数量在分页场景下正确展示共X条结果的总数清空搜索词返回默认分类列表展示这里有两点我想特别提醒。第一列表的排序很容易被遗漏如果运营在后台改了某条问题的更新时间前台列表立刻要反映出来所以我特意构造了一条更新时间最新但不是热门的数据用它来验证时间倒序优先还是热门优先的规则冲突最后和产品确认是时间倒序优先第二连续快速切换分类的用例很重要开发如果没做请求丢弃处理很容易出现A分类的旧请求晚返回覆盖了B分类的新数据这类竞态问题非常隐蔽后面第6章我会复盘一个真实案例。2.2 搜索用例的命中规则与组合场景搜索用例不能只设计能搜到这一个层面。搜索引擎的匹配逻辑通常是分词检索标题、正文、关键词字段都有可能有命中的情况用例要覆盖到不同的匹配命中范围。搜索词精确匹配问题标题返回结果第一位是该问题搜索词部分匹配问题标题返回结果中包含该问题搜索词匹配正文但不匹配标题结果正常返回并在正文中高亮搜索词包含空格空格前后关键词都能独立命中输入一个不存在的搜索词展示空态文案暂无相关内容并推荐热门问题搜索框输入超长文本如200字符不崩溃、不卡死结果为空态或正常匹配搜索词含HTML标签或脚本字符原样展示不解析执行防XSS搜索这块我还做了一次交叉验证搜索结果中某条问题被下架运营在后台调整状态用户再点击进入详情要展示友好的失效提示而不是白屏。这个场景属于搜索列表展示正常但详情失效的组合用例很容易被分开考虑而漏掉。另外搜索和分类的组合关系在不同项目里有不同方案。我们这次确认的方案是搜索时隐藏分类Tab所以用例里就包含搜索后分类Tab隐藏、清空搜索后Tab恢复显示的验证点。如果你参与的项目是搜索限定在当前分类那就要反过来设计跨分类搜索不到内容的用例。方案之间的差异很大用例设计前一定要跟开发对齐。2.3 详情页跳转与返回交互的验证视角帮助详情页跟普通的商品详情页不一样它通常承载的是富文本内容包含图片、表格、段落甚至FAQ折叠面板。从列表到详情再从详情返回列表这条交互链路上的用例要点如下。详情展示从列表点击问题标题正常跳转详情页显示完整标题和正文内容正文中的图片加载失败时展示占位样式不影响文字阅读详情页支持上下滑动浏览长内容标题在滚动时保持吸顶或自动隐藏按实际设计正文含HTML标签时标签被正确渲染不显示源码字符返回交互从详情页返回列表页列表保持上次浏览位置如果产品要求保留位置从详情页返回列表页分类Tab选中态保持之前的选择详情页内点击转人工按钮正常唤起客服会话页面从客服会话返回后详情页内容不丢失这里有一个我实际遇到的产品细节早期需求里返回保持位置没有写进文档开发按每次进详情都重新刷新列表第一页来做。用户从帮助列表中往下翻了很久点了第五条问题返回后列表又回到顶部体验很割裂。后来产品补了需求开发把列表页改成保留页面实例。测试用例在第二版迭代里必须同步增加返回位置保持的回归验证不同版本间的需求变更一定要在用例里留痕。3. 分页与加载机制最容易出Bug的隐藏角落3.1 分页参数与列表状态的用例矩阵帮助列表的数据量级虽然不像商品列表动辄几万条但运营持续往后台更新问答内容之后前端列表走分页是必然的。分页的用例设计需要覆盖参数边界、状态边界和交互边界三类。我们项目使用的是pageNumpageSize的翻页方式每页20条上拉触底加载下一页。测试数据我按照30条、40条、41条、60条、0条这五组数据量分别验证数据总量pageNum顺序预期行为0条第1次请求展示空态不触发上拉加载30条第1页第2页第一页20条第二页10条第二页加载完成后提示没有更多了40条两次各20条第二页加载完成后提示没有更多了41条三次请求最后一页仅1条正常展示不报错60条连续加载三页数据不重复、不丢失列表顺序正确分页状态细节上拉加载过程中底部展示loading状态禁止重复触发加载请求到达最后一页后底部展示没有更多内容提示不再发起新请求第一页下拉刷新时需重置列表数据清理已加载的后续页内容分页请求失败时展示失败提示点击重试仅重新请求当前失败的那一页不触发整表刷新边界模拟快速上拉触发多次加载只发送一次请求防抖逻辑下拉刷新过程中同时上拉加载两个手势不冲突列表滑动到接近底部时提前请求下一页的预加载逻辑正常分页Bug的隐蔽性在于很多测试只验证数据量刚好等于pageSize整数倍的情况忽略了最后一页只有1条这类离散数据。我一个同事A同学之前负责过一个类似模块数据总量设计为41条时最后一条数据展示后列表底部出现一个空白占位块这种问题就冒出来了排查了半天是分页组件在最后一页不满一屏时高度计算异常。测试数据里一定要包含这种听起来很刁钻的数量组合。3.2 刷新机制与缓存数据一致性的验证帮助列表还涉及一个很容易被忽视的维度数据缓存。App端和前端的区别在于App会有本地缓存弱网或离线状态下可能要展示缓存数据。我们项目的帮助列表是H5页面但外层壳子有缓存策略于是我用以下场景做了验证首次正常联网打开帮助列表数据拉取成功后缓存到本地断开网络再次进入帮助列表展示缓存的上一份数据页面有网络不可用提示恢复网络下拉刷新列表更新为最新数据缓存同时更新后台修改某问题标题后前台下拉刷新标题更新正确缓存无旧数据残留缓存一致性用例的核心是验证刷新后展示的一定要是最新数据。我见过不止一次开发把接口响应缓存在内存里下一次进页面直接用缓存导致运营在后台改了内容用户端怎么刷新都不变。所以测试执行阶段每改一条后台数据我都会去前台反复做下拉刷新和重新进入页面两组操作确认两条路径都能拿到新数据才算通过。4. 异常与边界用例数据维度的破坏性测试4.1 空态、超长文本、特殊字符的用例覆盖帮助列表的用户端展示内容全部来自运营在后台录入而运营录入的内容格式不可控。所以数据维度的异常用例本质上是模拟脏数据对前端的破坏力。空态场景某个分类下没有任何问题分类Tab正常选中列表区域展示空态文案和图标搜索无结果时展示暂无相关内容和推荐热门问题区块全部问题数据下架进入页面展示整体空态不影响其他功能使用空态区域点击清除搜索或返回列表操作可正常恢复超长文本场景问题标题长度为50个中文字符列表页截断展示详情页完整展示问题标题为纯英文/数字的超长字符串不换行的连续字符是否会导致布局溢出问题正文包含超长段落详情页支持流畅滚动无卡顿分类名称超长时Tab文字截断或换行不撑破导航栏特殊字符场景问题标题包含HTML标签字符如 xxx列表页按普通文本展示不解析样式搜索词含SQL关键字、脚本片段、emoji字符请求正常无报错或注入问题问题内容包含unicode特殊字符如全角空格、不可见字符详情页正常渲染每次聊到边界用例都有同行觉得这是在吹毛求疵。但内容型页面的特点就是输入不可控运营同学复制粘贴来的内容什么都有——我从后台导出的测试数据里标题带换行符的、正文里混着半个表情符号的、分类名超过十个字的全都在测试环境里真实出现过。超长文本在iPhone小屏上能把列表撑得稀碎特殊字符在部分Android机型低版本WebView里会渲染异常这些用例不是影视剧里的科幻情节而是运营上线一周就能遇到的现实。4.2 接口异常与弱网容错的校验设计接口层的异常用例我习惯用一个四层递进模板单接口异常列表接口返回5xx、超时、返回非JSON格式页面展示兜底逻辑用户可重试多接口联动异常列表接口正常但搜索接口异常搜索入口提示失败不影响分类浏览请求参数异常搜索词为空字符串、纯空格、特殊编码请求不发或提示输入有效内容网络环境异常飞行模式下打开页面、WiFi切换到4G、弱网高延迟环境下的加载表现弱网场景我建议用单机模拟不要只在浏览器开发者工具里切Network。开发者工具的Throttling只能模拟固定延迟真实弱网下的连接中断、请求半途取消、超时后重试这些状态用工具模拟不够真实。我习惯直接在测试机上配合网络工具构造弱网环境或者最简单的方式——拿一台旧手机连着一个信号不好的WiFi实测下来的问题发现率比模拟环境高很多。接口异常这块务必验证重试之后数据一致性。比如列表接口第一次超时用户点了重试第二次请求成功返回数据此时列表应该只有一份数据不能出现重复加载两条或loading态未关闭的情况。这个用例我在回归里反复跑过每次开发改动网络层多少都会在这块出点问题。5. 测试数据准备与执行策略怎么高效把用例跑完5.1 前置数据搭建的两条路帮助列表的测试数据准备看起来简单实际上很容易拖慢进度。我这次数据准备工作踩了一个效率坑分享出来给大家一个参考。第一条路是走后台管理系统配置。运营后台通常提供问题分类管理、问题新增编辑、上架下架操作。优点是流程真实操作一次就知道后台长什么样缺点是配置效率低一条问题从建立到上架要填标题、正文、分类、排序权重、热门勾选至少两分钟要凑出分页需要的60条数据手点就需要近两个小时。第二条路是直接操作数据库。我在测试环境里直接往帮组表插入数据一次SQL插入十条效率高非常多。INSERT INTO help_question (category_id, title, content, is_hot, sort_weight, updated_at) VALUES (1, 如何申请退货, 退货申请流程……, 0, 1, NOW()), (1, 运费怎么计算, 运费计算规则……, 1, 2, NOW()), (2, 发票开具说明, 发票申请流程……, 0, 1, NOW());需要注意操作数据库之前要看清楚表结构特别是软删除字段和状态字段。我就遇到过表里有一个deleted标志位默认值没设置导致插入的数据在列表页查不出来排查了半天才发现是deleted字段没赋值。不同的项目数据库设计不一样插入语句前先查一下已有数据的完整字段值复制模板改成自己的数据这个习惯能省很多麻烦。数据准备完成后我建了一个测试数据清单把每条数据对应的分类、标题长度、是否热门、更新时间都记清楚。这样执行用例时任何一条数据展示异常我能立刻定位到是哪条数据引起了问题也能快速通过SQL去反查前端请求拿到的数据对不对。这个用例-数据-数据库记录三者的映射关系是执行效率的重要保障。5.2 用例优先级划分与冒烟测试用例选取用例设计和执行之间优先级划分是必做的一步。不是所有用例都要在每轮版本回归里全部执行合理的分层能让你在有限的时间里找到最有价值的覆盖。我这次把帮助列表的用例分成了三个优先级优先级用例范围执行时机P0帮助中心可访问、默认分类列表加载、关键词搜索、点击问题进入详情每次版本冒烟必测P1分类切换、分页加载、详情返回位置保持、空态展示、搜索无结果功能提测时全量执行P2超长文本、特殊字符、缓存一致性、弱网场景、埋点数据每轮迭代至少覆盖一轮冒烟测试我选了六条用例作为快速回归的最小集合进入页面列表正常展示、分类切换列表内容更新、搜索命中标题问题、点击问题进入详情、返回列表位置保持、下拉刷新数据更新。这六条覆盖了用户日常使用的整个闭环如果这六条都不过那这个模块基本不能上线。埋点数据这条我想单独提一下。帮助列表通常会上报以下几个埋点页面曝光、分类点击、搜索行为、问题点击、无结果搜索词。这些埋点虽然不影响功能正确性但对业务侧判断用户需求很有价值。测试时我会确认每个埋点事件在正确的时机上报字段名和值域符合埋点文档尤其是无结果搜索词这个埋点它是客服团队优化帮助内容的依据漏报会导致业务决策缺数据。很多测试同学会忽略埋点验证我自己的经验是在大版本提测阶段花十几分钟把主要埋点跑一遍后面能避免很多沟通扯皮。6. 执行过程中摸到的坑完整排查链路的复盘6.1 分类与搜索双条件叠加的歧义问题第一轮功能测试跑下来所有用例看着都过了但我在自由探索时发现了一个交互逻辑上的歧义用户在搜索框输入关键词后按我的理解分类Tab应该保持并可切换结果直接在搜索状态下切换不了分类而且搜索框还留着之前输入的关键词界面状态显得很矛盾。这个问题的排查链路是这样的复现步骤进入帮助列表 → 输入退货 → 点击搜索 → 尝试点击分类TabTab完全无响应界面现象不仅Tab无响应而且搜索框里的文字还在用户会理解为当前处于退货搜索结果为什么不能切换分类抓包分析查看网络请求日志发现点击Tab根本没触发新的请求前端代码定位开发定位到搜索组件在非空状态下给Tab容器添加了pointer-events: none的样式强约束了搜索态不可切换分类需求核对翻出最初的评审记录产品确认为搜索时隐藏分类Tab方案但前端实际做成了搜索时Tab置灰不可点——方案B实现成了方案C解决开发按评审结论改为搜索时隐藏分类Tab清空搜索词后Tab重新出现这个Bug的根因不是开发能力问题而是实现时对隐藏和禁用的理解偏差。这个变体在评审文档里是用一句轻描淡写的话写下的搜索时分类隐藏到了前端手里变成了禁用。所以我在后面的项目里形成一个习惯需求评审时的交互细节在用例设计阶段必须转成明确的用例描述能写多细写多细尽可能不让隐藏和禁用这种语义差别成为歧义点。6.2 分页越界与缓存数据不一致的根因分析第二个坑在分页上。测试环境数据总量60条我连续触发加载第1页、第2页、第3页一切正常。就在我以为分页没问题时我用一个特殊场景模拟出了问题进入列表页上拉加载到第3页然后切换到另一个分类再切回第一个分类列表直接跳到了第2页而且第4、5、6条数据和第一页的第16、17、18条完全重复。我记录的排查链路如下初步分析切回分类后列表数据混乱怀疑是分类切换时没有重置pageNum查看请求日志发现切换分类时前端确实发起了pageNum1的请求但列表落地数据里有第2页的遗留内容说明旧的第2页数据没有被清空检查前端逻辑开发确认分类切换时为了加载更快保留了之前的数据容器直接追加了第一页的数据旧页面数据未清空根本原因数据容器复用时没有在切换分类时调用clearList()方法修复验证添加清空逻辑后反复切换分类验证数据无重复列表回到第一页这次的教训是分页用例的覆盖不能满足于正常加载成功还要覆盖加载后切换场景再回来的状态重置。列表类组件最常见的Bug就是状态没有随场景重置。第三个我印象比较深的是缓存问题。帮助列表第一版上线后运营反馈前一天晚上在后台更新了某个问题的标题第二天用户端打开还是旧标题。我上手排查时发现App离线包缓存策略把帮助列表页面整个缓存了。运营更新的内容没有触发页面缓存失效所以用户拿到的是旧版本页面渲染出的旧数据这个Bug涉及的内容分发链路比单纯前端逻辑要复杂得多。修复方式是在页面请求中加入资源版本号后台内容变更时更新版本号客户端每次启动都拉最新页面。这个案例给我的启发是帮助内容这类低频变动、高缓存的页面版本更新机制要作为测试用例的必要维度每次发版前后都要检查缓存版本是否更新否则用户反馈内容没变十有八九就是缓存搞的鬼。6.3 执行过程中沉淀的几条规避策略踩完这些坑之后我做了一次复盘整理了三条对后续同类型模块很有帮助的策略一、列表类页面用例设计前先建立数据基线意识。每条测试数据有唯一的预期表现排序位置、是否热门、所属分类用例执行时对照基线核对比直接看有没有展示更能发现问题。二、搜索和分类的交互方案必须在需求澄清时明确到操作A之后操作B是否还可用这个颗粒度。模糊表述是Bug的温床。三、分页相关Bug集中在状态重置、竞态处理和缓存更新三个环节。每次测试安排一个专门切换场景的时间段把列表、刷新、翻页、返回、切换Tab连续做组合操作这个时间段里找到的Bug比按部就班执行用例时多不少。最后说一点个人体会。帮助列表这个模块在电商项目里的地位不算高排期紧的时候也容易成为资源挤压的对象但它的用户自助属性决定了它的可靠性直接影响客服压力。如果用例只覆盖快乐路径搜索随便搜一下、列表能打开就算过那上线后用户遇到真正问题时会发现帮助中心本身也有问题这种体验损伤对平台的可信度是实打实的。对我来说把帮助列表用例做扎实的方法不算玄学就是老老实实拆需求、列数据、追竞态、验缓存——听起来没什么高深技巧但想做到位每一步都得花时间。希望这篇复盘对你也有一点参考价值。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进