黑盒测试做久了你会发现,方法不在多,关键是在合适的场景用对。我平时带新人时最常被问到的就是——黑盒测试到底有哪几种方法,工作中到底怎么用?今天就结合这几年踩过的坑和实际测试经验,把5种经典黑盒测试方法从头到尾掰开揉碎讲一遍,从原理到实操再到避坑,一次说透。
这篇内容适合正在学习测试基础的人,也适合已经入行但用例设计总是靠感觉、想系统提升测试设计能力的同学。全篇不讲虚的,直接讲方法、讲案例、讲经验,保证你读完能照着做。
1. 黑盒测试到底是什么,先搞懂这几点
1.1 黑盒测试的核心思路
黑盒测试,也叫功能测试、行为测试,核心思路就一句话:把被测系统当成一个看不清内部结构的黑色盒子,我们只关心输入和输出之间的关系,不关心里面是怎么实现的。
举个例子,你往自动售货机里投了3枚硬币,按了可乐的按钮,机器吐出一罐可乐。这个过程就是黑盒测试——你验证的是“投币+选择”这个输入组合,能不能准确得到“出货”这个输出结果。至于机器内部是用了齿轮还是电机、程序是怎么判断硬币真伪的,那都不是黑盒测试要管的。
我见过不少测试新人刚入行时会犯一个认知错误,觉得黑盒测试就等同于“随便点点”。其实不是。黑盒测试的核心价值在于:它是从用户视角出发的验证手段。用户不会关心你的代码写得漂不漂亮、数据库索引建得对不对,用户只关心他输入的东西能不能得到预期结果。黑盒测试就是把这种最真实的用户视角固化成了可执行的测试用例。
黑盒测试设计方法论的价值,在于解决一个非常现实的问题:系统输入的可能性是无穷的,但你不可能无穷地测下去。比如一个登录框,用户名和密码的组合就有无限种可能。你不可能每种情况都测一遍,那要测到猴年马月去。所以就需要一些系统化的方法,用尽量少的测试用例,覆盖尽量多的有效场景,同时把高风险的漏洞区域最大程度地摸一遍。
1.2 什么时候用哪种方法?先打个底
很多人一听到黑盒测试有“5种方法”就觉得头大,担心要全部背下来。我的理解是,方法不是为了背而背的,每种方法解决的是某一类特定的测试问题。你只要搞清楚了这些问题分类,自然就知道什么时候该用什么方法。
我平时在项目里大致会这样划分使用场景:
- 要对单个输入项做遍历筛选时,用等价类划分,比如注册页面的用户名、手机号、密码这些独立的输入项。
- 要对输入边界做精准卡位时,用边界值分析,比如金额上限、字符长度限制、温度取值范围。
- 系统的行为由多个条件组合决定时,用因果图或决策表,比如优惠券系统里“用户等级+订单金额+是否会员”共同决定折扣。
- 被测对象存在多个状态、且状态之间会互相切换时,用状态转换测试,比如订单状态从待付款变成已付款、再变成已发货。
- 要验证完整业务流程是否顺畅时,用场景法,比如用户从浏览商品到下单支付再到确认收货的完整链路。
这个划分不是绝对的,实际工作中几种方法经常混着用。但如果你拿到一个功能,连第一步该用什么方法都不知道,那基本上就是这三种情况之一:需求理解不够、输入类型没分析清楚、或者纯粹是经验不足。
我建议你把这5种方法当成“工具箱”,而不是“考试大纲”。你拿到的每一个功能需求,第一件事是思考它的输入特点和行为逻辑,然后从工具箱里挑合适的组合方案来设计测试用例。
2. 五种经典黑盒测试方法拆解
2.1 等价类划分方法:最快上手的用例生成技术
等价类划分的核心思想是:把系统的输入数据按照“是否能导致相同类型的处理结果”分成若干个类别,然后从每个类别里取一个有代表性的值来测试。如果这个代表值能通过测试,那这一整类数据大概率都能通过。
这里的核心逻辑在于一个假设:同一种等价类里的数据,对被测试程序来说处理逻辑是等价的。所以测试其中一个就相当于测试了整个类别。这是所有黑盒测试方法里最基础也最高效的一种。
等价类划分分成两个大类:有效等价类(输入满足需求、程序能正确处理)和无效等价类(输入不满足需求、程序需要给出合理报错)。我见过很多新人在实际工作中只关心有效等价类,把无效等价类给漏了,结果上线后被用户用一段很奇怪的输入就搞崩了页面。无效等价类恰恰是测试里最容易发现缺陷的领域,因为很多开发只会对合法输入做处理,对非法输入的防御意识并不强。
举一个我在实际项目中做过的例子。一个用户注册页面,手机号输入框需求说明写的是“11位数字,以1开头”。用等价类划分,可以这么设计:
| 等价类类型 | 具体描述 | 代表值 | 预期结果 |
|---|---|---|---|
| 有效等价类 | 11位数字,以1开头 | 13812345678 | 校验通过 |
| 无效等价类 | 不是11位数字 | 1381234567(10位) | 提示“手机号格式错误” |
| 无效等价类 | 含非数字字符 | 1381234abcd | 提示“手机号格式错误” |
| 无效等价类 | 不以1开头 | 23812345678 | 提示“手机号格式错误” |
| 无效等价类 | 为空 | (空字符串) | 提示“手机号不能为空” |
每个有效等价类至少取一个代表值,这还不够,我建议对代表性比较强的输入额外加几组变体,比如11位数字但第二位是0的情况(实际上是某些号段不存在的),用来验证系统是否只是简单做了正则匹配而不做真实号段校验。这种额外验证不在教科书里,但实际项目里特别有用。
等价类划分看起来简单,实战中有一个很容易漏的地方:同一个输入项,在不同业务规则下可能有多个有效等价类和无效等价类。比如一个年龄输入框,需求是“0-120之间的整数”。如果只划分一个“有效等价类”,代表值取25,这显然不够。你至少要区分“0”、“120”、“中间值”这几个代表,因为边界情况对应的是完全不同的处理逻辑。这也是为什么等价类划分往往要搭配边界值分析一起用。
2.2 边界值分析:Bug高发区就在边界
边界值分析的理论基础特别朴素:大量的软件缺陷往往集中在输入范围的边界附近,而不是在范围内部。你测100个正常值都不一定会出问题,但边界上差一位数字就可能翻车。
教科书上对边界值分析的定义是:对输入或输出的边界值进行测试的一种黑盒测试方法,通常作为等价类划分的补充手段。但我更愿意把它理解成一种“邻近穷举”——把边界附近的几个关键值全部覆盖到。
我见过最经典的边界问题案例是:一个转账功能,需求规定单笔转账金额不能超过50000元。开发在实现时用了“if (amount > 50000) 报错”的校验逻辑,注意这里用的是大于号而不是大于等于号。如果测试时只测了50001元报错,没测50000元本身,这个问题就被漏掉了。而实际情况是,50000元这个值因为边界判断错误会被直接放行,后续可能引发资金异常。
边界值分析的关键在于搞清楚“上点、离点、内点”这三个概念。假设系统需求是“输入值x的取值范围为1到100”,那么:
- 上点:边界上的点,即1和100。
- 离点:离边界最近的点。这里有个细节要特别注意——对于开区间和闭区间,离点的取值逻辑是不一样的。如果是闭区间[1,100],离点就是0和101;如果是开区间(1,100),离点就是2和99。
- 内点:范围内任意一个正好落在区间内的点,比如50。
之所以要区分开区间和闭区间,是因为开发在写代码时很容易把边界判断的等于号写错。用闭区间思维设计用例,能覆盖到“等于边界值”和“稍超出边界值”两种情况,这样即使开发把大于写成了大于等于,测试用例也能捕捉到。
我在实际项目里通常会用“边界值分析五原则”来生成用例:
| 类型 | 取值 | 说明 |
|---|---|---|
| 最小值 | 1 | 边界上的最小值 |
| 略小于最小值 | 0 | 边界离点 |
| 略大于最小值 | 2 | 边界内侧 |
| 最大值 | 100 | 边界上的最大值 |
| 略小于最大值 | 99 | 边界内侧 |
| 略大于最大值 | 101 | 边界离点 |
| 正常代表值 | 50 | 内点代表 |
注意,如果你的输入是浮点数而不是整数,那“略小”和“略大”的取值就要结合精度来确定。比如金额保留两位小数,那最小值0.01的略小值就是0.00,最大值10000.00的略大值就是10000.01。如果直接用整数思维减1,就会把用例覆盖范围搞错。
2.3 因果图与决策表:解决条件组合问题
等价类和边界值分析主要解决的是单个输入项的测试问题,但实际项目里有很多功能是“多个条件共同决定一个结果”的。比如购物车结算时,最终优惠金额可能由“用户会员等级”“商品是否参与活动”“订单金额是否满减”“是否使用优惠券”四个条件共同决定。这种场景下,如果一个个条件单独测,是测不出组合逻辑漏洞的。
因果图法的思路是:找出所有输入条件(因),分析各自取值的组合,再找出对应的输出结果(果),把它们之间的逻辑关系画成一张图,然后据此设计测试用例。决策表则是把因果关系固化到一张矩阵表格里,让每个条件组合对应一组动作或结果。
我实际工作中用决策表比用因果图更多,因为决策表本身就能直接输出测试用例,不需要画复杂的逻辑图。决策表的结构分为四块:条件桩、动作桩、条件项、动作项。条件桩列出所有可能的输入条件,动作桩列出所有可能的输出结果,条件项是条件取值组合,动作项是对应条件下执行的动作。
举个我在电商项目里做过的例子,优惠券使用的业务规则是:用户是会员且订单金额超过199元时,可以使用满减优惠券;用户不是会员但订单金额超过299元时,也可以使用;其他情况不能使用。这张决策表是:
| 条件/动作 | 规则1 | 规则2 | 规则3 | 规则4 |
|---|---|---|---|---|
| 是否会员 | 是 | 是 | 否 | 否 |
| 订单金额>199 | 是 | 否 | 是 | 否 |
| 订单金额>299 | — | — | 是 | 否 |
| 使用优惠券 | 是 | 否 | 是 | 否 |
注意规则1和规则2中,会员情况下只要金额大于199就能用券,所以第三个条件“金额>299”用“—”表示不关心。决策表里的“—”是个很实用的设计,它代表“该条件下此条件取值不影响结果”,能大幅减少用例数量。
用决策表设计测试用例最大的好处是可追溯性极强。每一列规则都能直接对应出一条或多条测试用例,需求评审时拿着表去跟产品和开发对,他们看一眼就知道你有没有覆盖完整,有没有漏掉某个条件组合。
但因果图和决策表也有明显的局限性:当条件数量超过四五个时,组合数量会爆炸。4个条件每个条件2种取值就有16种组合,6个条件就是64种组合。这种情况下我一般会建议先用正交试验法做组合筛选,或者跟产品和开发确认哪些条件组合是业务上真实存在的,然后直接删掉无效组合。决策表的价值在于精确覆盖,而不是穷举所有可能。
2.4 状态转换测试:跟踪被测对象的状态变化
有些系统的功能不能用输入输出的静态逻辑来描述,而要看对象在不同事件触发下如何从一个状态迁移到另一个状态。最典型的例子就是订单系统:订单可以是待付款、已付款、已发货、已完成、已取消等状态,用户付款、商家发货、用户确认收货等事件会让订单发生状态切换。
状态转换测试的基本流程是这样的:先梳理被测对象可能存在的所有状态,再找出能触发状态改变的所有事件,然后画出状态转换图或写出状态转换表,最后覆盖每一个状态转换路径来设计测试用例。
我在实际项目中做订单状态测试时,通常会构造一张状态表:
| 当前状态 | 触发事件 | 下一状态 | 有效性 |
|---|---|---|---|
| 待付款 | 用户付款 | 已付款 | 有效转换 |
| 待付款 | 用户取消 | 已取消 | 有效转换 |
| 待付款 | 超时未支付 | 已取消 | 有效转换 |
| 已付款 | 商家发货 | 已发货 | 有效转换 |
| 已付款 | 用户申请退款 | 已关闭 | 有效转换 |
| 已发货 | 用户确认收货 | 已完成 | 有效转换 |
| 已发货 | 用户申请退货 | 退货中 | 有效转换 |
| 已完成 | 用户再次取消 | (不允许) | 无效转换 |
这里面有一个测试设计的重点经常被忽略:无效状态转换。所谓无效状态转换,就是从当前状态出发、按照业务逻辑不应该发生的状态变化。比如“已完成”的订单不应该能再被取消,“已取消”的订单不应该能再付款。测试的时候这些情况也必须覆盖到,确保系统给出正确的提示或者直接拦截。
我踩过一个特别深的坑:有一次订单状态功能上线后,有用户反馈“已取消的订单还能在待付款列表里看到,而且可以重新点付款”。排查下来发现,开发在实现状态流转时漏掉了对“已取消”这个状态的判断逻辑。后来我再做状态类功能,一定会专门设计一组“跨状态非法操作”的测试用例,比如从终态逆流回初态、跨两个状态直接跳转、重复触发同一事件等,专门用来打状态机的漏洞。
状态转换测试的覆盖标准,最简单的是“全转换覆盖”——每个有效转换至少执行一次,但如果要求更高,可以做“全路径覆盖”——从起始状态到终态的所有可能路径都走一遍。后者覆盖更全,但用例数量会多不少,需要根据项目风险来决定到底用哪种覆盖标准。
2.5 场景法:从用户操作路径出发设计用例
场景法是我个人在实际项目里用得最多的一种方法,因为它的设计思路和用户真实使用软件的路径高度一致。场景法的核心是:不是从输入条件出发,而是从用户的操作事件出发,把整个功能的操作流程串联成一条条“场景”,再针对每个场景来设计测试用例。
场景法里有四个关键概念:基本流、备选流、异常流、场景路径。基本流是从用户开始操作到最终完成目标的顺利路径,没有任何分支或错误;备选流是基本流的灰色地带,比如用户中途选择了另一个选项、走了另一条合法路径;异常流是操作中出现了错误或不符合前置条件的动作;一条完整的场景路径可能是“基本流的一部分+某个备选流+再回到基本流”的组合。
用一个手机银行转账的例子来说明。基本流是:用户登录→选择转账→输入收款人→输入金额→确认→输密码→转账成功。围绕这个基本流,可以衍生出很多备选流和异常流。
比如:用户输入收款人时选择“从通讯录选择”,这是备选流1;用户输入的金额超过了单笔限额,系统拦截,这是异常流1;用户在确认页面点击“返回修改”,这是备选流2;用户输入的密码错误,系统提示重新输入,这是异常流2;连续5次密码错误,账户被临时锁定,这是异常流3。
场景法的价值在于,它能很自然地把你从“测试单个功能点”提升到“测试完整业务流程”。很多时候单个功能点的用例全过了,但用户一操作就出问题,原因就是你只测了“点”,没测“线”。比如转账功能,单个输入框的校验都做了,但用户从登录到转账到收到回执的完整流程中,每一步之间的衔接是否顺畅、中断后能不能恢复、跨页面数据传递是否有误,这些用等价类边界值都是测不出来的,只有场景法能覆盖到。
在写场景法测试用例时,我习惯先画一张“基本流+备选流”的流程图(在测试设计文档里画,不是让你交付图),然后给每条流编号,再组合成场景。组合的原则是:基本流必须覆盖,备选流尽量分别与基本流组合覆盖,异常流一定要单独覆盖。这样生成的用例既能控制数量,又能保证业务的完整链路不被漏测。
3. 从零设计一套黑盒测试用例:以登录功能为例
3.1 需求梳理与输入域划分
前面讲了很多方法论的原理,这章我带你把登录功能作为实战案例,完整走一遍测试用例设计流程。登录功能看起来简单,但它是黑盒测试方法应用的一个很好样本,因为它的输入条件类型丰富、边界明显、还有状态转换逻辑(登录成功/失败/锁定),几乎把5种方法全占了。
先梳理需求:用户输入用户名(手机号)和密码,点击登录按钮。如果用户名和密码匹配,登录成功跳转首页;如果用户名或密码错误,提示错误信息;如果连续5次密码错误,账号锁定30分钟;锁定期内即使密码正确也不能登录。这就是一个典型的黑盒输入场景。
首先做输入域划分。用户名是手机号,需求规定11位数字、以1开头;密码是6到20位字符,支持字母、数字、特殊字符。这里分别用等价类划分和边界值分析来处理:
| 输入项 | 有效等价类 | 边界值 |
|---|---|---|
| 手机号 | 11位数字,1开头 | 最小:11位;离点:10位、12位;内点:中间值 |
| 密码 | 6-20位字符 | 最小:6位;离点:5位、21位;最大:20位 |
注意这里要用到边界值分析里“离点”的概念。比如密码最短6位,那5位的密码必须测试,6位的密码必须测试,21位的密码也要测试,20位的要测试。这些边界值往往能覆盖到开发在校验长度时最容易犯错的场景。
3.2 各方法的用例输出与合并
根据需求,可以把功能和测试方法做一个映射:
等价类划分负责用户名和密码的基本格式校验。这一部分可以做一批用例,比如“手机号格式正确+密码格式正确”“手机号格式错误”“密码格式错误”“手机号为空”“密码为空”等。
边界值分析负责长度边界。密码5位(无效)、6位(有效)、20位(有效)、21位(无效),手机号10位(无效)、11位(有效)、12位(无效),这些用例必须单独列出。
因果图或决策表负责“登录是否成功”的组合逻辑。这里要考虑用户名正确/错误、密码正确/错误、账号是否被锁定这几个条件的组合。一张简化决策表:
| 条件 | 用例1 | 用例2 | 用例3 | 用例4 | 用例5 |
|---|---|---|---|---|---|
| 用户名正确 | 是 | 是 | 否 | 否 | 是 |
| 密码正确 | 是 | 否 | 是 | 否 | 否 |
| 账号未被锁定 | 是 | 是 | 是 | 是 | 否 |
| 预期结果 | 登录成功 | 提示密码错误 | 提示用户名不存在 | 提示用户名或密码错误 | 提示账号已锁定 |
状态转换测试负责“连续失败5次锁定”的状态流转。这里我把锁定次数作为状态变量来设计用例:连续失败4次不锁定,第5次失败进入锁定状态,锁定期内尝试登录(无论密码是否正确)都提示锁定,锁定时间到期后可以正常登录。这里还涉及一个时间边界问题——锁定期是30分钟,那29分59秒时尝试登录是失败的,30分00秒时应该是成功的,这个边界值得专门做一条用例。
场景法负责完整操作路径。基本流是“打开登录页→输入正确手机号和密码→点击登录→跳转首页”。备选流是“从首页退出登录后再次登录”“登录页找回密码后再次登录”等。异常流是“登录时网络中断”“服务端返回超时”“输入密码时切换了输入法导致密码错误”等。
最后合并去重,产出的最终测试用例大概在25到35条左右。合并的时候注意一个原则:一条用例尽量只验证一个核心点,但如果多个条件必须组合才能触发结果,那就放在同一条用例里。比如“用户名正确+密码错误”和“用户名错误+密码正确”是两个不同的组合,必须分成两条用例分别验证,因为它们对用户的提示信息是不同的。
3.3 优先级排序与覆盖率评估
测试用例设计完成之后不能直接一股脑全执行,我会按风险等级把用例分成P0、P1、P2三个优先级。P0是核心主流程和核心数据正确性,比如登录成功跳转、密码正确与否的判断、连续5次锁定的限制;P1是常规功能和边界情况,比如手机号格式校验、密码长度边界;P2是异常输入和极端情况,比如非常规字符输入、网络超时恢复等。
实际执行时,P0用例必须全部跑过且通过才能进入下一轮测试,P1用例尽量全部覆盖,P2用例根据时间情况选择性执行。很多时候项目排期紧张,P2用例往往是首当其冲被砍掉的。但如果P2用例中包含了影响资金安全、用户隐私、数据一致性的场景,那就必须提升到P1甚至P0级别。
做完用例设计后,我还会做一个覆盖率自评。核心指标有三个:需求条目覆盖率(每条需求是否都有关联用例)、等价类覆盖率(每个等价类是否都有代表值)、边界值覆盖率(每条边界的上点离点内点是否都覆盖)。用这三个指标去套设计好的用例,如果发现某个需求点没有对应用例,说明设计有遗漏,需要回头补。
覆盖率自评这个习惯特别重要。我见过有的测试人员用例写了一堆,但拉个需求清单一对,发现有的需求根本没测,有的需求测了一堆重复用例。用例设计完成后做一次覆盖率核对,比执行完再发现漏测要省太多时间。
4. 常见问题与避坑经验
4.1 方法选型错误:什么时候别硬套因果图
很多测试新人学了5种方法之后,容易进入一个误区——拿到一个功能就想把每种方法都用一遍,生怕漏掉什么。这其实是本末倒置了。方法是为风险服务的,不是为流程服务的。
比如一个功能只有两三个输入条件,结果已经被需求文档写得明明白白,那就直接用等价类加边界值就好,没必要硬套因果图。因果图适合条件多、逻辑组合复杂的情况。反过来,如果功能有大量状态流转,你还在用等价类划分一条一条测,那就会漏掉状态之间非法切换的大坑。
我的经验是,拿到需求后先花10分钟做一次“方法预判”:
- 输入项是否独立:是,用等价类+边界值。
- 输入条件之间有组合逻辑:是,用因果图/决策表。
- 对象有状态流转:是,用状态转换。
- 用户操作路径复杂:是,用场景法。
大多数功能会同时命中多条,那就取交集。比如登录功能,输入项独立,命中等价类;登录逻辑有条件组合,命中决策表;锁定功能有状态流转,命中状态转换;完整流程有操作路径,命中场景法。所以登录功能合适的方法是四种混用,而不是只用其中一种。
4.2 等价类划分的陷阱:你以为有效其实无效
等价类划分看起来简单,但实际设计时有一个高频陷阱:把“系统能接受的输入”和“业务上有效的输入”混为一谈。
举个例子,一个年龄输入框,需求是“0-150之间的整数”。如果按系统能接受的输入来划分,那有效等价类是“0-150的整数”,代表值取25,无效等价类是“负数”“小数”“非数字字符”“空值”等。但如果你了解了真实业务场景——这个年龄框是在疫苗预约系统里的,那年龄不能小于0,也不能超过120(实际上超过120岁还来打疫苗几乎不可能)。那么“121-150的整数”虽然在系统层面能接受,但在业务层面属于“无效等价类”,必须单独拿出来验证系统是否有业务层面的拦截。
想避开这个陷阱,唯一的办法就是把需求吃透。拿到需求后不要只读字段校验规则,还要问产品经理:这些输入值在业务上意味着什么?业务上有没有限制?这个输入值的来源是什么?是用户手动输入还是别的系统传入的?这些信息能帮你把业务层面的有效和无效等价类划分清楚,而不是只停留在系统层面的校验规则。
4.3 边界值分析容易被忽略的细节
边界值分析看起来也不难,但实际执行时有两个细节我几乎每次都要跟项目组反复强调。
第一个细节是输出边界也要测。很多人做边界值分析只盯着输入条件,忽略了输出值也有边界。比如一个分页功能,每页显示10条数据。输入边界是页码1到页面总数,但输出边界是“第一页显示1到10条”“最后一页显示不足10条”“总数据条数刚好是10的整数倍时最后一项的显示”。这些都是输出边界的典型场景。只测输入边界不测输出边界,同样会漏掉大量缺陷。
第二个细节是外部依赖的边界也要测。比如一个导入功能,要求Excel文件不超过5MB。这个5MB就是文件大小的边界,你要准备4.99MB的文件(边界内)和5.01MB的文件(边界外)来验证。但如果只测这两条还不够——你还要测文件行数边界,比如系统限制最多导入10000行,那是行数边界,和文件大小边界是两个不同的维度。边界值分析里最容易漏的就是“同一种输入有多个不同维度的边界”。
4.4 场景法用例冗余的解决办法
场景法在设计过程中有一个比较常见的副作用——用例容易膨胀。基本流一条,备选流三条,异常流五条,组合起来一算可能二十多条用例就出来了,而且很多用例之间操作步骤高度重复,执行起来很浪费时间。
我的解决办法是在设计场景用例时先做“场景合并”。合并的原则是:多个异常流如果触发的是同一个错误处理逻辑,那就可以合并成一条通用用例,只做数据差异的扩展。比如“手机号格式错误”和“密码格式错误”虽然错误信息不同,但错误处理逻辑都是“在登录页顶部弹出红色提示条,不清空已有输入”,那这两个场景可以合并成一条“格式校验错误提示”用例,再用等价类去覆盖不同的格式错误类型。
第二个办法是严格控制“备选流和基本流的组合数量”。教科书上会把基本流和每个备选流的组合都列出来,但实际业务中很多备选流的交叉组合是用户根本不会走的路径。比如“从通讯录选择收款人”这个备选流,和“转账金额超过单笔限额”这个异常流组合在一起的可能性极低。这种低概率交叉组合我会直接砍掉,用决策表去覆盖条件组合,用场景法只覆盖主链路。两种方法各管一段,比场景法硬扛所有组合要高效得多。
另外一个值得分享的经验是:场景法用例在执行前一定要先“走查一遍”。拿着一张用例清单,找一位非测试人员(最好是产品经理或开发)按照用例步骤走一遍流程,很多时候你会发现你设计的场景里有个步骤在界面上根本不存在,或者某个前置条件无法满足。这种问题如果等到执行测试用例时才发现,往往要返工重写一整套用例,非常浪费时间。
我做测试这些年最大的体会是,黑盒测试方法不是一道道需要背诵的考题,它们是你跟软件缺陷之间博弈时手里的工具。方法学得再好,不如在真实项目里多踩几个坑、多补几个用例;反过来,如果你在真实项目里遇到过因为漏测而导致的线上问题,再回头看这些方法,你会对它们有完全不一样的理解。希望这篇文章能让你在用例设计时,少一些“不知道从哪下手”的迷茫,多一些“我知道为什么这么测”的笃定。