等价类划分(Equivalence Partitioning)

本文介绍了一种软件测试方法——等价类划分法。该方法通过对输入和输出值域进行划分来设计测试用例,确保全面覆盖各种有效和无效的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

等价类划分:运用的是对组件的输入值域和输出值域进行划分的模式来设计测试用例。

通过对需求文档的分析来得到这些输入值域和输出值域。这是需求文档的深度详细程度精确程度等将对输入值域和输出值域都产生巨大的影响。所以测试人员要在需求文档编写期间积极参与文档的审查工作。

该设计模式应该包括对输入值域和输出值域的划分。

(1)      每个划分出来的等价类应该包含一组值的集合或一个范围内的值。

(2)      每个等价类中,所有的值对于这个组件来说在某种程度上都是等效(价)的。

(3)      此外有效值域和无效值域都应当按照这种方式划分。

在这种模式下测试用例将执行(覆盖)各个等价类。这样的等价类包括对有效输入值域进行划分所得等价类和对无效输入值域进行划分所得的等价类。测试用例还可以被设计为用来测试那些无法被推导出的无效输出值

一个测试用例可以执行(覆盖)任意数量的等价类。每一个测试用例应当包括:

l  对于该组件的输入。

l  该用例所执行(覆盖)的等价类。

l  该用例的期望输出。

等价类设计模式的覆盖率为:

等价类划分覆盖率=(已覆盖的等价类数量/总的等价类数)×100%

已覆盖的等价类数量是指我们在测试用例设计过程中使用等价类划分所设计的测试用例集(test case suite)总共覆盖的等价类数量。总的等价类数量是指一个组件的输入值域和输出值域的所有可能的等价类的总和。


思路:先划分等价类,再设计测试用例来执行(覆盖)每个等价类。等价类将按照该组件的输入和输出域来进行划分。输入域和输出域中所有的有效值域和无效值域都将被考虑。

1、分析该组件的输入域。

先对其两个参数的有效值域进行划分。

l  0≤考试成绩≤80

l  0≤平时成绩≤20

然后对这两个参数的其无效值域进行划分。

l  考试成绩<0

l  考试成绩>80

l  平时表现<0

l  平时表现>20

(当然可能碰到误输入小数点或一些字母、符号等非数字的字符组合。于是在这两个参数的输入域中还划分出以下无效值域。)

l  考试成绩=带小数的浮点数。

l  考试成绩=非数字的字符组合。

l  平时表现=带小数的浮点数。

l  考试成绩=非数字的字符组合。

2、下面来分析一下该组件的输出域。

先对其输出域的有效值域进行划分。

l  80≤总分≤100          将输出  A’(优秀)

l  60≤总分<80              将输出  B’(良好)

l  50≤总分<60            将输出  C’(补考)

l  0≤总分<50                将输出  D’(重修)

l  100<总分                  将输出  error message’(错误信息)

l  总分<0                     将输出  error message’(错误信息)

在此,

总分=考试成绩+平时表现。

(“error message”(错误信息)也在输出域的有效值域之列。这是因为组件的设计文档中已经指明输入的考试成绩与平时表现如果超出其有效值范围,则该将返回一个错误信息(error message)的提示信息。)

以上6种情况之外的输出就是无效输出了。一般来说未在组件设计文档中描述的无效输出比较难被界定出来的。但是一旦测试人员在使用该组件时遇到或界定出某一无效输出时就应当要求开发人员将其加入设计文档,并在新的版本中将其实现。

本例中输出域的无效值域划分为以下等价类。

l  output=null”等效于输入的两个参数皆为null

l  output=float input”等效于输入参数至少有一个是浮点数

l  output=non-numberic input”等效于输入参数至少有一个是非数字

3、总结一下所有的等价类划分。

l  0≤考试成绩≤80
l  80≤总分≤100          将输出  A’(优秀)

l  60≤总分<80            将输出  B’(良好)

l  50≤总分<60            将输出  C’(补考)

l  0≤总分<50             将输出  D’(重修)

l  100<总分               将输出  error message’(错误信息)

l 总分<0                 将输出  error message’(错误信息)

l  output=null”等效于输入的两个参数皆为null

l  output=float input”等效于输入参数至少有一个是浮点数

l  output=non-numberic input”等效于输入参数至少有一个是非数字

4、设计测试用例来覆盖以上的各个等价类,此时采用逐个覆盖的方法。使我们设计出的用例和被其覆盖的等价类之间的关系显得非常清晰。

1)以下用例是对输入参数与考试成绩相关的等价类进行覆盖

输入参数-考试成绩相关的等价类

注:其中平时表现被设定为任意的有效值15 。

2)以下用例是对输入参数与平时表现相关的等价类进行覆盖

输入参数-平时表现相关的等价类

注:其中考试成绩被设定为任意的有效值70。

3)以下用例是对输入参数的其它无效值域相关的等价类进行覆盖

输入参数的其它无效值域相关的等价类

注:以上带*的输出结果都未在组件设计文档中详细描述。

4)以下用例是对输出域的有效值域的等价类进行覆盖

输出域的有效值域的等价类

5)以下用例是对输出域的无效值域的等价类进行覆盖

输出域的无效值域的等价类

注:以上带*的输出结果都未在组件设计文档中详细描述。

说明:回顾我们设计的测试用例发现,许多用例比较相似。例如007017,不同的只是它们被设计的目的是为了覆盖不同的等价类。仔细观察测试用例还可以发现以上私企测试用例都涵盖了2个输入值和一个输出值。意味着每个用例实际上覆盖了3个等价类:两个输入域的等价类和一个输出域的等价类。下面就来尝试

缩小以上用例的集合

注:以上带*的输出结果都未在组件设计文档中详细描述。

逐个覆盖法和最小集合法才能覆盖所有的等价类。不同的是,逐个覆盖法需要更多的测试用例。而运用最小集合法时,如果测试用例全部通过,则等效于所有等价类都顺利地通过了测试,但是一旦出现了某个或多个用例未通过的情况,我们就必须设计运行更多的测试用例以定位出现缺陷的等价类。

通常来说,分析组件的设计文档、界定并划分等价类的时间远高于产生测试用例和执行测试所花的时间,所以经过初步分析,最小集合法一般不能大量减少测试用例,则一般都直接采用逐个覆盖法所产生的测试用例的集合。


数据结构等价类划分Equivalence Class Partitioning)是一种软件测试技术,它将所有可能的输入划分为一组组相似的子集,每个子集称为一个等价类。这种划分有助于确定哪些输入值得特别关注,因为它们代表了一类可能的行为。 在C语言中实现数据结构等价类划分通常涉及以下几个步骤: 1. 定义等价类:根据程序的需求和预期行为,确定输入值的不同类别。例如,整数数组的长度、字符数组的字符范围等。 2. 选择测试用例:为每个等价类选择至少一个代表性输入(边界值、典型值或异常值),以便覆盖各种可能情况。 3. 编写测试代码:为每个选择的测试用例编写相应的C代码,包括输入生成和处理。 例如,如果你正在测试一个字符串处理函数,可能的等价类包括: - 空字符串 - 长度为0的字符串 - 长度为1的字符串 - 一般长度的字符串 - 边界长度(如最大长度或最小长度) - 包含特殊字符的字符串 - 全数字字符串 ```c // 示例代码 #include <stdio.h> #include <string.h> void process_string(char* str) { // ...实际处理函数... } int main() { // 测试用例 char test_cases[] = { "", "a", "abc", "long_string", MAX_LENGTH, "special_chars@123", "123456789" }; int num_tests = sizeof(test_cases) / sizeof(test_cases); for (int i = 0; i < num_tests; i++) { process_string(test_cases[i]); printf("Test case %d: ", i); // 打印处理结果或检查错误 } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值