从零到通关:用等价类+判定表法破解软件测试大题(附TYUT真题解析)
备考软件测试,尤其是面对那些动辄十几分的大题,很多同学会感到无从下手。书本上的理论概念背得滚瓜烂熟,一到实战,面对一段程序描述或一个业务规则,却不知道如何下笔。这背后,往往不是知识点的缺失,而是缺乏一套将理论转化为解题步骤的“操作手册”。今天,我们就以TYUT(太原理工大学)等高校软件测试课程中常见的题型为例,彻底拆解“等价类划分法”与“判定表法”这两大核心黑盒测试方法。我们不谈空泛的理论,只聚焦于如何将题目信息快速转化为得分点,并提供一套可复用的解题模板,让你在考场上也能从容应对。
1. 解题基石:彻底理解等价类划分法的实战逻辑
等价类划分法,听起来简单——不就是把输入数据分成有效和无效两类吗?但在实际解题中,很多同学会在这里栽跟头,尤其是在构造无效等价类时,要么遗漏,要么重复。我们先来澄清一个核心误区:等价类划分的目的,不是为了“分类”而分类,而是为了用最少的测试用例,覆盖最多的输入情况,从而高效地发现潜在缺陷。
一个有效的等价类,代表了一组在程序看来“待遇相同”的输入。例如,一个要求输入“1到100之间整数”的字段,所有1到100的整数都属于同一个有效等价类,因为程序对它们的处理逻辑预期是一致的(比如都接受并处理)。而无效等价类,则是那些程序应该拒绝或进行错误处理的输入,比如0、101、小数、字母等。关键在于,一个无效等价类通常只违反一条规则。
注意:在构造无效等价类时,务必遵循“单一失效”原则。如果一个测试数据同时违反了多个规则(例如,输入“-1a”既不是数字又小于1),那么它就无法清晰地定位是哪个校验逻辑出了问题,在评分时容易被扣分。
让我们通过一个TYUT风格的经典例题来实践:
例题1:某系统用户注册,用户名要求为6-18位英文字母或数字,且必须以字母开头。请用等价类划分法设计测试用例。
解题步骤拆解:
-
分析输入条件,划分等价类并编号。这是最关键的一步,需要仔细梳理所有显性和隐性的规则。
- 条件1:字符类型。有效:英文字母或数字;无效:非英文字母数字(如特殊符号、中文)。
- 条件2:长度范围。有效:6-18位;无效:小于6位,大于18位。
- 条件3:首位字符。有效:字母;无效:数字或其他字符。
基于此,我们可以构建如下等价类表:
输入条件 有效等价类 编号 无效等价类 编号 字符类型 英文字母或数字 1 包含非英文字母数字 7 长度范围 6-18位 2 长度<6位 8 长度>18位 9 首位字符 字母 3 首位为数字 10 首位为其他字符 11 这里将“字符类型”和“首位字符”分开考虑,是因为它们的校验逻辑通常是独立的。
-
设计测试用例,覆盖有效等价类。目标是用最少的用例覆盖所有有效等价类。本例中,我们可以设计一条用例:
“Abc123”(6位,字母开头,由字母数字组成)。这条用例同时覆盖了有效等价类1、2、3。 -
设计测试用例,覆盖无效等价类。原则是一条用例只覆盖一个无效等价类,并保持其他条件有效。这能确保当测试失败时,我们能精准定位是哪个规则被违反了。
- 覆盖编号7(无效类型):
“Abc@#”(6位,字母开头,但包含特殊符号)。 - 覆盖编号8(长度过短):
“Ab12”(4位,字母开头,字母数字)。 - 覆盖编号9(长度过长):
“Abcdefghij1234567890”(20位,字母开头,字母数字)。 - 覆盖编号10(首位数字):
“1bcdef”(6位,数字开头,字母数字)。 - 覆盖编号11(首位其他):
“@bcdef”(6位,特殊符号开头,字母数字)。
- 覆盖编号7(无效类型):
通过这个流程,我们不仅得到了测试用例,更构建了一个清晰的、易于评卷老师理解的答题框架。在考场上,按这个步骤书写,逻辑清晰,不易失分。
2. 进阶利器:判定表法处理多条件组合决策
当题目描述中出现“如果...则...”这类多条件组合决定多个动作的逻辑时,等价类划分法就显得力不从心了。这时,判定表法就是你的最佳武器。它通过表格化的方式,穷举所有条件组合及其对应的动作,特别适合解决业务规则清晰的测试用例设计题。
很多同学觉得判定表复杂,其实它的核心只有四个部分:条件桩(Condition Stub)、动作桩(Action Stub)、条件项(Condition Entry)、动作项(Action Entry)。我们通过一个真题变体来掌握:
例题2:订购单检查规则如下:
- 如果金额大于500元 且 未过期,则发出批准单和提货单。
- 如果金额大于500元 但 已过期,则不发出批准单与提货单。
- 如果金额小于等于500元,则不论是否过期都发出批准单和提货单。
- 在过期的情况下,不论金额大小还需要发出通知单。 请用判定表法设计测试用例。
解题步骤详解:
-
列出所有条件桩和动作桩。
- 条件桩 C1: 金额 > 500元? (是/否)
- 条件桩 C2: 订单是否过期? (是/否)
- 动作桩 A1: 发出批准单
- 动作桩 A2: 发出提货单
- 动作桩 A3: 发出通知单
-
确定条件组合数,填入条件项。有2个条件,每个条件有2种取值,理论上应有 2^2 = 4 种组合。我们列出所有组合:
规则编号 C1: 金额>500? C2: 过期? 1 是 是 2 是 否 3 否 是 4 否 否 -
根据业务规则,确定每种组合下的动作项(打√)。这是判定表的核心,需要严格对照题目描述。
- 规则1 (是,是):金额>500且过期。对应规则2:不发批准单和提货单;规则4:过期需发通知单。所以动作:A1(-), A2(-), A3(√)。
- 规则2 (是,否):金额>500且未过期。对应规则1:发批准单和提货单。所以动作:A1(√), A2(√), A3(-)。
- 规则3 (否,是):金额≤500且过期。对应规则3:发批准单和提货单;规则4:过期需发通知单。所以动作:A1(√), A2(√), A3(√)。
- 规则4 (否,否):金额≤500且未过期。对应规则3:发批准单和提货单。所以动作:A1(√), A2(√), A3(-)。
完整的判定表如下:
规则编号 条件与动作 1 2 3 4 条件桩 C1: 金额 > 500? 是 是 否 否 C2: 订单过期? 是 否 是 否 动作桩 A1: 发批准单 √ √ √ A2: 发提货单 √ √ √ A3: 发通知单 √ √ 注:表格中空白通常表示“否”或不执行该动作,也可用“-”表示。
-
检查并简化判定表(可选)。本例中规则3和规则4在A1和A2上的动作一致,但A3不同,因此无法合并。判定表已经最简。
-
根据判定表生成测试用例。判定表的每一列(即每一组规则)就是一条测试用例的输入条件和预期输出。
- 测试用例1:输入:金额=600元,状态=过期;预期输出:发出通知单。
- 测试用例2:输入:金额=600元,状态=未过期;预期输出:发出批准单和提货单。
- 测试用例3:输入:金额=400元,状态=过期;预期输出:发出批准单、提货单和通知单。
- 测试用例4:输入:金额=400元,状态=未过期;预期输出:发出批准单和提货单。
判定表法的优势在于其严谨性和完整性,它能确保所有可能的逻辑分支都被考虑到,避免用例遗漏。在考试中,画出清晰、正确的判定表,即使最后用例描述稍简,也能获得大部分分数。
3. 深度辨析:基本路径测试的“学术概念”与“解题实操”
网络热词“基本路径测试”常出现在白盒测试大题中。很多同学被其概念绕晕:独立路径、环形复杂度、McCabe公式……其实在解题层面,我们可以将其简化为一个清晰的三步流程:画控制流图 -> 算环形复杂度 -> 列出基本路径。
关键在于控制流图的画法,尤其是循环和嵌套判断的处理。一个常见的失分点是节点编号和边指向。
例题3:给定以下程序片段,请进行基本路径测试。
1. start
2. if (a > 0 && b > 0) {
3. x = a + b;
4. } else {
5. x = a - b;
6. }
7. while (x < 10) {
8. x++;
9. }
10. end
解题实操步骤:
-
绘制控制流图。将代码语句或语句块转化为节点,控制流向转化为边。
- 节点:通常一个顺序执行的语句块作为一个节点。本例可以划分为:节点1 (开始),节点2 (判断 a>0&&b>0),节点3 (x=a+b),节点4 (x=a-b),节点5 (判断 x<10),节点6 (x++),节点7 (结束)。注意,节点5(循环判断)的出边,一条指向节点6(循环体),另一条指向节点7(跳出循环)。
- 边:清晰画出所有流向。对于while循环,在循环体(节点6)执行后,必须有一条边指回循环判断条件(节点5),这是极易画错的地方。
一个简化的控制流图描述如下:
1 (Start) -> 2 (if condition) 2 (True) -> 3 -> 5 2 (False) -> 4 -> 5 5 (while condition, True) -> 6 -> 5 (循环回边) 5 (while condition, False) -> 7 (End) -
计算环形复杂度V(G)。常用公式:
- 公式1(区域数):控制流图平面划分的区域数。包括最外部的区域。上图大约有3个区域(由边围成的封闭区域)。
- 公式2(边-节点+2):
V(G) = E - N + 2。其中E是边数,N是节点数。假设我们画的图有7个节点(N=7),边数(E)需要根据实际画的图来数(例如,1->2, 2->3, 2->4, 3->5, 4->5, 5->6, 6->5, 5->7,共8条边)。则 V(G) = 8 - 7 + 2 = 3。 - 公式3(判定节点数+1):判定节点是出度>=2的节点。本例中,节点2(if)和节点5(while)都是判定节点,共2个。所以 V(G) = 2 + 1 = 3。
三种方法计算结果应一致(V(G)=3),可以互相验证。考试时推荐使用公式3(判定节点数+1),最快最不易错。
-
列出基本路径。环形复杂度V(G)=3,意味着有3条线性独立的路径。我们需要找出3条覆盖所有边至少一次的路径。
- 路径1(最短路径,不进入循环):1 -> 2(F) -> 4 -> 5(F) -> 7。 (a>0&&b>0为假,且x初始就>=10)
- 路径2(进入if真分支,不进入循环):1 -> 2(T) -> 3 -> 5(F) -> 7。
- 路径3(进入循环至少一次):可以基于路径2扩展:1 -> 2(T) -> 3 -> 5(T) -> 6 -> 5(F) -> 7。 (确保覆盖循环边)
提示:基本路径集不唯一。只要满足“独立”(每条路径至少引入一条新边)且数量等于V(G)即可。从最短路径开始构造,逐步增加未覆盖的边,是一个稳妥的策略。
将“基本路径测试”拆解为这三个机械化的步骤,就能有效化解其理论复杂性,专注于拿分。
4. 融合应用与高频易错点避坑指南
在实际考题中,特别是综合题,往往需要你灵活运用多种方法。例如,题目可能先要求用等价类划分法分析输入域,再针对某些复杂逻辑组合使用判定表法设计用例。或者,在基本路径测试中,要求你为某条路径设计具体的测试数据,这又涉及到等价类和边界值的思想。
下面,我们梳理几个必须警惕的高频易错点:
- 循环结构控制流图的画法:如前所述,循环体执行完后,必须有一条边指回循环判断节点,形成一个闭环。忘记这条回边是常见错误,会导致节点、边数统计错误,进而使环形复杂度和基本路径全部算错。
- 无效等价类构造原则:牢记“单一失效”原则。为每个独立的无效情况(类型错误、长度错误、格式错误、为空等)分别建立无效等价类。不要用一个用例去覆盖多个无效情况。
- 判定表中的“-”合并项:“-”表示此条件取值对最终动作无影响,可以合并。但合并必须谨慎,只有当在某个条件下,无论另一条件取何值,动作都完全相同时,才能用“-”合并。在考题中,除非明确要求简化,否则画出完整的判定表更保险。
- 环形复杂度的计算验证:务必用两种方法(如判定节点数+1 和 边-节点+2)交叉验证一下结果。如果不等,立刻检查控制流图是否画错,尤其是边数是否数漏或多计。
- 测试用例的完整性:一个完整的测试用例应包含三大要素:输入数据、执行步骤(有时隐含)、预期结果。在笔试中,即使题目只问“设计测试用例”,也最好将这三项写全,尤其是预期结果,这是重要的采分点。
最后,分享一个我在带学生备考时反复强调的答题模板心态:把大题当作一个“填空题”来做。题目通常已经预设了答题的步骤框架(如:1.画出等价类表;2.设计测试用例)。你需要做的,就是用自己的分析,去填充这个框架。先搭骨架(步骤标题),再填血肉(你的分析内容)。这样答题,结构清晰,重点突出,能最大程度地展现你的逻辑,也便于阅卷老师快速找到得分点。
掌握这些方法的核心逻辑与解题节奏,远比死记硬背概念有效。当你再看到测试大题时,希望第一反应不再是“这是什么”,而是“这是哪种题型,该用哪套步骤拆解”。
247



被折叠的 条评论
为什么被折叠?



