功能测试实验全流程:等价类划分与边界值分析实战
2026/9/19 14:19:55 网站建设 项目流程

简介:这份PDF面向软件工程、软件测试方向的初学者与实验课学生,系统梳理软件功能测试的完整流程与黑盒测试核心方法,帮助读者理解如何依据需求规格说明书设计并执行测试。内容围绕等价类划分与边界值分析法展开,涵盖有效/无效等价类的划分原则、边界条件的识别与用例设计,并延伸至因果图法与决策表法在复杂逻辑场景中的应用,同时涉及测试需求编写、测试计划制定、缺陷报告与测试报告等文档规范。资源包共1个PDF文件,大小约220KB,内容精炼便于课堂对照与复习。目前已有87人学习。读者可借此掌握从需求理解、用例设计到缺陷记录与报告输出的实践路径,为软件质量保证工作打下基础。

1. 从一份实验包说起:t0305 样品库与黑盒测试的真实工作流

很多人第一次接触功能测试,是从一份叫「功能测试实验.rar」的压缩包开始的。解压后得到 t0305 和 T0305M 两个文件夹,前者是待测样品程序,后者是文档模板库。这看起来像课堂作业,但它复刻的其实是软件评测机构里真实的功能测试流程:读需求规格说明书、熟悉程序、写测试需求与计划、设计用例、执行并记录、提缺陷报告、出测试报告。整条链路里,真正决定测试质量的是用例设计方法,而这份实验指定的核心手段只有两个——等价类划分和边界值分析。它们都属于黑盒测试,即不关心代码内部结构,只依据规格说明从输入输出角度验证功能。如果你正在准备软件评测师、软考,或者刚入行做功能测试,这套流程值得完整走一遍,因为它是后面因果图、决策表乃至自动化用例设计的地基。

2. 等价类划分:从需求规格到可执行用例

2.1 有效等价类与无效等价类的划分逻辑

等价类划分的核心假设是:同一类输入在程序内部走的是同一条处理路径,因此每类只需取一个代表值即可。有效等价类验证程序是否实现了规格说明预先规定的功能和性能;无效等价类则检查实现是否有不符合规格说明要求的地方。这两类必须同时设计,只测有效等价类是新手最常见的漏项——程序对合法输入返回正确结果,不代表它对非法输入有正确的拒绝或提示。

划分时通常遵循四条原则:按区间划分、按数值划分、按数值集合划分、按限制条件或规则划分。以热词里反复出现的「0-2000 且是 100 倍数」为例,这是一个典型的区间加规则约束:区间是 [0, 2000],规则是必须为 100 的整数倍。有效等价类可以取 100、500、2000;无效等价类则要覆盖小于 0、大于 2000、以及区间内但非 100 倍数的值,比如 150、1234。

2.2 用表格把等价类落到用例

设计阶段我一般先画一张等价类表,再据此派生用例,这样评审时能一眼看出覆盖是否有缺口。下面这张表对应上面那个「0-2000 且为 100 倍数」的输入条件:

编号输入条件有效等价类无效等价类
1取值范围0 ≤ x ≤ 2000x < 0;x > 2000
2倍数规则x % 100 == 0x % 100 != 0
3数据类型整数小数、字母、空

有了这张表,用例就是按编号组合取值。注意无效等价类一次只覆盖一个缺陷,不要把「x < 0」和「x 非 100 倍数」塞进同一条用例,否则执行失败时无法判断是哪个条件触发的。

2.3 在 t0305 上执行并记录结果

样品程序安装后从开始菜单启动 T0305.exe,界面就是被测对象。执行时按用例逐条输入,记录实际输出与预期输出是否一致。下面是一段用 Python 模拟等价类取值并生成用例清单的脚本,实际实验中可以拿它批量产出输入数据,再手工录入样品程序:

# 依据等价类表生成测试输入,boundary 与 equivalence 分开管理 def gen_equivalence_cases(): cases = [] # 有效等价类:区间内且为 100 倍数 for v in [0, 100, 500, 1000, 2000]: cases.append({"value": v, "type": "valid", "expect": "接受"}) # 无效等价类:越界 for v in [-1, -100, 2001, 5000]: cases.append({"value": v, "type": "invalid_range", "expect": "拒绝"}) # 无效等价类:区间内但非 100 倍数 for v in [150, 1234, 1999]: cases.append({"value": v, "type": "invalid_multiple", "expect": "拒绝"}) return cases for c in gen_equivalence_cases(): print(f"输入={c['value']:>5} 类别={c['type']:<16} 预期={c['expect']}")

这段脚本把三类输入分开存放,type字段直接对应等价类编号,方便后续统计覆盖率。expect是预期结果,执行时和样品程序的实际反馈比对。参数上唯一需要按实际规格调整的是区间上下限和倍数,如果样品换成其他约束,改这两个常量即可。

提示:无效等价类的预期结果要写清楚是「拒绝」「报错」还是「提示后返回」,规格说明书没写明的,先按合理行为记录,再在缺陷报告里标注为待确认。

3. 边界值分析:为什么错误总藏在边缘

3.1 边界条件的类型与选取规则

边界值分析是等价类划分的补充,因为大量缺陷恰恰出现在等价类的边缘而非中间。边界条件就是软件计划的操作界限所在的边缘条件,可能涉及数值、速度、字符、地址、位置、尺寸、数量等数据类型。选取时要考虑这些特征:第一个/最后一个、最小值/最大值、开始/完成、超过/在内、空/满、最短/最长、最慢/最快、最早/最迟、最高/最低、相邻/最远。

对区间 [0, 2000],标准做法是取 min-1、min、min+1、max-1、max、max+1,即 -1、0、1、1999、2000、2001。如果规格还要求 100 倍数,边界点本身 0 和 2000 是合法的,但 1 和 1999 会同时触发「非倍数」缺陷,这时要单独标注,避免和纯边界缺陷混淆。

3.2 边界值与等价类的组合策略

实际项目里我不会把两者割裂,而是先做等价类划分,再对每个等价类的边界补边界值用例。这样既保证覆盖,又不会用例爆炸。下面这张表是组合后的结果:

用例编号输入值覆盖方法预期结果
TC-010边界值(min)接受
TC-021边界值(min+1)拒绝(非倍数)
TC-03100等价类(有效)接受
TC-041999边界值(max-1)拒绝(非倍数)
TC-052000边界值(max)接受
TC-062001边界值(max+1)拒绝(越界)
TC-07-1边界值(min-1)拒绝(越界)

3.3 执行、记录与缺陷报告

执行阶段按用例逐条跑,记录实际结果。发现不一致就生成缺陷报告,内容至少包含:缺陷编号、关联用例、重现步骤、实际结果、预期结果、严重程度。重现步骤要精确到输入值和操作顺序,比如「启动 T0305.exe,在输入框键入 2001,点击计算,界面返回正常结果而非越界提示」。严重程度按影响面定:功能不可用为高,提示文案错误为低。

下面这段脚本把边界值和等价类用例合并输出为 CSV,可直接导入测试管理工具:

import csv cases = [ ("TC-01", 0, "boundary_min", "接受"), ("TC-02", 1, "boundary_min+1", "拒绝"), ("TC-03", 100, "equivalence_valid","接受"), ("TC-04", 1999, "boundary_max-1", "拒绝"), ("TC-05", 2000, "boundary_max", "接受"), ("TC-06", 2001, "boundary_max+1", "拒绝"), ("TC-07", -1, "boundary_min-1", "拒绝"), ] with open("test_cases.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["用例编号", "输入值", "覆盖方法", "预期结果"]) writer.writerows(cases) print("已生成 test_cases.csv,共", len(cases), "条用例")

覆盖方法字段是给评审用的,能直接看出每条用例对应哪种设计技术。encoding="utf-8"是为了中文表头不乱码,导入 Excel 或测试平台时不会出问题。

注意:边界值用例执行失败时,先确认是边界本身的问题还是倍数规则的问题,两者混在一起会让缺陷定位变慢。

4. 因果图与决策表:T0305M 拓展实验的进阶打法

4.1 因果图法处理输入组合

当输入条件之间存在逻辑关系(与、或、非)时,等价类和边界值就不够用了,T0305M 拓展实验引入的因果图法正是为此。因果图把输入条件当作「因」,输出结果当作「果」,用连线表示约束关系。比如「输入合法 且 余额充足」才「允许提交」,这种组合逻辑用因果图能直观列出所有可能路径,避免遗漏。

画因果图的步骤是:先列出所有因和果,再标注约束(互斥、包含、唯一、要求),最后转成判定表。常见做法是先画草图,再逐条转成决策表的条件桩和动作桩。

4.2 决策表把逻辑转成用例

决策表把条件和动作以表格呈现,每一列就是一条用例。下面是一个简化示例,对应「输入合法 + 余额充足」两个条件:

规则1234
输入合法YYNN
余额充足YNYN
允许提交
提示余额不足
提示输入非法

四条规则覆盖了全部组合,每条规则派生一条用例。和等价类相比,决策表的优势在于它强制你考虑条件之间的交互,而不是孤立地测每个输入。

4.3 从决策表到文档交付

T0305M 文件夹里的模板覆盖了测试需求、测试计划、测试用例、缺陷报告、测试报告五类文档。拓展实验的步骤和课堂实验一致,只是用例设计方法换成因果图和决策表。交付时我一般把决策表直接嵌进测试用例文档,作为用例来源的说明,评审时能追溯每条用例的设计依据。测试报告则汇总执行情况:用例总数、通过数、失败数、缺陷分布,以及未覆盖项的原因说明。

提示:决策表的规则数随条件数指数增长,条件超过 4 个时先做约束合并,否则用例会失控。

5. 让用例真正可复现:参数化与回归验证技巧

等价类和边界值用例写完后,真正的痛点是回归。样品程序改一版,手工重跑几十条用例既慢又容易漏。我的做法是把用例参数化,输入值和预期结果抽成数据文件,执行逻辑单独写,这样换版本只需重跑脚本。下面这段代码把前面的用例数据外置,并加了简单的断言校验:

import csv def run_case(value, expect): # 这里替换为实际调用样品程序或接口的逻辑 actual = "接受" if 0 <= value <= 2000 and value % 100 == 0 else "拒绝" return actual == expect with open("test_cases.csv", encoding="utf-8") as f: reader = csv.DictReader(f) passed = failed = 0 for row in reader: ok = run_case(int(row["输入值"]), row["预期结果"]) status = "PASS" if ok else "FAIL" if ok: passed += 1 else: failed += 1 print(f"{row['用例编号']} 输入={row['输入值']:>5} {status}") print(f"通过 {passed} 条,失败 {failed} 条")

run_case里的判断逻辑是模拟样品程序的行为,实际使用时替换成对 T0305.exe 的调用或接口请求。DictReader按表头读取,字段名和 CSV 保持一致即可。这样每次回归只需更新数据文件,执行逻辑不动。

验证方法上,除了看通过率,还要检查覆盖完整性:有效等价类是否每个都至少一条用例,无效等价类是否每个缺陷单独覆盖,边界点是否 min-1 到 max+1 齐全。一个实用技巧是把用例编号和等价类编号做映射,跑完后统计哪些等价类没有对应用例,缺口一目了然。缺陷报告里的重现步骤也要参数化描述,写「输入 2001」而不是「输入一个越界值」,这样任何人拿到报告都能精确复现。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询