前言
大量错误都发生在输入或输出的边界上,所以,测试边界值,可以有效发现这类错误。边界值分析,结合等价类,分析需求规则,写出边界值:最小值、小于最小值、最大值、大于最大值。
1.1 为什么要边界值分析
长期测试经验表明,大量错误发生在输入或输出范围的边界上,而不是在输入范围的内部。研究表明,边界相关错误占所有软件缺陷的15-25%。边界值分析(BVA)能有效发现这类错误,提高测试覆盖率,同时减少测试用例数量。它特别适用于数值输入、字符串长度限制、数组索引等场景,是黑盒测试中不可或缺的技术。
看看下面的代码有错误吗?
下面为java代码,数组下标是从0开始的,最大小标等于长度-1,所以,i<=10是错误的,i最大为9,应该为i<10.
java
int data[] = new int[10];
for(int i=1; i<=10; i++) {
data[i] = i + 1; }
输入或输出的边界最容易产生错误。
1.2 什么是边界值分析
边界值分析(Boundway Value Analysis, BVA)是一种测试技术,专注于测试输入/输出范围的边界条件。BVA选取边界值和边界附近的值作为测试数据,通常包括最小值(min)、略高于最小值(min+)、正常值(nom)、略低于最大值(max-)和最大值(max)五种典型值。
与等价类划分的区别:
(1) 边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试数据。
(2) 边界值分析不仅考虑输入条件,还要考虑输出产生的测试情况。
1.3 什么是边界值
边界值(Boundary Value)是软件测试中的核心概念,指在输入或输出范围的边缘附近容易引发缺陷的特定值。其原理基于程序在处理边界时易出错的特点,常用于黑盒测试。
1.4 边界值类型
1.4.1 单缺陷假设边界值(Single Fault Assumption)
定义:假设系统中某个缺陷通常由单个输入变量的边界值引发,因此在设计测试用例时,每次只改变一个变量的边界值,其他变量保持正常值。
特点与适用场景
用例数量少:假设多个变量不会同时处于边界,减少组合爆炸问题。
效率高:适用于输入变量较多且相互独立的情况。
常见于常规测试:如功能测试、黑盒测试。
设计规则
每个变量取 最小值、略高于最小值、正常值、略低于最大值、最大值。
1.4.2 多缺陷假设边界值(Multiple Fault Assumption)
定义:假设缺陷可能由多个变量同时处于边界引发,因此测试用例需覆盖所有变量边界的组合。
特点与适用场景
用例数量激增:变量越多,组合数呈指数增长(如3变量→5^3=125个用例)。
覆盖更全面:适用于关键系统或高可靠性要求的场景(如航空航天、金融系统)。
成本高:需权衡测试资源与覆盖率。
设计规则
所有变量的边界值需 全组合覆盖。
1.4.3 特殊边界值类型
除了单/多缺陷假设,某些场景下还需关注以下边界类型:
(1) 时间边界
特点:日期、时间相关的临界点。
示例:
月末最后一天(如2月28日/29日)→ 3月1日。
系统日志在23:59:59→00:00:00时的处理逻辑。
(2) 状态边界
特点:系统状态转换的临界条件。
示例:
电池电量从5%降到4%触发低电量警告。
用户权限从“普通用户”升级为“管理员”的阈值。
(3) 数据容量边界
特点:存储或传输数据的极限容量。
示例:
上传文件大小限制为100MB → 测试99MB、100MB、101MB。
数据库字段长度限制为255字符 → 测试254、255、256字符。
(4) 循环边界
特点:循环次数或索引的起始/结束点。
示例:
数组索引从0开始 → 测试索引0和最大值(如array[length-1])。
循环执行N次 → 测试N=0、N=1、N=最大值。
1.5 边界缺陷示例
当输入-99和99时,应该正确计算,不报错,但是下面代码少了等于号,导致报错。
if not (-99 < num1 < 99) or not (-99 < num2 < 99):
QMessageBox.warning(self, '错误', '输入的参数值必须大于等于-99同时小于等于99')
return
1.6 边界值分析的思想与步骤
使用边界值分析方法设计测试用例,首先应确定边界情况。通常输入和输出等价类的边界,就是应着重测试的边界情况。应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据.
(1) 分析需求,找出边界;
(2) 写出边界值:最小值、小于最小值、最大值、大于最大值。
1.7 边界值分析原则
基于边界值分析方法选择测试用例的原则:
(1) 如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。
例如,如果程序的规格说明中规定:“重量在10公斤至50公斤范围内的邮件,其邮费计算公式为……”。作为测试用例,我们应取10及50,还应取10.01,49.99,9.99及50.01等。
(2) 如果输入条件规定了值的个数,则用最大个数,最小个数,比最小个数少1,比最大个数多1的数作为测试数据。
比如,一个输入文件应包括1~255个记录,则测试用例可取1和255,还应取0及256等。
(3) 将规则(1)和(2)应用于输出条件,即设计测试用例使输出值达到边界值及其左右的值。
例如,某程序的规格说明要求计算出“每月保险金扣除额为0至1165.25元”,其测试用例可取0.00及1165.25、还可取一0.01及1165.26等。
再如一程序属于情报检索系统,要求每次”最少显示1条、最多显示4条情报摘要”,这时我们应考虑的测试用例包括1和4,还应包括0和5等。
(4) 如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。
(5) 如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。
(6) 分析规格说明,找出其它可能的边界条件。
1.8 边界值分析案例
两位数加法计算器的边界值,范围[-99,99]。
写出边界值:-99、-100、99、100。
1.9 边界值分析练习
使用边界值分析方法写测试点。
(1) 输入A-Z之间的字母。
(2) 输入0-9之间的数字。
(3) 输入一个整数。
(4) 输入一个-99到99直接的整数。
1.10边界值分析练习题讲解
0-9之间的数字,数据类型可以为char、int、byte。
需要了解它的开发语言以及使用的数据类型。
比如,输入3,用char(0对应ASCII码48,9为57),3存的是48+3=51。
如果用int,3存的就是3.
1.10.1 测试知识的储备
(1) Z可能的编码方式。
if ( bl >= ‘A’ && bl <= ‘z’)
if ( bl >= 65 && bl <= 90)
if ( bl > 64 && bl < 91)
(2) 0-9可能的编码方式。
if( bl >= ‘0’ && bl<=’9’)
if (bl >= 0 && bl <= 9)
(3) 一个整数可能的编码方式:
if ( bl >= -32768 && bl<= 32767)
(4) -99到99可能的编码方式:
if (bl >= -99 && bl <= 99)
1.10.2 习题讲解
(1) 输入A-Z之间的字母。
需求分析:字母按ASCII码存储,A为65,Z为90。找ASCII码为64和91对应的字符:@和【。
边界值:@、A、Z、【。
(2) 输入0-9之间的数字。
需求分析:char类型按ASCII码存储,0为48,9为57.找出ASCII码为47和58的字符:/和:英文冒号。int类型直接按字面值存储。
边界值:char类型为:/、0、9、:。int类型:-1、0、9、10。
(3) 输入一个整数。
需求分析:使用java的byte存储。范围[-127,128]。
边界值:-128、-127、128、129。
(4) 输入一个-99到99直接的整数。
需求分析:使用java的byte存储,byte范围[-127,128]。
边界值:-100、-99、99、100。