【冗余的思想】蜕变测试(二)
蜕变测试里的冗余思想,在硬件领域的测试设计里也有体现。因为硬件测试的计算资源往往很有限,如果测试集规模比较大,就很难逐个验证所有用例的执行结果。通常的手段,是把所有用例的预期结果进行整合,提取出一些统计特征值,以此作为整个测试集的测试准绳。集成电路领域常用的特征值,有奇偶特征值、“1”计数特征值、“1”概率特征值等等。特征值里的冗余信息,是从多个用例里来的,本质上也是一种蜕变关系。
我们举一个“1”概率特征值的例子。电路领域广泛采用随机测试,也就是在被测电路的各个输入管脚上,同时输入互相独立的随机01序列。这种随机测试的规模一般都比较大,输入输出的序列很长,我们很难有足够的资源,去校验输出序列每一个周期的结果。这时候我们就可以利用特征值,来做蜕变测试。假设被测电路如下图所示:
随机测试给每个输入管脚输入1的概率都是p,那么输出f3=1的概率应该是。这就是“1”概率特征值。用这个特征值来做测试准绳,我们就不需要去验证测试过程中每一个周期的输出,只需要把输出记录下来,最后统计一下输出f3=1的概率。
如果被测电路有问题,比如在f1的位置存在一个固定1缺陷,那么f3=1的实际概率就会是,跟特征值相差很大。这样我们就检出了缺陷。
蜕变测试还有一种特别的实施方式,即在线蜕变测试。所谓“在线”,指的就是在产品实际使用过程中开展的测试活动。一般来说,做在线测试可能有两种目的:
① 第一种,是为测试本身服务,利用实际使用环境的真实性和复杂性,更好地完成质量评估或缺陷检出。比如A/B测试,就是以质量评估为目的的在线测试;
② 另一种,是为产品可靠性服务。比如自动驾驶系统里的电路,要具备“内建自测试”的能力,系统实际运行的时候,要能够随时执行内置的测试集,确定电路有没有问题,如果发现有问题 ,就切换到备系统。有一些质量标准更高的产品,还具备“错误自修正”的能力,也就是说,不仅能发现错误,还能自动改正错误。
怎么做到这一点呢?还是靠冗余的思想。就像我们介绍过的汉明码,利用冗余信息,不仅能检错,还能纠错。在线蜕变测试,也是用来干这个的。
来看一个例子。假设我们要测试一个计算三角函数值的程序:
这个程序是用在飞机配载平衡系统里的,质量要求很高,但是留给我们的测试周期很短,尽管我们综合采用了多种充分准则,开展了尽可能全面的测试,我们仍然无法保证程序的正确性。仍然有可能,在极个别的一些测试输入点上,程序计算结果是错误的。这时候,我们可以建议项目组,给程序打一个简单的补丁,利用在线蜕变测试这种技术,让程序具备错误自修正的能力。
具体怎么做的呢?假设程序要计算sin(x):
①第一步,生成一个随机数x1,然后取x2=x-x1,实际上就是把输入值x转变成两个随机数x1和x2的和;
②第二步,调用程序分别计算sin(x1)、sin(π/2 - x2)、sin(π/2 - x1)、sin(x2)
③第三步,计算初步自修正结果yc = sin(x1) * sin(π/2 - x2) + sin(π/2 - x1) * sin(x2)。根据蜕变关系MR4 = {<d, e>|sin(x1 + x2) = sin(x1) * sin(π/2 - x2) + sin(π/2 - x1) * sin(x2)},yc应该等于sin(x)。
④把第一步到第三步重复多次,取yc的众数作为最终的自修正结果。
为什么这样就能实现错误自修正呢?我们已经知道,错误只发生在一些极个别的测试输入点上。如果只算某一个点,确实可能会算错,但是如果算很多个点,其中绝大部分的计算结果就是正确的。通过反复利用这个蜕变关系,我们可以把一个点的计算转变成很多个点的计算。这相当于从很多个点上分别提取冗余信息,再把这些信息聚合到一起,让冗余信息多到足以揭示正确的结果。这就是在线蜕变测试的原理。