测试的五个基本问题

我们常常说:做测试不难,把测试做好很难。为什么说做测试不难呢?因为确实有一些测试,看起来就是鼠标点点点,手机划划划,对测试人员的能力要求并不高。那为什么又说,把测试做好很难呢?因为要想在现实的资源约束下,比较好地实现“评估质量”和“检出缺陷”的目标,就会遇到很多困难。

我们把这些困难,归结为测试的五个基本问题:正确性判定问题、测试完整性问题、测试选择问题、测试可信性问题、测试准绳问题。这就是伫立在我们面前的五座高山,每一个山头都是世纪难题。从二十世纪下半叶至今,多少测试者前赴后继殚精竭虑,仍然没有人敢说已经征服了其中任何一个山头。接下来,我们就逐个来眺望一下这几座高山。

一、正确性判定问题

如果被测对象的现实与理想完全一致,我们就说被测对象是“正确”的。所有人都希望被测对象是正确的,我们也希望通过测试,能给出“被测对象正确”这么一个结论。因为这个结论非常掷地有声。而且,在航空航天、军工、核工业等一些安全攸关的领域里,就是会明明白白地要求被测对象是正确的。关键是,怎样才能确定理想和现实是完全一致的呢?这就是正确性判定问题。

基本上,我们是在具体事件中来观察理想和现实的。比方说我们要测试一个程序,程序的理想是“正确计算正整数的算数平方根”。怎么测呢?我们会给程序输入一个正整数,比如4,这就是一个具体事件。在这个事件里,理想的输出结果是2,如果实际的输出结果也是2,那理想和现实就是相符的。

但是,只看这一个事件是远远不够的。“正确计算正整数的算数平方根”,跟这个理想有关的具体事件有无穷多个。我们把跟一个理想有关的、所有可能的具体事件集合叫做“测试输入空间”。被测对象在整个测试输入空间上的预期表现,才是“理想”的全貌;在整个测试输入空间上的实际表现,才是“现实”的全貌。

所以,如果我们想判定现实和理想是不是完全一致,我们就需要考察测试输入空间中所有的点,看是不是在每一个点上,实际输出结果都跟预期输出结果一样。然而,测试输入空间的规模一般都非常庞大,在实际的资源约束下,要考察所有的点,经常是不现实的。这就是正确性判定问题的困难所在。

二、测试完整性问题

还是举刚才的例子,一个程序的理想是“正确计算正整数的平方根”,这个理想的测试输入空间是什么?所有正整数的集合?实际上并不全面。我们仔细想一想,影响这个程序行为的,真的只有输入数据吗?操作系统有没有影响?其实是有的,程序在windows系统、mac系统、linux系统上执行的结果,很可能是不一样的。虽然理想里面没有明说,但是操作系统确实是一个隐含的影响因素,如果我们忽略了这个因素,或者忽略了这个因素的某些可能的取值,我们就没办法看到理想的全貌。

所谓测试完整性问题,指的就是,我们应该如何挖掘出与理想有关的、所有可能的具体事件,从而完整地建立起被测对象的测试输入空间?

测试输入空间不完整,会导致什么后果?我们对测试人员的考核指标里,最重要的一条就是生产故障泄漏。为什么会出现生产故障泄漏?如果确实是测试人员的责任,那主要有两种可能的情况:一种,我们其实考虑过故障的这种场景,用例库里也有这个用例,但是因为这次测试时间太少,就没执行这个用例;另一种,是我们压根就没想到还有这么一种场景。这两种情况,显然后者会让我们更扎心。所以,测试完整性问题,是我们必须要重视的一个基本问题。

三、测试选择问题

前面我们说过,测试输入空间的规模经常是非常庞大的,我们的测试资源又很有限,只能从测试输入空间里选取一部分事件当做测试用例。

测试选择问题就是,应该选哪些?选哪些,才能既满足资源约束,又能最大限度地达成测试目标?

这个问题,是测试设计领域的“顶流”,大量研究和实践成果,都是针对这个问题提出的。在ACM上检索测试选择问题,可以看到相关的论文非常多,而且到现在还在逐年增加:

之所以如此,是因为测试选择集中体现了测试设计的弹性和开放性,容易形成百花齐放的局面。

可以说,“测试选择问题”跟“测试完整性问题”,代表了测试设计的两个相对的去向:“测试完整性问题”关注如何扩展测试的范围,而“测试选择问题”关注如何压缩测试的范围。

四、测试可信性问题

我们说过,“质量”是理想与现实的相符程度。为了给出一个可信、可靠的质量评估结论,我们一方面需要看清理想,另一方面需要看清现实。可是这两件事其实都很困难。

首先,理想经常是比较抽象的,而我们能够观察的,都是具体事件中、具象的质量特性。比如被测对象是一辆汽车,理想是“提供足够的安全性保障”,这就是一个很抽象的理想。

那我们怎么测试呢?我们一般会根据可用的资源,选择一些具体的场景,观察这台车在某些方面的安全表现——比如在湿滑道路上,百公里刹车距离是多少,以及刹车过程中能不能保持转向能力,等等。但是,刹车表现就能完全代表安全性吗?并不能。其实我们还应该做碰撞测试、做麋鹿测试,但是可能成本上不允许。这里就出现了“失真”:本来我们想观察的,是“提供足够的安全性保障”这样一个抽象的理想,可在实际的测试中,我们观察的只能是刹车方面的具体表现。这就像对一个连续信号做采样,如果采样频率不满足采样定理,采样结果就不能反映连续信号的本来面貌。

看清理想很难,就像我们都知道自己不想要什么,却总是搞不清自己想要什么。

其次,看清现实也很难。我们说过,被测对象在整个测试输入空间上的实际表现,才是“现实”的全貌。但是在资源约束下,我们一般只能从测试输入空间中选择一部分具体事件作为测试用例,观察它们的实际结果。所以,我们看到的,并不是完整的现实。这就是荀子说的“凡人之患,蔽于一曲,而闇于大理”,意思就是人容易被局部蒙蔽,而看不到整体。

理想与现实都很难看清,我们也就很难给出一个特别确切的质量评估结论。通常我们给出的都是“测试通过”、“符合XX标准”这样的结论。实际上,这样的结论是非常含糊的,并没有体现出理想和现实的相符程度;这样的结论甚至是容易产生误导的,容易让人认为,既然通过了测试,那被测对象就应该没问题了。那么,我们究竟应该用什么方式给出质量评估结论,才能让这个结论更科学、更可靠、更可信?这就是测试可信性问题。

五、测试准绳问题

瓦工在垒墙的时候,一般都是先拉一条水平线,然后比照这条线来砌砖,这条水平线就是准绳。

吕氏春秋里有这样一句话:欲知平直,则必准绳。这说的就是准绳的作用。

在测试设计里,我们也需要这样一条准绳,来衡量理想与现实是不是相符。因为我们是通过执行测试用例来观察理想和现实的,所以我们就把测试用例的预期结果叫做测试准绳。测试准绳问题指的就是,怎样在理想的基础上,给测试用例找到明确的、合适的预期结果?

这个问题的难点在哪儿呢?有两个方面:

① 一方面,理想很可能是模糊的:还是用刚才举过的例子,一辆汽车的理想是“提供足够的安全性保障”,这就是一个很模糊、很抽象的理想。而测试用例的预期结果必须是具象的、可直接观察的,比如百公里刹车距离。问题是,百公里刹车距离是多少才算足够安全呢?理想并没有直接告诉我们。

再举一个例子。科幻小说《银河系漫游指南》里,讲了这么一个故事:外星的智慧生物老鼠建造了一部超级电脑,名字叫做深思,深思的功能有点像chatGPT,能跟人聊天,回答各种问题。老鼠们问深思:“生命、宇宙以及万物的终极答案到底是什么?”经过了整整750万年的计算之后,深思告诉老鼠的后代,答案是42。为什么呢?深思解释不了,这也跟ChatGPT一样。要解释为什么,需要用另一部更高智能的电脑,这部电脑就是地球……

我们来想一个问题,如果深思是我们的被测对象,它的理想是能正确回答各种问题。这也是一个特别模糊的理想。然后我们选择的测试用例就是老鼠们问的问题:“生命、宇宙以及万物的终极答案到底是什么?”那么,我们怎么确定这个用例的预期结果?

② 另一个方面,理想又经常是沉重的:当我们根据理想去设定测试用例预期结果的时候,可能会发现,要想验证实际结果跟这些预期结果是不是相符,成本会非常高。比方说,要想验证一台车是不是提供了足够的安全性保障,我们要做碰撞测试:

碰撞测试里需要采集很多信息,需要在车内车外布置很多传感器和摄像机。一个传感器,成本差不多要1万;一个高速摄像机,成本5万;一个碰撞测试用的假人,成本一百万;做一次碰撞测试要撞正面、侧面、背面、25%偏置,要撞好几台车,成本少说也要上百万。观察理想的成本太高,这是测试准绳问题的另一个方面。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值