测试

通过分区的方法选择测试用例
选择合适的测试用例是一个具有挑战性但是有缺的问题。我们即希望测试空间足够小,以便能够快速完成测试,又希望测试用例能够验证尽可能多的情况。

为了达到这个目的,我们可以先将输入空间划分为几个子域(subdomains) ,每一个子域都是一类相似的数据。如上图所示,我们在每个子域中选取一些数据,它们合并起来就是我们需要的输入用例。

分区背后的原理在于同一类型的数据在程序中的行为大多类似,所以我们可以用一小部分代表整体的行为。这个方法的优点在于强迫程序相应输入空间里的不同地方,有效的利用了测试资源。

如果我们要确保测试的输出能够覆盖输出空间的不同地方,也可以将输出空间划分为几个子域(哪些输出代表程序发生了相似的行为)。大多数情况下,对输入分区就足够了

例子1: BigInteger.multiply()
现在让我们来看一个例子。 BigInteger 是Java库中的一个类,它能够表示任意大小的整数。同时,它有一个multiply 方法,能够对两个BigInteger类型的值进行相乘操作:

/**

  • @param val another BigInteger
  • @return a BigInteger whose value is (this * val).
    */
    public BigInteger multiply(BigInteger val)
    例如,计算ab的值:

BigInteger a = …;
BigInteger b = …;
BigInteger ab = a.multiply(b);
这个例子显示即使只有一个参数,这个操作实际上有两个操作符:你调用这个方法所在的对象(上面是a ),以及你传入的参数(上面是b )。(在Python中,接受方法调用的对象会显式以self被声明。在Java中你不需要声明这个对象,它隐式的被称作this )我们可以把 multiply 看成一个有两个参数的方法,参数的类型是 BigInteger ,并且输出的类型也是 BigInteger 即:

multiply : BigInteger × BigInteger → BigInteger

所以我们的输入空间是二维的,用二维点阵(a,b)表示。现在我们对其进行分区,想一想乘法是怎么工作的,我们可以将点阵初步分为以下四个区:

a和b都是正整数
a和b都是负整数
a是正整数,b是负整数
b是正整数,a是负整数
这里也有一些特殊的情况要单独分出来:0 1 -1

a或b是1\0-1
最后,作为一个认真的测试员,我们还要想一想BigInteger的乘法可能是怎么运算的:它可能在输入数据绝对值较小时使用 int 或 long ,这样运算起来快一些,只有当数据很大时才会使用更费劲的存储方法(例如列表)。所以我们也应该将对数据的大小进行分区:

a或b较小
a或b的绝对值大于Long.MAX_VALUE ,即Java原始整型的最大值,大约是2^63。
现在我们可以将上面划分的区域整合起来,得到最终划分的点阵:

0
1
-1
较小正整数
较小负整数
大正整数
大负整数
所以我们一共可以得到 7 × 7 = 49 个分区,它们完全覆盖了a和b组成的所有输入空间。然后从这个”栅栏“里的每个区选取各自的测试用例,例如:

(a,b) = (-3, 25) 代表 (小负整数, 小正整数)
(a,b) = (0, 30) 代表 (0, 小正整数)
(a,b) = (2^100, 1) 代表 (大正整数, 1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值