ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

测试用例设计实战:六种方法、流程与工具详解

测试用例设计实战:六种方法、流程与工具详解 很多人把测试用例设计当成一件抄抄补补的体力活照着需求文档把功能点列出来再在每个功能点下面填上“输入什么、点击什么、预期什么”就觉得工作量做完了。真实情况是用例设计是最能在早期暴露理解偏差、最能决定线上质量的一环。你在需求评审时没想明白的业务分支最后大概率会变成用例里的“待确认”然后上线后变成线上的一个缺陷。这篇文章我会把测试用例设计这件事系统拆一遍从一份用例应该长什么样到六个常用的设计方法再到落地流程、工具模板和坑点复盘适合刚入行的测试工程师参考也适合带新人的小组长用来做团队内训内容尽量贴近实际干活场景减少“课堂上唱高调”的部分。1. 先搞清楚测试用例到底是什么为什么设计比执行更值钱1.1 一份完整测试用例的七个组成要素测试用例本质上是一组“输入条件 执行步骤 预期结果”的集合用来验证某个特定场景下系统行为是否符合预期。新人刚接触时最容易犯的错是以为只要把操作步骤写出来就行。实际上一份能反复使用、能追溯需求、能支撑自动化脚本的用例至少需要包含七个要素用例编号这是用例的身份证一般按“模块_功能_序号”来命名比如“USER_REG_001”方便后续检索、关联和执行统计。所属模块说明这条用例归属于哪个功能模块否则用例一多很快就分不清谁是谁。优先级P0到P3的评级决定回归测试时先跑哪些、版本紧张时可以砍掉哪些。前置条件用例执行前系统必须处于什么状态比如“用户已注册”“已登录”“订单处于待支付状态”。测试步骤可执行的、按顺序排列的操作每一步都要明确到点击哪个按钮、输入什么内容。测试数据具体传给系统的值包括正常值和异常值。数据一定要给具体不能写“输入一个合法手机号”要直接写“输入13800000000”。预期结果执行后系统应当表现出的可观察行为要具体到页面跳转、接口返回、数据库变化、提示文案。其中预期结果往往是被写滥的重灾区。我见过太多用例写上“注册成功”四个字就结束了执行的人根本不知道“成功”到底长什么样。合格的写法应该是“注册成功并自动登录跳转首页右上角显示用户昵称”。有了这样清晰的标准执行结果才能被准确判定也会在将来转化为自动化断言时节省大量沟通成本。1.2 为什么“设计”环节才是质量的关键很多团队把测试资源集中在执行阶段夜以继日地跑回归结果漏测率还是居高不下。原因很简单执行测的是系统是否符合用例设计测的是系统是否覆盖了业务风险。如果用例集合本身就有漏洞执行速度再快也只是在错误的地图里勤奋奔跑。用例设计的价值可以从几个方面来看第一设计决定了覆盖率的天花板。代码覆盖率、需求覆盖率、路径覆盖率无论用什么指标衡量最终都取决于你设计了哪些用例。第二好的用例是可以复用的资产。项目迭代、人员流动、自动化脚本建设全都依赖一份沉淀良好的用例集。第三用例是需求理解的“对齐工具”。在评审阶段拿用例去和产品、开发对一遍通常能提前发现需求里互相矛盾的地方。第四用例是知识传递的载体。新人接手存量功能最快的上手方式就是读懂现有用例而不是翻代码或者一遍遍问老同事。我自己带团队时还有一个习惯每轮迭代结束后会把线上缺陷拉出来逐个反推“这条缺陷如果按我们已有的用例执行会被拦截吗”。结果经常是“不会被拦截”因为用例根本没覆盖到那个场景。这种复盘才是提升用例设计能力的真正抓手比生硬地要求“提高覆盖率”有用得多。2. 六大经典设计方法按业务场景对号入座2.1 等价类划分把无限输入压成有限集合等价类划分解决的核心问题是输入可能有无限多种但我们不可能无限地测试。它的思路是把所有输入按“系统是否做相同处理”分成若干个集合同一个集合里取一条代表数据即可。拿“年龄输入框”举例业务规则是“0到17岁显示未成年18到59岁显示成年60岁及以上显示老年”。这个时候输入空间就可以分成三组有效等价类未成年人、成年人、老年人以及若干组无效等价类负数、非数字、超过合理范围的超大数。有效等价类验证功能逻辑是否正确无效等价类验证系统在异常输入下是否健壮。这里我要着重强调一下无效等价类的价值。新手写的用例里最缺的往往是无效等价类。比如一个登录功能只测“正确账号正确密码能登录”不测“错误账号”“错误密码”“账号不存在”“密码为空”那上线后用户输错一次密码系统可能弹出个500页面。我们做测试的常说“用户永远比你想象的更会乱点”无效等价类的目的就是替用户把这些乱点行为提前试一遍。实操上有一个原则值得记住每个输入条件至少设计一个有效等价类并且尽可能多地设计无效等价类一条用例最好只覆盖一个无效等价类这样失败时能精准定位是哪个输入的问题。2.2 边界值分析Bug最爱的藏身之处如果说等价类划分是一个把输入“分堆”的过程边界值分析就是在堆的“边缘”深挖。大量缺陷集中在输入范围的边界上根本原因在于开发写判断条件时非常容易把“”写成“”或者漏掉一个等号。这种缺陷用中间值很难测出来必须用贴近边界的值去试。边界值分析有一个经典口诀上点、离点、内点。拿一个输入范围0到150的数值字段举例区间类型上点离点内点闭区间 [0, 150]0、150-1、15175开区间 (0, 150)0、1501、14975大多数业务系统里判断条件都习惯写成“ 0 150”也就是闭区间所以最常见的组合是取0、150、-1、151、75这几个值。但需要提醒的是边界值分析同样要关注“数据的边界”而不仅仅是“数值的边界”。比如输入框允许的最大长度是6位那999999和1000000就是边界比如允许上传的图片大小是2M那刚好2M的文件和2M1字节的文件就是边界。我踩过一个很典型的坑给一个金额字段只测了最大值和最小值没有测“超过最大值的合理级数”结果遗漏了输入1000000000时前端页面金额展示溢出、布局错乱的问题。所以边界值分析不能只盯着业务规则里的边界还要关注技术实现层面的边界比如位数、字节数、文件大小、分页数量等。2.3 判定表与因果图多条件组合的利器当需求里有多个条件、多个结果而且结果由不同条件的组合决定时判定表是最好用的落地工具。判定表由四部分组成条件桩有哪些条件、条件项每个条件取值、动作桩有哪些动作、动作项该条件下执行哪些动作。举个例子一个登录功能判定条件包括“用户名是否合法”“密码是否合法”“验证码是否输入正确”动作只有“允许登录”和“拒绝登录”。三个布尔条件理论上有2的3次方种组合也就是8种判定表能把全部组合列出来再根据业务规则勾出每种组合对应的动作不会漏也不会冗余。很多人会问因果图和判定表到底什么关系我的理解是因果图更多是分析工具用来在逻辑比较复杂时理清条件之间的依赖关系判定表是最终可执行的产物。实际工作中我很少画正式的因果图因为画图成本高而且多人协作时维护不方便。但需求特别复杂时比如保险定价、风控规则、审批流我建议至少先在纸上画一下条件之间的因果关系再转成判定表这样逻辑能清晰不少。使用判定表也有边界条件数量在4到8个时效率最高。如果条件数量过多全组合用例会指数级膨胀这时候就要考虑用正交实验法或者场景法来压缩用例数量。2.4 场景法从用户操作流反推用例场景法是目前互联网产品测试中应用最广泛的方法。它的核心思路是不盯着单个输入字段看而是画出用户从开始操作到结束的完整流程把基本流和备选流都找出来每条路径就是一条或一组用例。拿电商下单流程来说基本流是“加购物车 - 确认订单 - 提交订单 - 支付成功 - 订单完成”。备选流可以有多个确认订单页修改收货地址、提交订单后支付失败再换一种支付方式、支付超时订单自动取消、支付成功后发现库存不足触发退款等。每条备选流还可以再和基本流组合成新的场景比如“支付失败后重新支付成功”就是一个完整业务闭环。场景法特别适合做冒烟测试用例。每次发版前先把基本流场景跑一遍如果基本流都走不通就别试探性功能了先把版本打回去再说。这个习惯能替你节省大量无效执行时间。场景法有个容易忽略的点备选流不只是“报错分支”还包括用户主动取消、超时中断、重复操作、中断后恢复等状态切换。判断一个流程是否覆盖完整可以问一句“如果用户在这一步停下来系统会怎样”。比如提交订单后直接杀掉App、支付回调延迟10分钟、用户连续点击两次提交按钮这些都是真实会发生的场景别指望用户会老老实实按你说的流程操作。2.5 正交实验法用最少的组合覆盖最多的因子正交实验法解决的是“组合爆炸”问题。比如一个搜索页面有搜索类型商品、店铺、活动、排序方式综合、销量、价格、价格区间不限、0到100、100以上三个因子每个因子三个水平全量组合是27种手写还能忍但如果因子变成5个、水平变成4个全量组合是1024种这在迭代周期内根本测不完。正交实验法的原理是通过正交表选择有代表性的组合保证任意两个因子的所有水平组合至少出现一次从而以远小于全组合的用例数覆盖主要风险。三因子三水平可以用L9(3^4)正交表9条用例即可覆盖所有两两组合。不过说实话手工查正交表对很多测试同学来说门槛偏高。我更推荐一个替代方案用微软开源的PICT工具做pairwise组合生成。你只需要把因子和水平写进一个模型文件工具会自动生成最小组合集比手查正交表效率高得多而且生成结果可以直接导成Excel或表格格式。需要提醒的是正交实验法并不适用于所有场景。如果业务逻辑对条件顺序、状态依赖极其敏感比如状态机流转、审批链、支付回调两两组合可能丢掉关键的三因子组合。那种场景下还是回到判定表或场景法更靠谱。2.6 错误猜测法经验主义并不丢人错误猜测法严格来说不算一种结构化方法它靠的是测试人员对业务和技术踩坑经验的前置预判。很多前辈看不起这种方法觉得“没有章法”但我自己的体会是恰恰是这种“没有章法”的方法能在紧急上线前帮你抓住最容易出问题的那批用例。怎样做错误猜测才不流于拍脑袋我建议每个测试人员维护一份自己的“易错点清单”每次发现线上缺陷都往清单里记一笔。时间久了你会发现缺陷的类型高度重复输入超长、空值、特殊字符、重复提交、并发覆盖、分页边界、排序不稳定、缓存不一致、第三方接口超时……把这些高频错误点转成新项目的用例直接就能见效。常见的易错点可以先从这几类入手输入类空值、超长、包含引号、包含emoji、首尾空格、全角半角、SQL注入字符、HTML脚本。操作类按钮重复点击、网络超时后重试、页面刷新、前进后退、浏览器关闭再恢复。数据类海量数据显示、分页最后一页、排序字段为空、并发修改同一记录、幂等性问题。兼容类主流浏览器、不同屏幕分辨率、不同操作系统、中文以外的语言环境。错误猜测法的产出质量完全取决于团队有没有建立缺陷复盘机制。没有复盘、没有积累经验就永远只是个人脑子里的模糊印象无法转化为组织的测试能力。3. 一套能落地的测试用例设计流程3.1 从需求文档到测试点需求拆解的三种路径拿到一份需求文档最忌讳的就是从头到尾读一遍然后直接打开用例管理工具开始写。中间缺了“拆解测试点”这一步写出来的用例大概率是东一块西一块的。我常用的拆解路径有三条可以并行使用路径一按业务规则拆。把需求里的每一条业务规则提取出来比如“VIP会员下单打8折”“优惠券不可与其他促销叠加”每一条规则都至少对应一个测试点。这是最核心的路径业务规则漏了其他什么都白搭。路径二按用户操作路径拆。从用户进入功能页面的第一个动作开始一步步走到最终结果中间每个分支都记录为一个候选测试点。这条路径能保证核心流程不丢。路径三按数据和字段拆。把所有输入字段列出来逐个分析取值范围、格式要求、约束条件再结合等价类和边界值去生成测试点。这条路径适合表单密集的功能。以“用户注册”为例业务规则会拆出“未注册手机号可注册”“已注册手机号提示已注册”“需要通过短信验证码校验”等测试点操作路径会拆出“从首页进入注册页、填写手机号、获取验证码、填写密码、提交”的完整链路字段层会拆出手机号格式、验证码有效期、密码强度、两次密码一致性等测试点。三条路径的结果合并、去重再形成正式用例覆盖率就有了结构性保障。3.2 用例优先级用P0/P1/P2/P3给用例分级优先级设计的目的是让有限的测试资源先跑到最重要的用例上。我见过不少团队的用例表里优先级一栏全是P0等于没有优先级。合理的分级标准要考虑两个维度业务影响度和使用频率。按这个思路我通常这样划分P0核心功能主流程、会造成资金或数据损坏的场景、用户高频使用路径以及一旦失败必须阻止上线的场景比如登录、支付、提交订单。P1核心功能的重要分支、比较常见的异常场景、关键兼容性节点比如支付失败重试、库存不足提示。P2边缘场景、非核心功能、低频操作比如主题换肤、个人资料的头像裁剪。P3UI细节、文案风格、易用性优化类这类用例即便失败也不应阻塞发版。真实项目中P0和P1加起来通常控制在总用例数的30%到40%。如果P0用例过多说明你对核心业务风险的识别还不够聚焦如果P0用例过少说明主流程覆盖可能不足。每次版本迭代开始前先圈定本轮回归的P0用例集比打开几百条全量用例盲目执行要高效得多。3.3 用例评审怎么让评审不流于形式用例评审是很多团队的“例行公事”开着会念文档一小时下来没有任何有效反馈。要打破这种局面关键是把评审从“朗读会”改成“找茬会”。我在实践中的做法是会前至少提前半天把用例文档或链接发出去明确提出“会上只讨论问题不逐条读”要求产品重点看需求理解是否一致开发重点看实现逻辑有没有特殊分支遗漏测试同事则重点关注覆盖有没有盲区。会上按模块逐段过每过一个模块就问三个问题这个模块的关键业务规则有哪些哪些场景我们不打算测哪些用例的预期结果还不明确会后整理评审意见逐条标记“修改/不修改/延后”在下一次评审前同步改动结果。这样做下来评审的产出就不仅仅是几个错别字的修正而是能真正补掉几条关键用例。我印象最深的一次评审开发随口说“这个状态机还有一个分支是超时自动关闭需求文档里没写”恰好那条路径在评审前所有人都没注意到最后补上用例并在测试中真的抓到了一个严重缺陷。4. 测试用例设计中的常见坑与避坑实录4.1 用例粒度太细变文档太粗变清单用例粒度是新手最容易走极端的地方。一个页面几十个字段如果每个字段的每个异常情况都拆成独立用例页面用例轻松上百条执行又慢又碎需求一改动就牵连一大片。反过来如果一条用例塞进十几步操作、横跨好几个页面任何一个步骤失败整条用例就红定位问题要花半天。我自己总结的粒度标准是一条用例验证一个核心场景步骤控制在3到10步之间每个步骤的预期结果尽量落到具体页面或数据结构上。对于表单密集的功能不要按字段拆用例而是分层设计输入层校验用少量用例覆盖所有字段的共性规则比如必填、长度、特殊字符业务层校验再针对每个关键字段单独设计。判断粒度过细还是过粗还有一个很简单的方法如果执行一条用例的时间不超过1分钟大概率粒度太细如果超过10分钟大概率粒度太粗。当然这个标准随着自动化程度变化会有所不同但方向是准确的用例粒度要服务于执行效率和问题定位效率而不是逼死自己。4.2 用例冗余与维护如何让用例资产不烂尾用例集和代码一样是需要持续维护的资产。很多团队的用例库用着用着就变成了一座垃圾场几百条过时用例、几十条重复用例、还有一些前置条件已经不可能再成立的僵尸用例。每次回归跑全量用例三分之一的时间都在跑没意义的步骤。我在团队里定了一个比较简单的维护节奏每个迭代版本上线后花一小段时间做用例体检重点清理三类问题——需求已变更但用例没同步的、功能已下线但用例还留着的、同一场景被不同人重复提交的。同时每个季度做一次全量用例审查把过去三个月从未执行过的用例找出来人为评估是降级、重构还是删除。不要怕删用例死掉的功能留着用例只会稀释整个用例集的信任度。换个角度说我们要对用例数量保持警惕。拿用例数量当考核指标的团队一定会收获大量低价值用例。一条能真正命中缺陷的高价值用例它的价值远超过一百条只会重复点击下一步的流水账。4.3 需求变更后用例怎么跟可追溯性需求一变更测试影响范围到底有多大很多团队凭感觉拍脑袋。要解决这个问题前提是可追溯性——每条用例都能对应到某个需求点每个需求点都能找到它覆盖的用例集合。最简单的落地方式是在用例表里增加“需求ID”字段与需求管理平台上的编号保持一致。再进一步可以维护一张“需求-用例映射矩阵”行是需求点列是用例ID交叉打勾。需求变更时先从需求平台找到变更的需求点再通过映射矩阵筛出受影响的用例逐个更新前置条件、步骤或预期结果。有些测试管理平台比如Jira配合Xray、TestRail、禅道自带需求关联和覆盖率统计功能可以直接用。但我始终认为工具只是辅助关键在于团队有没有建立“变更必查影响范围”的流程习惯。否则哪怕工具再强大用例也会在一次次变更中逐步失真最后回归测试就变成了走形式。5. 工具与模板让用例真正“活”起来5.1 从Excel到思维导图再到测试管理平台用例设计工具的选择不要盲目追新要匹配团队阶段和用例规模。迭代节奏快、用例量不大、团队人数也少时Excel或在线表格是最灵活的选择想加一列统计就加一列想筛选就筛选。但用例量超过几百条后Excel的问题就开始暴露权限混乱、多人编辑冲突、版本管理困难、数据统计能力弱、无法和需求缺陷串联。设计阶段我个人强烈推荐用思维导图比如XMind。它不是用来存放正式执行记录的而是用来拆测试点、画场景分支、组织思路的。很多团队用思维导图一步到位把测试点画完再复制到Excel里补字段效率反而比直接在Excel里空想高很多。中大型团队、自动化回归比例较高的场景建议把用例正式沉淀到测试管理平台。Jira配上Xray或TestRail都是很成熟的方案国内团队也常用禅道、PingCode、云效这类平台。它们能关联需求、缺陷、执行记录自动生成覆盖率统计还支持定时回归。我的建议是设计时用思维导图执行和管理时用平台这两者互相配合不要互相替代。5.2 一份我长期在用的用例模板下面这份模板是我在实际项目中长期使用的字段不算多但覆盖了执行、追溯、统计需要的核心信息字段说明示例用例编号模块_功能_序号USER_REG_001需求ID关联需求编号REQ-2025-001所属模块功能模块名用户注册优先级P0-P3P1用例标题一句话描述场景使用未注册手机号成功注册前置条件执行前系统状态用户已进入注册页验证码可正常发送测试步骤按顺序的操作步骤1.输入手机号2.点击获取验证码3.输入验证码4.输入密码5.点击提交测试数据具体输入值手机号13800000000密码Abc123456预期结果可验证的结果注册成功并自动登录跳转首页右上角显示用户昵称实际结果执行后填写待执行执行状态未执行/通过/失败/阻塞通过执行人最后执行的人张三备注特殊情况记录验证码有效期60秒需在1分钟内完成输入模板里的关键在于“预期结果”不能写空话一定要写可观察、可断言的细节。同一份模板如果后续要转自动化还可以在备注里加上接口返回码、数据库变化量等更底层的信息方便自动化脚本编写时直接参考。6. 我这些年最大的体会如果只能选一句话总结测试用例设计的核心我会说用例设计比的不是勤奋是对业务的理解深度。方法再多最后都要落到“这个业务到底怕什么出问题”的判断上。我见过方法背得滚瓜烂熟但用例依旧稀烂的团队也见过没有学过任何理论但靠长期深耕业务写出极高价值用例的老测试。方法只是帮你把经验系统化的工具业务理解才是底层能力。所以我最后的建议是每季度或至少每半年把线上缺陷和线上客诉拿出来做一次复盘逐条反推“我们的用例集为什么没有拦住这条问题”。这个动作做上两三轮你对自己的用例设计薄弱点会有非常清醒的认识下一次设计新的功能时自然会多问一句“这里是不是也有同类坑”。另外别嫌用例维护烦。一份半年没动过的用例集基本已经和系统真实行为脱节一份每次迭代都在同步更新的用例集才是团队真正能依赖的质量防线。测试用例设计这件事前期投入越大后期执行和排查问题的成本就越低这个账越早算明白越踏实。
返回列表